U
    0A·fh4  ã                
   @   sØ  d dl Z d dlZd dl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mZmZ d9dd„Zdd	„ Zd
d„ Zedd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zejjddddd„ ƒZdd„ Zdd„ Zej de	eg¡ej d dd!g¡d"d#„ ƒƒZej de	ef¡ej d$d%¡ej d&ejejfej ej fej!ej fej"ej ff¡d'd(„ ƒƒƒZ#ej de	ef¡ej d$d%¡d)d*„ ƒƒZ$ej de	eg¡d+d,„ ƒZ%d-d.„ Z&d/d0„ Z'd1d2„ Z(d3d4„ Z)d5d6„ Z*ej de	eg¡d7d8„ ƒZ+dS ):é    N)Úassert_array_equal)ÚPCAÚMiniBatchSparsePCAÚ	SparsePCA)Úcheck_random_state)Úassert_allcloseÚassert_array_almost_equalÚ!if_safe_multiprocessing_with_blasc                 C   s  |d |d  }t |ƒ}| || ¡}| | |¡}dddg}dddg}	t| ƒD ]’}
t |¡}||
 d |	|
  ||
 d |	|
   }}||
 d |	|
  ||
 d |	|
   }}d|||… d d …||…f< | ¡ ||
d d …f< qLt ||¡}|d| |jd |jd ¡ 7 }|||fS )	Nr   é   )é   r   )é   é   )é   r
   é   g      ð?gš™™™™™¹?)r   ÚrandnÚrangeÚnpÚzerosZravelÚdotÚshape)Ún_componentsÚ	n_samplesZ
image_sizeÚrandom_stateÚ
n_featuresÚrngÚUÚVZcentersÚszÚkÚimgZxminZxmaxZyminZymaxÚY© r!   úO/tmp/pip-unpacked-wheel-flfw_8ie/sklearn/decomposition/tests/test_sparse_pca.pyÚgenerate_toy_data   s    


** r#   c                  C   s„   t j d¡} |  dd¡}td| d}| |¡}|jjdks>t‚|jdksLt‚td| d}| |¡}|jjd	ksrt‚|jd
ks€t‚d S )Nr   é   é
   r   ©r   r   ©r   r%   ©r$   r   é   ©r)   r%   ©r$   r)   )	r   ÚrandomÚRandomStater   r   Úfit_transformÚcomponents_r   ÚAssertionError)r   ÚXÚspcar   r!   r!   r"   Útest_correct_shapes-   s    

r3   c                  C   sl   d} t j d¡}tddd|d\}}}tdd| dd}| |¡ tdd	d| d
}| |¡ t|j|jƒ d S )Nr
   r   r   r%   ©r   r   ©r   Úlars©r   ÚmethodÚalphar   Úcd)r   r8   r   r9   )r   r,   r-   r#   r   Úfitr   r/   )r9   r   r    Ú_Ú	spca_larsÚ
spca_lassor!   r!   r"   Útest_fit_transform;   s    

r?   c                  C   sŽ   d} t j d¡}tddd|d\}}}tdd| dd}| |¡ | |¡}tdd	d| dd
 |¡}| |¡}t  |jdk¡r€t	‚t
||ƒ d S )Nr
   r   r   r%   r4   r5   r6   r7   r   )r   Ún_jobsr8   r9   r   )r   r,   r-   r#   r   r;   Ú	transformÚallr/   r0   r   )r9   r   r    r<   r=   ÚU1r2   ÚU2r!   r!   r"   Útest_fit_transform_parallelH   s$    

    ÿþ
rE   c                  C   sZ   t j d¡} tddd| d\}}}d|d d …df< tdd}t  t  | |¡¡¡rVt‚d S )Nr   r   r%   r4   r5   r   ©r   )	r   r,   r-   r#   r   ÚanyÚisnanr.   r0   )r   r    r<   Z	estimatorr!   r!   r"   Útest_transform_nanY   s
    
rI   c                  C   sf   t j d¡} tddd| d\}}}tdd| d}| |¡}tdd| d}| |¡ |¡}t||ƒ d S )	Nr   r   éA   r4   r5   r6   )r   r8   r   r:   )	r   r,   r-   r#   r   r.   r;   rA   r   )r   r    r<   r=   rC   r>   rD   r!   r!   r"   Útest_fit_transform_tallc   s    
rK   c                  C   st   t j d¡} |  dd¡}|  dd¡}td||d| d}| |  dd¡¡ t|j|t jj	|ddd d …d f  ƒ d S )Nr   é   r   é   )r   ÚU_initÚV_initÚmax_iterr   r
   )Zaxis)
r   r,   r-   r   r   r;   r   r/   ZlinalgZnorm)r   rN   rO   Úmodelr!   r!   r"   Útest_initializationm   s        ÿrR   c                  C   sˆ   t j d¡} |  dd¡}tdd| d}| |¡}|jjdks@t‚|jdksNt‚td	d| d}| |¡}|jjd
ksvt‚|jdks„t‚d S )Nr   r$   r%   r   r
   )r   rP   r   r'   r(   r)   r*   r+   )	r   r,   r-   r   r   r.   r/   r   r0   )r   r1   Úpcar   r!   r!   r"   Útest_mini_batch_correct_shapesx   s    

rT   Tz"skipping mini_batch_fit_transform.)Úreasonc                  C   sþ   d} t j d¡}tddd|d\}}}tdd| d |¡}| |¡}tjdkr˜dd l	}|j
j}d |j
_z$tdd	| dd
}| |¡ |¡}	W 5 ||j
_X n tdd	| dd
}| |¡ |¡}	t  |jdk¡rÌt‚t||	ƒ tdd| dd |¡}
t|
j|jƒ d S )Nr
   r   r   r%   r4   r5   )r   r   r9   Úwin32r   )r   r@   r9   r   r:   r7   )r   r,   r-   r#   r   r;   rA   ÚsysÚplatformÚjoblibÚparallelÚmultiprocessingrB   r/   r0   r   )r9   r   r    r<   r=   rC   rY   Z_mpr2   rD   r>   r!   r!   r"   Útest_mini_batch_fit_transform‡   s>    

   ÿ
   ÿþr\   c                  C   sh   d} t j d¡}tddd|d\}}}tdd| |d}| |¡}| |d d	… ¡}t|d |d ƒ d S )
Nr
   r   r   éè  r4   r5   r6   r7   r%   )r   r,   r-   r#   r   r.   rA   r   )r9   r   r    r<   r=   Zresults_trainZresults_testr!   r!   r"   Útest_scaling_fit_transform§   s    
r^   c                  C   sà   t j d¡} tddd| d\}}}tddd| d\}}}tdddd}tdd	}| |¡ | |¡ | |¡}| |¡}tt  	|j
 |j
j¡¡t  d¡d
d |t  |dd d …f ¡9 }|t  |dd d …f ¡9 }t||ƒ d S )Nr   r   r]   r4   r5   r%   r   )r9   Úridge_alphar   rF   gñhãˆµøä>)Zatol)r   r,   r-   r#   r   r   r;   rA   r   Úabsr/   r   ÚTZeyeÚsign)r   r    r<   ÚZr2   rS   Zresults_test_pcaZresults_test_spcar!   r!   r"   Útest_pca_vs_spca±   s"    




  ÿrd   ÚSPCAr   r   c                 C   sZ   t j d¡}d\}}| ||¡}| |d |¡}|d k	rH|j|ksVt‚n|j|ksVt‚d S )Nr   ©r$   r%   rF   )r   r,   r-   r   r;   Zn_components_r0   )re   r   r   r   r   r1   rQ   r!   r!   r"   Útest_spca_n_components_Ã   s    rg   r8   )r6   r:   zdata_type, expected_typec                 C   s`   d\}}}t j d¡}| ||¡ |¡}| ||d}	|	 |¡}
|
j|ksLt‚|	jj|ks\t‚d S )N©r$   r%   r   r   )r   r8   )	r   r,   r-   r   Úastyper.   Zdtyper0   r/   )re   r8   Z	data_typeZexpected_typer   r   r   r   Úinput_arrayrQ   Ztransformedr!   r!   r"   Útest_sparse_pca_dtype_matchÒ   s    

rk   c                 C   s’   d}d}d\}}}t j d¡}| ||¡}| |||dd}	|	 | t j¡¡}
| |||dd}| | t j¡¡}t||
|d t|j	|	j	|d d S )Nçü©ñÒMbP?r   rh   r   )r   r9   r8   r   )Úrtol)
r   r,   r-   r   r.   ri   Úfloat32Úfloat64r   r/   )re   r8   rm   r9   r   r   r   r   rj   Zmodel_32Ztransformed_32Zmodel_64Ztransformed_64r!   r!   r"   Ú%test_sparse_pca_numerical_consistencyé   s*    
   ÿ   ÿrp   c                    sb   t j d¡}d\}}| ||¡}| dd |¡}| ¡ }| j ¡ ‰ t‡ fdd„t	dƒD ƒ|ƒ dS )z'Check feature names out for *SparsePCA.r   rf   rM   rF   c                    s   g | ]}ˆ › |› ‘qS r!   r!   )Ú.0Úi©Zestimator_namer!   r"   Ú
<listcomp>  s     z/test_spca_feature_names_out.<locals>.<listcomp>N)
r   r,   r-   r   r;   Zget_feature_names_outÚ__name__Úlowerr   r   )re   r   r   r   r1   rQ   Únamesr!   rs   r"   Útest_spca_feature_names_out  s    
rx   c               	   C   s¤   t j d¡} d\}}|  ||¡}d}tjt|d tdd |¡ W 5 Q R X d\}}tjt|d t||dd |¡}W 5 Q R X |j	d	ks’t
‚|j	|ks t
‚d
S )zvCheck that we raise a warning for the deprecation of `n_iter` and it is ignored
    when `max_iter` is specified.
    r   rf   z9'n_iter' is deprecated in version 1.1 and will be removed©Úmatchr   )Ún_iter)r
   éd   )r{   rP   r   r
   N)r   r,   r-   r   ÚpytestÚwarnsÚFutureWarningr   r;   Ún_iter_r0   )r   r   r   r1   Zwarn_msgr{   rP   rQ   r!   r!   r"   Útest_spca_n_iter_deprecation  s"      ÿþr   c               	   C   sb   t  ddgddgddgddgddgddgg¡} tdd | ¡}tjtdd	 |j W 5 Q R X d S )
Néÿÿÿÿéþÿÿÿéýÿÿÿr
   r   r   rF   z`n_features_` was deprecatedry   )r   Úarrayr   r;   r}   r~   r   Zn_features_)r1   rS   r!   r!   r"   Útest_pca_n_features_deprecation%  s    .r†   c                 C   s˜   t j | ¡}d\}}| ||¡}tdd| d |¡}tdd| d |¡}|j|jk sXt‚tddd| d |¡}tddd| d |¡}|j|jk s”t‚d	S )
z@Check that `tol` and `max_no_improvement` act as early stopping.)é2   r%   r|   g      à?)rP   Útolr   rl   gíµ ÷Æ°>r   )rP   rˆ   Zmax_no_improvementr   N)r   r,   r-   r   r   r;   r€   r0   )Úglobal_random_seedr   r   r   r1   Zmodel_early_stoppedZmodel_not_early_stoppedr!   r!   r"   Útest_spca_early_stopping,  sF      ÿþ  ÿþ   ÿþ   ÿþrŠ   c                 C   sZ   t j | ¡}| dd¡}d}t|ddd |¡}t|ddddd |¡}t|j|jƒ d	S )
z¤Check the equivalence of the components found by PCA and SparsePCA.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/23932
    r‡   rM   r   Z
randomizedr   )r   Z
svd_solverr   r6   )r   r8   r_   r9   r   N)	r   r,   r-   r   r   r;   r   r   r/   )r‰   r   r1   r   rS   r2   r!   r!   r"   Ú$test_equivalence_components_pca_spcaF  s(    ýüûúr‹   c            	      C   sn   t j d¡} d\}}|  ||¡}d}t|dddd}t|dd}| |¡}| |¡}t| |¡| |¡ƒ dS )zDCheck that `inverse_transform` in `SparsePCA` and `PCA` are similar.r   ©r%   rL   r   çê-™—q=©r   r9   r_   r   r&   N)	r   r,   r-   r   r   r   r.   r   Úinverse_transform)	r   r   r   r1   r   r2   rS   ÚX_trans_spcaZX_trans_pcar!   r!   r"   Ú!test_sparse_pca_inverse_transform`  s"       ÿ

 ÿr‘   c                 C   sR   t j d¡}d\}}| ||¡}|}| |dddd}| |¡}t| |¡|ƒ dS )z^Check the `transform` and `inverse_transform` round trip with no loss of
    information.
    r   rŒ   r   rŽ   N)r   r,   r-   r   r.   r   r   )re   r   r   r   r1   r   r2   r   r!   r!   r"   Ú+test_transform_inverse_transform_round_tripr  s       ÿ
r’   )N),rW   Znumpyr   r}   Znumpy.testingr   Zsklearn.decompositionr   r   r   Zsklearn.utilsr   Zsklearn.utils._testingr   r   r	   r#   r3   r?   rE   rI   rK   rR   rT   ÚmarkZskipifr\   r^   rd   Zparametrizerg   rn   ro   Zint32Zint64rk   rp   rx   r   r†   rŠ   r‹   r‘   r’   r!   r!   r!   r"   Ú<module>   sZ   









üþ	
