
    -ig                     4   S r SSKrSSKJrJr  SSKrSSKJr  SSK	J
r
JrJrJr  SSKJr  SSKJrJrJr  SS	KJrJrJrJr  SS
KJrJr  SS/rS rS rS rS r S#S jr!S r"S r#\" S/S/S/S/S.SS9 S#SSSSSSSSSSSSS .S! jj5       r$ " S" S\\\
5      r%g)$z
Python implementation of the fast ICA algorithms.

Reference: Tables 8.3 and 8.4 page 196 in the book:
Independent Component Analysis, by  Hyvarinen et al.
    N)IntegralReal)linalg   )BaseEstimatorClassNamePrefixFeaturesOutMixinTransformerMixin_fit_context)ConvergenceWarning)as_float_arraycheck_arraycheck_random_state)IntervalOptions
StrOptionsvalidate_params)check_is_fittedvalidate_dataFastICAfasticac                 n    U [         R                  R                  XSU R                  USU /5      -  n U $ )aU  
Orthonormalize w wrt the first j rows of W.

Parameters
----------
w : ndarray of shape (n,)
    Array to be orthogonalized

W : ndarray of shape (p, n)
    Null space definition

j : int < p
    The no of (from the first) rows of Null space W wrt which w is
    orthogonalized.

Notes
-----
Assumes that W is orthogonal
w changed in place
N)npr   	multi_dotT)wWjs      Q/var/www/html/venv/lib/python3.13/site-packages/sklearn/decomposition/_fastica.py_gs_decorrelationr      s7    * 		a2A!BQ%0	11AH    c                 v   [         R                  " [        R                  " X R                  5      5      u  p[        R
                  " U[        R                  " U R                  5      R                  SS9n[        R                   R                  US[        R                  " U5      -  -  UR                  U /5      $ )z8Symmetric decorrelation
i.e. W <- (W * W.T) ^{-1/2} * W
N)a_mina_max      ?)r   eighr   dotr   clipfinfodtypetinyr   sqrt)r   sus      r   _sym_decorrelationr.   8   s{     ;;rvva~&DA 	!''*//t<A 99S2771:%5 6Q?@@r    c                    UR                   S   n[        R                  " Xf4U R                  S9n/ n[	        U5       GH=  n	XYSS24   R                  5       n
U
[        R                  " U
S-  R                  5       5      -  n
[	        U5       H  nU" [        R                  " U
R                  U 5      U5      u  pX-  R                  SS9UR                  5       U
-  -
  n[        XU	5        U[        R                  " US-  R                  5       5      -  n[        R                  " [        R                  " X-  R                  5       5      S-
  5      nUn
X:  d  M    O   UR                  WS-   5        XU	SS24'   GM@     U[        U5      4$ )z[Deflationary FastICA using fun approx to neg-entropy function

Used internally by FastICA.
r   r)   Nr      axis)shaper   zerosr)   rangecopyr+   sumr&   r   meanr   absappendmax)Xtolgfun_argsmax_iterw_initn_componentsr   n_iterr   r   igwtxg_wtxw1lims                   r   _ica_defrJ   G   s@    <<?L
,-QWW=AF < a4L	RWWadZZ\""xABFF133NH5KD(a(5::<!+;;BbQ'"''2q5++-((B&&/!34CAy ! 	a!e!Q$' !* c&k>r    c                    [        U5      nA[        U R                  S   5      n[        U5       H  nU" [        R
                  " X`5      U5      u  p[        [        R
                  " XR                  5      U-  U
SS2[        R                  4   U-  -
  5      nA	A
[        [        [        [        R                  " SX5      5      S-
  5      5      nUnX:  d  M    O   [        R                  " S[        5        UWS-   4$ )z;Parallel FastICA.

Used internally by FastICA --main loop

r1   Nzij,ij->iz\FastICA did not converge. Consider increasing tolerance or the maximum number of iterations.)r.   floatr4   r6   r   r&   r   newaxisr<   r:   einsumwarningswarnr   )r=   r>   r?   r@   rA   rB   r   p_iirF   rG   W1rI   s                r   _ica_parrT   j   s     	6"A	qwwqz	BHoqh/tSS 1B 6q"**}9MPQ9Q QR% #c"))J67!;<=9  	A 	
 b1f9r    c                    UR                  SS5      nX-  n [        R                  " X 5      n[        R                  " U R                  S   U R
                  S9n[        U5       H   u  pVUSUS-  -
  -  R                  5       XE'   M"     X44$ )Nalphar$   r   r0   r1   r   )getr   tanhemptyr4   r)   	enumerater9   )xr@   rV   gxg_xrE   gx_is          r   _logcoshr_      sv    LL#&EJA	B
((1771:QWW
-CR=1tQw;'--/ !7Nr    c                 z    [         R                  " U S-  * S-  5      nX-  nSU S-  -
  U-  nX4R                  SS94$ )Nr   r1   r2   )r   expr9   )r[   r@   rb   r\   r]   s        r   _exprc      sG    
&&1a41
C	
Bq!t8s
CxxRx   r    c                 6    U S-  SU S-  -  R                  SS94$ )N   r   ra   r2   )r9   )r[   r@   s     r   _cuberf      s$    a4!ad(b)))r    
array-likeboolean)r=   return_X_meancompute_sourcesreturn_n_iterFprefer_skip_nested_validationparallelunit-variancelogcosh   -C6?svdT)	algorithmwhitenfunr@   rA   r>   rB   whiten_solverrandom_stateri   rj   rk   c                T   [        UUUUUUUUU	U
S9
nUR                  5         UR                  XS9nUR                  S;   a  UR                  nUR
                  nOSnSnUUR                  U/nU(       a  UR                  U5        U(       a  UR                  UR                  5        U$ )aW  Perform Fast Independent Component Analysis.

The implementation is based on [1]_.

Read more in the :ref:`User Guide <ICA>`.

Parameters
----------
X : array-like of shape (n_samples, n_features)
    Training vector, where `n_samples` is the number of samples and
    `n_features` is the number of features.

n_components : int, default=None
    Number of components to use. If None is passed, all are used.

algorithm : {'parallel', 'deflation'}, default='parallel'
    Specify which algorithm to use for FastICA.

whiten : str or bool, default='unit-variance'
    Specify the whitening strategy to use.

    - If 'arbitrary-variance', a whitening with variance
      arbitrary is used.
    - If 'unit-variance', the whitening matrix is rescaled to ensure that
      each recovered source has unit variance.
    - If False, the data is already considered to be whitened, and no
      whitening is performed.

    .. versionchanged:: 1.3
        The default value of `whiten` changed to 'unit-variance' in 1.3.

fun : {'logcosh', 'exp', 'cube'} or callable, default='logcosh'
    The functional form of the G function used in the
    approximation to neg-entropy. Could be either 'logcosh', 'exp',
    or 'cube'.
    You can also provide your own function. It should return a tuple
    containing the value of the function, and of its derivative, in the
    point. The derivative should be averaged along its last dimension.
    Example::

        def my_g(x):
            return x ** 3, (3 * x ** 2).mean(axis=-1)

fun_args : dict, default=None
    Arguments to send to the functional form.
    If empty or None and if fun='logcosh', fun_args will take value
    {'alpha' : 1.0}.

max_iter : int, default=200
    Maximum number of iterations to perform.

tol : float, default=1e-4
    A positive scalar giving the tolerance at which the
    un-mixing matrix is considered to have converged.

w_init : ndarray of shape (n_components, n_components), default=None
    Initial un-mixing array. If `w_init=None`, then an array of values
    drawn from a normal distribution is used.

whiten_solver : {"eigh", "svd"}, default="svd"
    The solver to use for whitening.

    - "svd" is more stable numerically if the problem is degenerate, and
      often faster when `n_samples <= n_features`.

    - "eigh" is generally more memory efficient when
      `n_samples >= n_features`, and can be faster when
      `n_samples >= 50 * n_features`.

    .. versionadded:: 1.2

random_state : int, RandomState instance or None, default=None
    Used to initialize ``w_init`` when not specified, with a
    normal distribution. Pass an int, for reproducible results
    across multiple function calls.
    See :term:`Glossary <random_state>`.

return_X_mean : bool, default=False
    If True, X_mean is returned too.

compute_sources : bool, default=True
    If False, sources are not computed, but only the rotation matrix.
    This can save memory when working with big data. Defaults to True.

return_n_iter : bool, default=False
    Whether or not to return the number of iterations.

Returns
-------
K : ndarray of shape (n_components, n_features) or None
    If whiten is 'True', K is the pre-whitening matrix that projects data
    onto the first n_components principal components. If whiten is 'False',
    K is 'None'.

W : ndarray of shape (n_components, n_components)
    The square matrix that unmixes the data after whitening.
    The mixing matrix is the pseudo-inverse of matrix ``W K``
    if K is not None, else it is the inverse of W.

S : ndarray of shape (n_samples, n_components) or None
    Estimated source matrix.

X_mean : ndarray of shape (n_features,)
    The mean over features. Returned only if return_X_mean is True.

n_iter : int
    If the algorithm is "deflation", n_iter is the
    maximum number of iterations run across all components. Else
    they are just the number of iterations taken to converge. This is
    returned only when return_n_iter is set to `True`.

Notes
-----
The data matrix X is considered to be a linear combination of
non-Gaussian (independent) components i.e. X = AS where columns of S
contain the independent components and A is a linear mixing
matrix. In short ICA attempts to `un-mix' the data by estimating an
un-mixing matrix W where ``S = W K X.``
While FastICA was proposed to estimate as many sources
as features, it is possible to estimate less by setting
n_components < n_features. It this case K is not a square matrix
and the estimated A is the pseudo-inverse of ``W K``.

This implementation was originally made for data of shape
[n_features, n_samples]. Now the input is transposed
before the algorithm is applied. This makes it slightly
faster for Fortran-ordered input.

References
----------
.. [1] A. Hyvarinen and E. Oja, "Fast Independent Component Analysis",
       Algorithms and Applications, Neural Networks, 13(4-5), 2000,
       pp. 411-430.

Examples
--------
>>> from sklearn.datasets import load_digits
>>> from sklearn.decomposition import fastica
>>> X, _ = load_digits(return_X_y=True)
>>> K, W, S = fastica(X, n_components=7, random_state=0, whiten='unit-variance')
>>> K.shape
(7, 64)
>>> W.shape
(7, 7)
>>> S.shape
(1797, 7)

rC   rt   ru   rv   r@   rA   r>   rB   rw   rx   rj   )ro   arbitrary-varianceN)	r   _validate_params_fit_transformru   
whitening_mean_	_unmixingr;   n_iter_)r=   rC   rt   ru   rv   r@   rA   r>   rB   rw   rx   ri   rj   rk   estSKX_meanreturned_valuess                      r   r   r      s    Z !#!C 1>A
zz<<NN#--+Ov&s{{+r    c                   z  ^  \ rS rSr% Sr\" \SSSS9S/\" SS15      /\" S	S
15      \" \	S15      /\" 1 Sk5      \
/\S/\" \SSSS9/\" \SSSS9/SS/\" SS15      /S/S.
r\\S'    S#SS
SSSSSSSS.	U 4S jjjrS$S jr\" SS9S#S j5       r\" SS9S#S j5       rS%S jrS%S jr\S  5       rU 4S! jrS"rU =r$ )&r   io  aY  FastICA: a fast algorithm for Independent Component Analysis.

The implementation is based on [1]_.

Read more in the :ref:`User Guide <ICA>`.

Parameters
----------
n_components : int, default=None
    Number of components to use. If None is passed, all are used.

algorithm : {'parallel', 'deflation'}, default='parallel'
    Specify which algorithm to use for FastICA.

whiten : str or bool, default='unit-variance'
    Specify the whitening strategy to use.

    - If 'arbitrary-variance', a whitening with variance
      arbitrary is used.
    - If 'unit-variance', the whitening matrix is rescaled to ensure that
      each recovered source has unit variance.
    - If False, the data is already considered to be whitened, and no
      whitening is performed.

    .. versionchanged:: 1.3
        The default value of `whiten` changed to 'unit-variance' in 1.3.

fun : {'logcosh', 'exp', 'cube'} or callable, default='logcosh'
    The functional form of the G function used in the
    approximation to neg-entropy. Could be either 'logcosh', 'exp',
    or 'cube'.
    You can also provide your own function. It should return a tuple
    containing the value of the function, and of its derivative, in the
    point. The derivative should be averaged along its last dimension.
    Example::

        def my_g(x):
            return x ** 3, (3 * x ** 2).mean(axis=-1)

fun_args : dict, default=None
    Arguments to send to the functional form.
    If empty or None and if fun='logcosh', fun_args will take value
    {'alpha' : 1.0}.

max_iter : int, default=200
    Maximum number of iterations during fit.

tol : float, default=1e-4
    A positive scalar giving the tolerance at which the
    un-mixing matrix is considered to have converged.

w_init : array-like of shape (n_components, n_components), default=None
    Initial un-mixing array. If `w_init=None`, then an array of values
    drawn from a normal distribution is used.

whiten_solver : {"eigh", "svd"}, default="svd"
    The solver to use for whitening.

    - "svd" is more stable numerically if the problem is degenerate, and
      often faster when `n_samples <= n_features`.

    - "eigh" is generally more memory efficient when
      `n_samples >= n_features`, and can be faster when
      `n_samples >= 50 * n_features`.

    .. versionadded:: 1.2

random_state : int, RandomState instance or None, default=None
    Used to initialize ``w_init`` when not specified, with a
    normal distribution. Pass an int, for reproducible results
    across multiple function calls.
    See :term:`Glossary <random_state>`.

Attributes
----------
components_ : ndarray of shape (n_components, n_features)
    The linear operator to apply to the data to get the independent
    sources. This is equal to the unmixing matrix when ``whiten`` is
    False, and equal to ``np.dot(unmixing_matrix, self.whitening_)`` when
    ``whiten`` is True.

mixing_ : ndarray of shape (n_features, n_components)
    The pseudo-inverse of ``components_``. It is the linear operator
    that maps independent sources to the data.

mean_ : ndarray of shape(n_features,)
    The mean over features. Only set if `self.whiten` is True.

n_features_in_ : int
    Number of features seen during :term:`fit`.

    .. versionadded:: 0.24

feature_names_in_ : ndarray of shape (`n_features_in_`,)
    Names of features seen during :term:`fit`. Defined only when `X`
    has feature names that are all strings.

    .. versionadded:: 1.0

n_iter_ : int
    If the algorithm is "deflation", n_iter is the
    maximum number of iterations run across all components. Else
    they are just the number of iterations taken to converge.

whitening_ : ndarray of shape (n_components, n_features)
    Only set if whiten is 'True'. This is the pre-whitening matrix
    that projects data onto the first `n_components` principal components.

See Also
--------
PCA : Principal component analysis (PCA).
IncrementalPCA : Incremental principal components analysis (IPCA).
KernelPCA : Kernel Principal component analysis (KPCA).
MiniBatchSparsePCA : Mini-batch Sparse Principal Components Analysis.
SparsePCA : Sparse Principal Components Analysis (SparsePCA).

References
----------
.. [1] A. Hyvarinen and E. Oja, Independent Component Analysis:
       Algorithms and Applications, Neural Networks, 13(4-5), 2000,
       pp. 411-430.

Examples
--------
>>> from sklearn.datasets import load_digits
>>> from sklearn.decomposition import FastICA
>>> X, _ = load_digits(return_X_y=True)
>>> transformer = FastICA(n_components=7,
...         random_state=0,
...         whiten='unit-variance')
>>> X_transformed = transformer.fit_transform(X)
>>> X_transformed.shape
(1797, 7)
r1   Nleft)closedrn   	deflationr|   ro   F>   rb   cuberp   g        rg   r%   rs   rx   rz   _parameter_constraintsrp   rq   rr   )	rt   ru   rv   r@   rA   r>   rB   rw   rx   c       	            > [         TU ]  5         Xl        X l        X0l        X@l        XPl        X`l        Xpl        Xl	        Xl
        Xl        g N)super__init__rC   rt   ru   rv   r@   rA   r>   rB   rw   rx   )selfrC   rt   ru   rv   r@   rA   r>   rB   rw   rx   	__class__s              r   r   FastICA.__init__  sE     	("  *(r    c                 
  ^  [        T UT R                  [        R                  [        R                  /SS9R
                  nT R                  c  0 OT R                  n[        T R                  5      nUR                  SS5      nSUs=::  a  S::  d  O  [        S5      eT R                  S:X  a  [        nONT R                  S	:X  a  [        nO7T R                  S
:X  a  [        nO [        T R                  5      (       a  U 4S jnUR                   u  pT R"                  n
T R                  (       d  U
b  Sn
[$        R&                  " S5        U
c  [)        X5      n
U
[)        X5      :  a$  [)        X5      n
[$        R&                  " SU
-  5        T R                  (       Ga  UR+                  SS9nX;SS2[        R,                  4   -  nT R.                  S:X  a  [0        R2                  " UR5                  U5      5      u  p[        R6                  " U5      SSS2   n[        R8                  " UR:                  5      R<                  S-  nX:  n[        R>                  " U5      (       a  [$        R&                  " S5        XU'   [        R@                  " XS9  X   USS2U4   pO+T R.                  S:X  a  [0        RB                  " USSS9SS u  pW[        RD                  " US   5      -  nUW-  R
                  SU
 nAA[        R4                  " UU5      nU[        R@                  " U	5      -  nO
[G        USS9nT RH                  nUc.  [        RJ                  " URM                  X4S9UR:                  S9nO8[        RJ                  " U5      nUR                   X4:w  a  [        SSX40-  5      eT RN                  WUT RP                  US.nT RR                  S:X  a  [U        U40 UD6u  nnOT RR                  S:X  a  [W        U40 UD6u  nnAWT l,        U(       a`  T R                  (       a-  [        R0                  R[                  WWU/5      R
                  nO$[        R4                  " WU5      R
                  nOSnT R                  (       a  T R                  S :X  a]  U(       d,  [        R0                  R[                  WWU/5      R
                  n[        R\                  " USS!S"9nUU-  nWUR
                  -  n[        R4                  " WW5      T l/        WT l0        UT l1        OWT l/        [0        Rd                  " T R^                  SS#9T l3        UT l4        U$ )$a  Fit the model.

Parameters
----------
X : array-like of shape (n_samples, n_features)
    Training data, where `n_samples` is the number of samples
    and `n_features` is the number of features.

compute_sources : bool, default=False
    If False, sources are not computes but only the rotation matrix.
    This can save memory when working with big data. Defaults to False.

Returns
-------
S : ndarray of shape (n_samples, n_components) or None
    Sources matrix. `None` if `compute_sources` is `False`.
r   )r7   r)   ensure_min_samplesNrV   r$   r1   zalpha must be in [1,2]rp   rb   r   c                 *   > TR                   " U 40 UD6$ r   )rv   )r[   r@   r   s     r   r?   !FastICA._fit_transform.<locals>.gI  s    xx.X..r    z(Ignoring n_components with whiten=False.z/n_components is too large: it will be set to %sra   r2   r%   
   zfThere are some small singular values, using whiten_solver = 'svd' might lead to more accurate results.)outrs   F)full_matricescheck_finiter   )r7   )sizer0   z/w_init has invalid shape -- should be %(shape)sr4   )r>   r?   r@   rA   rB   rn   r   ro   T)r3   keepdims)r   )5r   ru   r   float64float32r   r@   r   rx   rW   
ValueErrorrv   r_   rc   rf   callabler4   rC   rO   rP   minr9   rM   rw   r   r%   r&   argsortr(   r)   epsanyr+   rs   signr   rB   asarraynormalr>   rA   rt   rT   rJ   r   r   stdcomponents_r   r   pinvmixing_r   )r   r=   rj   XTr@   rx   rV   r?   
n_features	n_samplesrC   r   dr-   sort_indicesr   degenerate_idxr   X1rB   kwargsr   rD   r   S_stds   `                        r   r~   FastICA._fit_transform!  sq   $ ::rzz* 
 ! 	 .2DMM)$*;*;<Wc*EQ56688y AXXAXXAdhh/ !#
(({{|7LMMDEy5L#i44y5LMMALP ;;;WW"W%FBJJ''B !!V+{{266!9-!zz!}TrT2hhqww'++b0!"66.))MM,
 %(.!!!\/(:1##u,zz"ENrPQR 1AQ		-<(A12B "'')$$B  /B>ZZ##,)E#FbhhF
 ZZ'F||;; E <=>  88 
 >>Z' .v.IAv^^{* .v.IAv{{II''Ar
355FF1bMOOA;;{{o-&		++Q2J799Aqq48U
UWW!vva|DDJDO D{{4#3#3%Hr    Trl   c                 "    U R                  USS9$ )a  Fit the model and recover the sources from X.

Parameters
----------
X : array-like of shape (n_samples, n_features)
    Training data, where `n_samples` is the number of samples
    and `n_features` is the number of features.

y : Ignored
    Not used, present for API consistency by convention.

Returns
-------
X_new : ndarray of shape (n_samples, n_components)
    Estimated sources obtained by transforming the data with the
    estimated unmixing matrix.
Tr{   r~   r   r=   ys      r   fit_transformFastICA.fit_transform  s    & ""1d";;r    c                 &    U R                  USS9  U $ )aO  Fit the model to X.

Parameters
----------
X : array-like of shape (n_samples, n_features)
    Training data, where `n_samples` is the number of samples
    and `n_features` is the number of features.

y : Ignored
    Not used, present for API consistency by convention.

Returns
-------
self : object
    Returns the instance itself.
Fr{   r   r   s      r   fitFastICA.fit  s    $ 	Au5r    c                 &   [        U 5        [        U UU=(       a    U R                  [        R                  [        R
                  /SS9nU R                  (       a  XR                  -  n[        R                  " XR                  R                  5      $ )a  Recover the sources from X (apply the unmixing matrix).

Parameters
----------
X : array-like of shape (n_samples, n_features)
    Data to transform, where `n_samples` is the number of samples
    and `n_features` is the number of features.

copy : bool, default=True
    If False, data passed to fit can be overwritten. Defaults to True.

Returns
-------
X_new : ndarray of shape (n_samples, n_components)
    Estimated sources obtained by transforming the data with the
    estimated unmixing matrix.
F)r7   r)   reset)
r   r   ru   r   r   r   r   r&   r   r   r   r=   r7   s      r   	transformFastICA.transform  sj    $ 	&4;;::rzz*
 ;;OAvva))++,,r    c                 $   [        U 5        [        X=(       a    U R                  [        R                  [        R
                  /S9n[        R                  " XR                  R                  5      nU R                  (       a  XR                  -  nU$ )a  Transform the sources back to the mixed data (apply mixing matrix).

Parameters
----------
X : array-like of shape (n_samples, n_components)
    Sources, where `n_samples` is the number of samples
    and `n_components` is the number of components.
copy : bool, default=True
    If False, data passed to fit are overwritten. Defaults to True.

Returns
-------
X_original : ndarray of shape (n_samples, n_features)
    Reconstructed data obtained with the mixing matrix.
)r7   r)   )
r   r   ru   r   r   r   r&   r   r   r   r   s      r   inverse_transformFastICA.inverse_transform  s[      	!5$++rzz2::>VWFF1llnn%;;OAr    c                 4    U R                   R                  S   $ )z&Number of transformed output features.r   )r   r4   )r   s    r   _n_features_outFastICA._n_features_out  s     %%a((r    c                 J   > [         TU ]  5       nSS/UR                  l        U$ )Nr   r   )r   __sklearn_tags__transformer_tagspreserves_dtype)r   tagsr   s     r   r   FastICA.__sklearn_tags__!  s(    w')1:I0F-r    )r   rt   r   rv   r@   rA   r   r   rC   r   rx   r>   rB   ru   rw   r   r   )F)T)__name__
__module____qualname____firstlineno____doc__r   r   r   r   boolr   dictr   r   __annotations__r   r~   r
   r   r   r   r   propertyr   r   __static_attributes____classcell__)r   s   @r   r   r   o  sF   EP "(AtFCTJ *k!:;<,o>?D5'"
 56A4Lh4?@sD89&$fe_56'($D $ ) ) )4Vp 5< 6<( 5 6(-@2 ) ) r    r   )&r   rO   numbersr   r   numpyr   scipyr   baser   r   r	   r
   
exceptionsr   utilsr   r   r   utils._param_validationr   r   r   r   utils.validationr   r   __all__r   r.   rJ   rT   r_   rc   rf   r   r    r    r   <module>r      s     "    , C C T T =i
 2A FD	!* ^#%;#	 #( @ @@Fu-/? ur    