U
    3‰d:D  ã                
   @   sÐ  d Z ddlZddlZddlZddlZddlZddlmZ ddl	m
Z
 ddl	mZ ddlmZmZmZ ddlmZ ddlmZ d?d
d„Zdd„ Zdd„ Zdd„ Zej d¡ej dddg¡dd„ ƒƒZdd„ Zdd„ Zej dddg¡dd„ ƒZdd„ Zej d ¡ej d!d"d#d$d%d&d'g¡d(d)„ ƒƒZ ej d¡d*d+„ ƒZ!d,d-„ Z"ej d.eƒ edd/g¡d0d1„ ƒZ#d2d3„ Z$ej d4d5d6dg¡ej d7ddg¡ej d8ddg¡d9d:„ ƒƒƒZ%ej dddg¡d;d<„ ƒZ&d=d>„ Z'dS )@z
Test the fastica algorithm.
é    N)Ústats)Úassert_array_equal)Úassert_allclose)ÚFastICAÚfasticaÚPCA)Ú_gs_decorrelation)ÚConvergenceWarningéÿÿÿÿc                 C   s0   t  | |¡} | | jdd8 } | | jdd } dS )a  Centers and norms x **in place**

    Parameters
    -----------
    x: ndarray
        Array with an axis of observations (statistical units) measured on
        random variables.
    axis: int, optional
        Axis along which the mean and variance are calculated.
    r   ©ÚaxisN)ÚnpZrollaxisÚmeanZstd)Úxr   © r   úL/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/decomposition/tests/test_fastica.pyÚcenter_and_norm   s    r   c                  C   s”   t j d¡} t j |  dd¡¡\}}}|  d¡}t||dƒ |d  ¡ dk sPt‚|  d¡}t||dƒ}t  	||j
¡}|d d… d  ¡ dk st‚d S )Nr   é
   é   g»½×Ùß|Û=é   )r   ÚrandomÚRandomStateZlinalgÚsvdÚrandnr   ÚsumÚAssertionErrorÚdotÚT)ÚrngÚWÚ_ÚwÚuÚtmpr   r   r   Útest_gs$   s    

r$   c                 C   sz   t j d¡}| d¡j| dd}tddddd |¡}|jj| ksFt	‚|j
j| ksVt	‚|jj| ksft	‚|jj| ksvt	‚d S )	Nr   ©éd   r   F©Úcopyr   éè  úunit-variance©Ún_componentsÚmax_iterÚwhitenÚrandom_state)r   r   r   Úrandom_sampleÚastyper   ÚfitÚcomponents_Údtyper   Úmixing_Zmean_Z
whitening_)Úglobal_dtyper   ÚXZficar   r   r   Útest_fastica_attributes_dtypes2   s       ÿþr8   c                 C   sd   t j d¡}| d¡j| dd}t|dd|d\}}}|j| ksDt‚|j| ksRt‚|j| ks`t‚d S )Nr   r%   Fr'   r)   r*   )r-   r.   r/   )r   r   r   r0   r1   r   r4   r   )r6   r   r7   Úk_r5   Ús_r   r   r   Útest_fastica_return_dtypes>   s       ÿr;   zHignore:Starting in v1.3, whiten='unit-variance' will be used by default.Ú	add_noiseTFc              
   C   sÎ  |dkr.|t jkr.| s.t d¡dkr.t d¡ t j |¡}d}dt  t  	dd|¡¡ dkd	 }t
jjd	||d
}t j||f j}t|ƒ | |¡}|\}}d}t  t  |¡t  |¡gt  |¡t  |¡ gg¡}	|	 |¡}	t  |	|¡}
| rü|
d| dd¡ 7 }
t|
ƒ dd„ }ddg}ddd|g}dddg}t |||¡D ]Ä\}}}|rt|
j||||d\}}}t t¡ t|
jt j||d W 5 Q R X nXtdd|d}| |
j¡}t|||d|d\}}}t t¡ t|t j|d W 5 Q R X |j}|r&|t jkrdnd}tt  t  ||¡|
¡||d t|ƒ |\}}tt  ||¡ƒtt  ||¡ƒkr`|\}}|t  t  ||¡¡9 }|t  t  ||¡¡9 }| sÈtt  ||¡| d	dd tt  ||¡| d	dd n4tt  ||¡| d	dd tt  ||¡| d	dd q8t|
j|||d \}}}t |||d }| |
j¡}|j!j"d!ksDt#‚|j"d"ksTt#‚t||ƒ |t jkrnd#nd}t|| $|
j¡|d |j%j"d!ksšt#‚t t j|d}t t¡ | &|
j¡ W 5 Q R X d S )$Né   ZDISTRIBZubuntuz®FastICA instability with Ubuntu Atlas build with float32 global_dtype. For more details, see https://github.com/scikit-learn/scikit-learn/issues/24131#issuecomment-1208091119r)   r   r   r&   é   ©Úsizer/   g333333ã?çš™™™™™¹?c                 S   s   | d d| d  j ddfS )Né   r   r
   r   )r   )r   r   r   r   Úg_testr   s    z#test_fastica_simple.<locals>.g_testÚparallelZ	deflationZlogcoshÚexpZcubeúarbitrary-variancer*   F)Úfunr.   Ú	algorithmr/   )rG   r.   rH   T©r,   r.   r/   )rG   rH   r.   r/   )rG   rH   gñhãˆµøä>©Úatolç{®Gáz„?)rG   rH   r/   ©r   r   ©r)   r   gH¯¼šò×z>)'r   Zfloat32ÚosÚgetenvÚpytestZxfailr   r   ÚsinÚlinspacer   ÚtÚrvsÚc_r   r   r1   ÚarrayÚcosr   r   Ú	itertoolsÚproductr   ÚraisesÚ
ValueErrorÚtanhr   Úfit_transformr   ÚabsÚsignr   r3   Úshaper   Ú	transformr5   r2   )r<   Úglobal_random_seedr6   r   Ú	n_samplesÚs1Ús2ÚsÚphiÚmixingÚmrC   ZalgosZnlsZ	whiteningÚalgoÚnlr.   r9   r5   r:   Zpcar7   rK   Ús1_Ús2_r    Zsources_funÚicaÚsourcesr   r   r   Útest_fastica_simpleJ   s¨    ÿþýüÿ 
0

    ÿ     ÿ"   ÿ
rq   c               	   C   sX   ddgddgg} t dddd}d}tjt|d | | ¡ W 5 Q R X t|dƒsTt‚d S )Nr   r>   FrI   z(Ignoring n_components with whiten=False.©Úmatchr5   )r   rQ   ÚwarnsÚUserWarningr2   Úhasattrr   )rj   ro   Úwarn_msgr   r   r   Útest_fastica_nowhiten¸   s    rx   c            
   	   C   s®   t j d¡} d}t  dd|¡}t  |¡}t  t  t j| ¡¡}t j||f j}t	|ƒ |  
dd¡}t  ||¡}d}tjt|d$ tdd| dd	d
}	|	 |j¡ W 5 Q R X d S )Nr   r)   r&   é   r   z\FastICA did not converge. Consider increasing tolerance or the maximum number of iterations.rr   rD   ç        )rH   r,   r/   r-   Ztol)r   r   r   rS   rR   ÚceilÚpirV   r   r   r   r   rQ   rt   r	   r   r2   )
r   rd   rT   re   rf   rg   ri   rj   rw   ro   r   r   r   Útest_fastica_convergence_failÃ   s(    
ÿ    ÿr}   c                 C   sr  t j d¡}d}t  dd|¡}t  |¡}t  t  t j| ¡¡}t j||f j}t	|ƒ |\}}| 
dd¡}t  ||¡}| rŽ|d| 
d|¡ 7 }t	|ƒ t|jdd|d\}	}
}|j}t|t  t  |
|	¡|¡ƒ t	|ƒ |\}}tt  ||¡ƒtt  ||¡ƒkr|\}}|t  t  ||¡¡9 }|t  t  ||¡¡9 }| sntt  ||¡| d	d
d tt  ||¡| d	d
d d S )Nr   r)   r&   ry   r   rA   r*   rI   r>   gü©ñÒMbP?rJ   )r   r   r   rS   rR   r{   r|   rV   r   r   r   r   r   r   r_   r`   )r<   r   rd   rT   re   rf   rg   ri   rj   r9   r5   r:   rm   rn   r   r   r   Útest_non_square_fasticaá   s<    
   ÿ"r~   c              
   C   sZ  t j | ¡}| d¡ |¡}d}ddgddgfD ]"\}}|dk	rF|n|jd }t|||dd	}t ¡ ( t 	d
t
¡ t 	dt¡ | |¡}	W 5 Q R X |jj|dfksªt‚|	j|jd |fksÂt‚t|||dd	}
t ¡ ( t 	d
t
¡ t 	dt¡ |
 |¡ W 5 Q R X |
jj|dfkst‚|
 |¡}|rBt  |¡ ¡ d }nd}t|	||d q0dS )z¶Test unit variance of transformed data using FastICA algorithm.

    Check that `fit_transform` gives the same result as applying
    `fit` and then `transform`.

    Bug #13056
    r%   i,  r*   r   FNr>   r   r+   ÚerrorÚignorer   g    €„.Arz   rJ   )r   r   r   r0   r1   ra   r   ÚwarningsÚcatch_warningsÚsimplefilterÚRuntimeWarningr	   r^   r3   r   r2   rb   r_   r   r   )rc   r6   r   r7   r-   r.   r,   Zn_components_ro   ÚXtZica2ZXt2rK   r   r   r   Útest_fit_transform  sB    	   ÿ
   ÿ

r†   z/ignore:Ignoring n_components with whiten=False.z+whiten, n_components, expected_mixing_shape)rF   r   ©r   r   )rF   r   ©r   r   )r*   r   r‡   )r*   r   rˆ   )Fr   rˆ   )Fr   rˆ   c              	   C   sÂ   d}t j |¡}| |df¡ |¡}t||| d}t ¡  t dt	¡ | 
|¡}	W 5 Q R X |jj|kslt‚| |	¡}
|j|
jks†t‚||jd kr¾|r¬t  |
¡ ¡ d }nd}t||
|d d S )	Nr&   r   )r,   r/   r.   r€   r>   g     jø@rz   rJ   )r   r   r   r0   r1   r   r   r‚   rƒ   r	   r^   r5   ra   r   Zinverse_transformr_   r   r   )r.   r,   Zexpected_mixing_shaperc   r6   rd   r   r7   ro   r…   ZX2rK   r   r   r   Útest_inverse_transformA  s    

r‰   c               	   C   sŠ   d} d}t j d¡}| || f¡}| | d | d ¡}tjtdd t|ddid W 5 Q R X tjtd	d t||d
 W 5 Q R X d S )NrB   r   r   r>   zalpha must be in \[1,2\]rr   Úalpha)Zfun_argsz0w_init has invalid shape.+should be \(3L?, 3L?\))Úw_init)	r   r   r   r0   r   rQ   r[   r\   r   )Ú
n_featuresrd   r   r7   r‹   r   r   r   Útest_fastica_errorsn  s     ÿr   c                  C   sT   t j d¡} |  d¡}|jd }t|ddd}| |¡}t  |¡t 	d¡ksPt
‚dS )zTTest unit variance of transformed data using FastICA algorithm.

    Bug #13056
    r   r%   r>   r*   rI   g      ð?N)r   r   r   r0   ra   r   r^   ÚvarrQ   Úapproxr   )r   r7   r,   ro   r…   r   r   r   Ú!test_fastica_whiten_unit_variance  s    


r   ro   )r.   c              	   C   sL   t j d¡}| d¡}tjtdd |  |¡ | jdks>t	‚W 5 Q R X dS )zSTest FastICA whiten default value deprecation.

    Regression test for #19490
    r   r%   zStarting in v1.3, whiten=rr   rF   N)
r   r   r   r0   rQ   rt   ÚFutureWarningr2   Ú_whitenr   )ro   r   r7   r   r   r   Ú-test_fastica_whiten_default_value_deprecation  s
    

r“   c            	   	   C   s  t j d¡} |  d¡}|jd }t|dd}t t¡ | 	|¡}W 5 Q R X t|ddd}t t¡ | 	|¡}W 5 Q R X t|dddd	}t
 ¡  t
 d
t¡ | 	|¡}W 5 Q R X |jdksÂt‚|jdksÐt‚|jdksÞt‚t||ƒ t||ƒ t  |¡t d¡kst‚dS )z_Test previous behavior for FastICA whitening (whiten=True)

    Regression test for #19490
    r   r%   r>   )r,   r/   TrI   rF   r   )r,   r.   r/   Úwhiten_solverr   rL   N)r   r   r   r0   ra   r   rQ   rt   r‘   r^   r   r‚   rƒ   r’   r   r   rŽ   r   )	r   r7   r,   Zdefault_icaZXt_on_defaultro   r…   Zav_icaZXt_avr   r   r   Ú+test_fastica_whiten_backwards_compatibilityš  s0    

ü


r•   r.   rF   r*   Úreturn_X_meanÚreturn_n_iterc           	      C   sf   d}d}t j d¡}| ||f¡}d| | }t|| ||d}t|ƒ|ksNt‚| sb|d d ksbt‚d S )NrB   r   r   )r.   r—   r–   )r   r   r   r0   r   Úlenr   )	r.   r–   r—   rŒ   rd   r   r7   Úexpected_lenÚoutr   r   r   Útest_fastica_output_shapeÁ  s       ÿr›   c                 C   s:  t j |¡}d}dt  t  dd|¡¡ dkd }tjjd||d}t j||f j	}t
|ƒ |\}}| ¡ d t j }t  t  |¡t  |¡gt  |¡t  |¡ gg¡}t  ||¡}	| rÈ|	d| dd¡ 7 }	t
|	ƒ i }
dD ]F}tdd	|d
}| |	j	¡}||
|< |jjdkst‚|jdksØt‚qØt|
d |
d dd dS )z2Test FastICA is consistent between whiten_solvers.r)   r   r   r&   r>   r?   rA   )r   Úeighr*   ©r/   r.   r”   rM   rN   rœ   r   gê-™—q=rJ   N)r   r   r   rR   rS   r   rT   rU   rV   r   r   Zrandr|   rW   rX   r   r   r   r^   r3   ra   r   r   )r<   rc   r   rd   re   rf   rg   rh   ri   rj   ZoutsZsolverro   rp   r   r   r   Ú%test_fastica_simple_different_solversÕ  s*     0rž   c              	   C   s\   t j | ¡}| dd¡}||j }tdddd}d}tjt|d | 	|¡ W 5 Q R X d	S )
z:Test FastICA eigh solver raises warning for low-rank data.r   r   r   r*   rœ   r   z$There are some small singular valuesrr   N)
r   r   r   r   r   r   rQ   rt   ru   r2   )rc   r   ÚAr7   ro   Úmsgr   r   r   Ú"test_fastica_eigh_low_rank_warningø  s    
r¡   )r
   )(Ú__doc__rY   rQ   r   rO   Znumpyr   Zscipyr   Zsklearn.utils._testingr   r   Zsklearn.decompositionr   r   r   Zsklearn.decomposition._fasticar   Zsklearn.exceptionsr	   r   r$   r8   r;   ÚmarkÚfilterwarningsZparametrizerq   rx   r}   r~   r†   r‰   r   r   r“   r•   r›   rž   r¡   r   r   r   r   Ú<module>   sh   
ÿj
-2
úþ!ÿ

'
"