U
    Ovfb^  ã                
   @   s¾  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 d dlmZmZ d dlmZ e	 ¡ Zdd	d
dgZej de¡ej dedejjd ƒ¡dd„ ƒƒZdd„ Zej dddg¡ej de¡dd„ ƒƒZej dd	d
g¡dd„ ƒZejjdej d ¡  dd¡e	j!dddd dd  gd d!gd"ej de¡d#d$„ ƒƒZ"ej dd	d
g¡d%d&„ ƒZ#ej de¡d'd(„ ƒZ$ej de¡d)d*„ ƒZ%ej de¡d+d,„ ƒZ&ej ddd	d
g¡ej d-ddg¡d.d/„ ƒƒZ'ej d0e (d dd gdd d gg¡e (d dd gdd d gg¡j)g¡ej d1d2d3d4d5g¡d6d7„ ƒƒZ*ej d8de+ejjƒfd	e+ejjƒd fd
e+ejjƒfg¡ej d0ejejj)g¡d9d:„ ƒƒZ,ej dddg¡d;d<„ ƒZ-ej dd	d
g¡d=d>„ ƒZ.d?d@„ Z/dAdB„ Z0dCdD„ Z1dEdF„ Z2ej dGejdHdIfejdJdfej d ¡ 3dKdL¡dMdIfg¡dNdO„ ƒZ4ej de¡dPdQ„ ƒZ5dRdS„ Z6ej de¡dTdU„ ƒZ7ej dd	d
g¡dVdW„ ƒZ8ej ddd
g¡dXdY„ ƒZ9ej dZej d ¡j:d[d\dMdfej d ¡j:d]d\dKdfej d ¡j:d[d\d^dfej d ¡j:d[d\d_d
fg¡d`da„ ƒZ;ej de¡dbdc„ ƒZ<ej de¡ddde„ ƒZ=ej de¡dfdg„ ƒZ>dhdi„ Z?djdk„ Z@dldm„ ZAdndo„ ZBdpdq„ ZCdrds„ ZDdtdu„ ZEdvdw„ ZFdxdy„ ZGdzd{„ ZHd|d}„ ZIej dddg¡d~d„ ƒZJdS )€é    N)Úassert_array_equal)Údatasets)Ú	load_iris)ÚPCA)Ú_assess_dimensionÚ_infer_dimension)Úassert_allcloseÚfullÚarpackÚ
randomizedÚautoÚ
svd_solverÚn_componentsé   c                 C   s’   t j}t|| d}| |¡ |¡}|jd |ks4t‚| |¡}t||ƒ | |¡}t||ƒ | 	¡ }| 
¡ }tt ||¡t |jd ¡dd d S )N©r   r   r   çê-™—q=©Zatol)ÚirisÚdatar   ÚfitÚ	transformÚshapeÚAssertionErrorÚfit_transformr   Zget_covarianceZget_precisionÚnpÚdotZeye)r   r   ÚXÚpcaZX_rZX_r2ÚcovZ	precision© r   úH/tmp/pip-unpacked-wheel-qu3nn_q2/sklearn/decomposition/tests/test_pca.pyÚtest_pca   s    



r!   c               	   C   sZ   d} | d }t jjdd| |fd}t| d}t ¡  t dt¡ | |¡ W 5 Q R X d S )Né
   é   éÿÿÿÿr   ©Úsize©r   Úerror)	r   ÚrandomÚuniformr   ÚwarningsÚcatch_warningsÚsimplefilterÚRuntimeWarningr   )r   Ú
n_featuresr   r   r   r   r    Útest_no_empty_slice_warning(   s    

r0   ÚcopyTFÚsolverc                 C   sˆ  t j d¡}d}d}d}d}t  | ||¡t  t  t  dd|¡¡| ||¡¡¡}|d d …d d…f  d9  < |j||fks~t‚|j	dd	 	¡ d
ks–t‚| 
¡ }t|d|| ddd}	|	 | 
¡ ¡}
|
j||fksÒt‚|	 |¡}t|
|dd t|
j	dddt  |¡ƒ t|
jdd	t  |¡dd | 
¡ }t|d|| d | 
¡ ¡}	|	 |¡}|j||fks`t‚|j	dd	 	¡ tjdddks„t‚d S )Nr   éd   éP   é   é2   g      $@ç      ð?é   ©ÚaxisgfffffæE@Té   )r   Úwhitenr1   r   Úrandom_stateZiterated_powergü©ñÒMb@?©Zrtolr   ©Zddofr:   r   r   F)r   r<   r1   r   gfffff†R@çš™™™™™¹?)Úrel)r   r)   ÚRandomStater   ÚrandnZdiagZlinspacer   r   Ústdr1   r   r   r   r   ÚonesÚmeanÚzerosr   ÚpytestÚapprox)r2   r1   ÚrngÚ	n_samplesr/   r   Úrankr   ZX_r   Z
X_whitenedZX_whitened2ZX_unwhitenedr   r   r    Útest_whitening3   sN    
"þú	
   ÿþ
rM   c                 C   sv   t j d¡}d\}}| ||¡}tddd}td| dd}| |¡ | |¡ t|j|jdd t|j|jdd d S )	Nr   ©r3   r4   r#   r	   r   ©r   r   r=   çš™™™™™©?r>   )	r   r)   rB   rC   r   r   r   Úexplained_variance_Úexplained_variance_ratio_©r   rJ   rK   r/   r   Úpca_fullÚ	pca_otherr   r   r    Ú.test_pca_explained_variance_equivalence_solverj   s"    

  ÿýrV   r   r3   r4   éN   )Ún_informativer=   zrandom-datazcorrelated-data)Úidsc                 C   sr   t d|dd}| | ¡}t|jtj|dddƒ tj tj| dd¡d }t	|dd	d d… }t|j|d
d d S )Nr#   r   rO   r   r?   F)ZrowvarT)Úreverseç{®Gázt?r>   )
r   r   r   rQ   r   ÚvarÚlinalgZeigr   Úsorted)r   r   r   ZX_pcaZexpected_resultr   r   r    Ú%test_pca_explained_variance_empirical€   s    

r_   c                 C   sf   t j d¡}d\}}| ||¡}tdd|d}td| |d}| |¡ | |¡ t|j|jdd d S )Nr   rN   r#   r	   rO   r[   r>   )r   r)   rB   rC   r   r   r   Úsingular_values_rS   r   r   r    Ú$test_pca_singular_values_consistency“   s    

ra   c                 C   s"  t j d¡}d\}}| ||¡}td| |d}| |¡}tt  |jd ¡t j	 
|d¡d ƒ t|jt  t j|d dd¡ƒ d\}}| ||¡}td| |d}| |¡}|t  t j|d dd¡ }|d d …df  d	9  < |d d …d
f  d9  < t  ||j¡}| |¡ t|jd	ddgƒ d S )Nr   rN   r#   rO   Zfror9   )r3   én   r8   g‰A`åÐ"	@r   gX9´Èv¾@r7   )r   r)   rB   rC   r   r   r   Úsumr`   r]   ZnormÚsqrtr   Úcomponents_r   )r   rJ   rK   r/   r   r   ÚX_transZX_hatr   r   r    Útest_pca_singular_values¢   s(    
 ÿ 

rg   c                 C   s²   t j d¡}d\}}| ||¡d }|d d…  t  dddg¡7  < d| d|¡ t  dddg¡ }td	| d
 |¡ |¡}|t  |d	  	¡ ¡ }t
t  |d d ¡ddd d S )Nr   ©r3   r8   r@   r"   r8   é   é   r   r#   r   r7   r[   r>   )r   r)   rB   rC   Úarrayr   r   r   rd   rc   r   Úabs)r   rJ   ÚnÚpr   ÚXtZYtr   r   r    Útest_pca_check_projectionÀ   s      rp   c                 C   s^   ddgddgg}t d| dd}| |¡}|js6tdƒ‚t| ¡ ddd t| ¡ d	d
d d S )Nr7   g        r   r   rO   )r#   r   r   r   g¸…ëQ¸æ?r[   r>   )r   r   r   r   r   rF   rD   )r   r   r   rf   r   r   r    Útest_pca_check_projection_listÏ   s    
rq   r<   c           	      C   s€   t j d¡}d\}}| ||¡}|d d …df  d9  < |dddg7 }td| |d	 |¡}| |¡}| |¡}t||d
d d S )Nr   )r6   r8   r   gñhãˆµøä>rj   ri   r8   r#   )r   r   r<   çñhãˆµøÔ>r>   )	r   r)   rB   rC   r   r   r   Zinverse_transformr   )	r   r<   rJ   rm   rn   r   r   ÚYZ	Y_inverser   r   r    Útest_pca_inverseÚ   s    

rt   r   z!svd_solver, n_components, err_msg)r
   r   ú2must be between 1 and min\(n_samples, n_features\))r   r   ru   )r
   r#   zmust be strictly less than min)r   r8   zZn_components=3 must be between 0 and min\(n_samples, n_features\)=2 with svd_solver='full'c              	   C   s|   d}t || d}tjt|d | |¡ W 5 Q R X | dkrx|}d ||¡}tjt|d t || d |¡ W 5 Q R X d S )Nr#   ©r   ©Úmatchr
   zgn_components={}L? must be strictly less than min\(n_samples, n_features\)={}L? with svd_solver='arpack')r   rH   ÚraisesÚ
ValueErrorr   Úformat)r   r   r   Úerr_msgZ
smallest_dZ
pca_fittedr   r   r    Útest_pca_validationì   s     þÿr}   zsolver, n_components_c                 C   s&   t |d}| | ¡ |j|ks"t‚d S )Nrv   )r   r   Ún_components_r   )r   r2   r~   r   r   r   r    Útest_n_components_none  s    


r   c                 C   sH   t j d¡}d\}}| ||¡}td| d}| |¡ |jdksDt‚d S )Nr   ©iX  r"   Úmler   r   )r   r)   rB   rC   r   r   r~   r   )r   rJ   rK   r/   r   r   r   r   r    Útest_n_components_mle$  s    
r‚   c              	   C   s^   t j d¡}d\}}| ||¡}td| d}d | ¡}tjt|d | 	|¡ W 5 Q R X d S )Nr   r€   r   r   z:n_components='mle' cannot be a string with svd_solver='{}'rw   )
r   r)   rB   rC   r   r{   rH   ry   rz   r   )r   rJ   rK   r/   r   r   r|   r   r   r    Útest_n_components_mle_error/  s    ÿrƒ   c               
   C   sz   t j d¡} d\}}|  ||¡d }|d d…  t  ddddd	g¡7  < td
dd |¡}|jd
ksht‚|j	dksvt‚d S )Nr   ©r3   rj   r@   r"   r8   ri   rj   r   r#   r   r	   r   )
r   r)   rB   rC   rk   r   r   r   r   r~   )rJ   rm   rn   r   r   r   r   r    Útest_pca_dim>  s    $r…   c               	      s´   d\‰ } t j d¡}| ˆ | ¡d | ˆ d¡t  dddddg¡  t  ddd	dd
g¡ }t| dd}| |¡ |j‰t  ‡ ‡fdd„td| ƒD ƒ¡}|d | 	¡ dˆ   ks°t
‚d S )N©éè  rj   r   r@   r   r8   ri   rj   r#   r;   é   r	   r   c                    s   g | ]}t ˆ|ˆ ƒ‘qS r   )r   )Ú.0Úk©rm   Úspectr   r    Ú
<listcomp>V  s     z$test_infer_dim_1.<locals>.<listcomp>ç{®Gáz„?)r   r)   rB   rC   rk   r   r   rQ   ÚrangeÚmaxr   )rn   rJ   r   r   Úllr   r‹   r    Útest_infer_dim_1I  s    ÿþÿ
 r’   c               
   C   sž   d\} }t j d¡}| | |¡d }|d d…  t  ddddd	g¡7  < |dd
…  t  dddd	dg¡7  < t|dd}| |¡ |j}t|| ƒdksšt	‚d S )Nr†   r   r@   r"   r8   ri   rj   r   r#   é   rˆ   r;   r$   r	   r   ©
r   r)   rB   rC   rk   r   r   rQ   r   r   ©rm   rn   rJ   r   r   rŒ   r   r   r    Útest_infer_dim_2Z  s    $$
r–   c                  C   sÆ   d\} }t j d¡}| | |¡d }|d d…  t  ddddd	g¡7  < |dd
…  t  dddd	dg¡7  < |dd…  d	t  dddddg¡ 7  < t|dd}| |¡ |j}t|| ƒd	ksÂt	‚d S )Nr„   r   r@   r"   r8   ri   rj   r   r#   r“   rˆ   r;   r$   r5   é(   r	   r   r”   r•   r   r   r    Útest_infer_dim_3h  s    $$(
r˜   z'X, n_components, n_components_validatedgffffffî?r#   rŽ   rj   r“   g      à?c                 C   s<   t |dd}| | ¡ |jt |¡ks*t‚|j|ks8t‚d S )Nr	   r   )r   r   r   rH   rI   r   r~   )r   r   Zn_components_validatedr   r   r   r    Ú$test_infer_dim_by_explained_varianceu  s    	
r™   c           	      C   sð   d\}}t j d¡}| ||¡d t  dddg¡ }td| d}| |¡ | |¡}d	t  dt j	 t  
d
¡ d ¡ | }t|| d
dd | | ||¡d t  dddg¡ ¡}||ks¾t‚tdd| d}| |¡ | |¡}||ksìt‚d S )N)r‡   r8   r   r@   r8   ri   rj   r#   r   g      à¿r   g|®Gáz„?rP   r>   gš™™™™™É?T)r   r<   r   )r   r)   rB   rC   rk   r   r   ÚscoreÚlogÚpiÚexpr   r   )	r   rm   rn   rJ   r   r   Zll1ÚhZll2r   r   r    Útest_pca_score„  s     

&&

rŸ   c                  C   sÔ   d\} }t j d¡}| | |¡| | d¡t  dddg¡  t  dddg¡ }| | |¡| | d¡t  dddg¡  t  dddg¡ }t  |¡}t|ƒD ](}t|dd	}| |¡ | 	|¡||< q–| 
¡ dksÐt‚d S )
N)éÈ   r8   r   r   r8   ri   rj   r;   r	   r   )r   r)   rB   rC   rk   rG   r   r   r   rš   Zargmaxr   )rm   rn   rJ   ZXlro   r‘   rŠ   r   r   r   r    Útest_pca_score3š  s    88

r¡   c                 C   sF   t jdd\}}td| dd}| |¡ t |j|j dk¡sBt‚d S )NT©Z
return_X_yr5   r   rO   )	r   Úload_digitsr   r   r   ÚallrQ   Únoise_variance_r   )r   r   Ú_r   r   r   r    Útest_pca_sanity_noise_variance©  s    
r§   c                 C   s^   t jdd\}}tdddd}td| dd}| |¡ | |¡ t| |¡| |¡dd d S )	NTr¢   r5   r	   r   rO   rr   r>   )r   r£   r   r   r   rš   )r   r   r¦   rT   rU   r   r   r    Ú"test_pca_score_consistency_solversµ  s    

r¨   c                 C   sŒ   d\}}t j d¡}| ||¡d t  dddg¡ }t|| d}| |¡ |jdksXt‚| 	|¡ | |j
¡ |jdks|t‚| 	|j
¡ d S )Nrh   r   r@   r8   ri   rj   r   )r   r)   rB   rC   rk   r   r   r¥   r   rš   ÚT)r   rm   rn   rJ   r   r   r   r   r    Ú'test_pca_zero_noise_variance_edge_casesÁ  s     

rª   z#data, n_components, expected_solver)r‡   r6   r%   )r"   r6   r6   r"   c                 C   s@   t |dd}t ||dd}| | ¡ | | ¡ t|j|jƒ d S )Nr   )r   r=   rO   )r   r   r   re   )r   r   Zexpected_solverZpca_autoZpca_testr   r   r    Útest_pca_svd_solver_auto×  s      ÿ

r«   c              	   C   s`   t j d¡ dd¡}tj |¡}tj |¡s0t‚t	d| d}t
 t¡ | |¡ W 5 Q R X d S )Nr   rj   ri   r8   r   )r   r)   rB   ÚrandÚspÚsparseZ
csr_matrixÚissparser   r   rH   ry   Ú	TypeErrorr   )r   r   r   r   r   r    Útest_pca_sparse_inputí  s    r±   c                 C   s‚   t j d¡}| dd¡}t  d¡}tdƒD ],}td| |d}| |¡d ||d d …f< q*t|t  	|dd d …f d¡ 
dd¡ƒ d S )Nr   r"   )r“   r#   r“   r#   rO   )r   r)   rB   r¬   rG   r   r   r   r   ZtileZreshape)r   rJ   r   Ztransformed_XÚir   r   r   r    Útest_pca_deterministic_outputø  s    
r³   c                 C   s   t | ƒ t| ƒ d S )N)Ú"check_pca_float_dtype_preservationÚ$check_pca_int_dtype_upcast_to_doublerv   r   r   r    Útest_pca_dtype_preservation  s    r¶   c                 C   sº   t j d¡ dd¡jt jdd}| t j¡}td| dd |¡}td| dd |¡}|j	j
t jksft‚|j	j
t jksxt‚| |¡j
t jksŽt‚| |¡j
t jks¤t‚t|j	|j	dd	 d S )
Nr   r‡   ri   F©r1   r8   rO   g-Cëâ6*?r>   )r   r)   rB   r¬   ÚastypeÚfloat64Zfloat32r   r   re   Údtyper   r   r   )r   ZX_64ZX_32Úpca_64Úpca_32r   r   r    r´   
  s     r´   c                 C   sÄ   t j d¡ ddd¡}|jt jdd}|jt jdd}td| dd |¡}td| dd |¡}|j	j
t jkspt‚|j	j
t jks‚t‚| |¡j
t jks˜t‚| |¡j
t jks®t‚t|j	|j	dd	 d S )
Nr   r‡   )r‡   ri   Fr·   r8   rO   g-Cëâ6?r>   )r   r)   rB   Úrandintr¸   Zint64Zint32r   r   re   rº   r¹   r   r   r   )r   ZX_i64ZX_i32r»   r¼   r   r   r    rµ     s    rµ   c                  C   sT   t dd\} }tƒ  | |¡}|j ¡ d }t|d | |¡}|j| jd ksPt‚d S )NTr¢   éþÿÿÿr'   r   )r   r   r   rR   Zcumsumr~   r   r   )r   ÚyZpca1r   Zpca2r   r   r    Ú5test_pca_n_components_mostly_explained_variance_ratio.  s
    rÀ   c               
   C   sJ   t  ddddg¡} d}dD ]*}tjtdd t| ||ƒ W 5 Q R X qd S )Nr   ç ÂëþKH´9r"   )r   rj   z"should be in \[1, n_features - 1\]rw   )r   rk   rH   ry   rz   r   )ÚspectrumrK   rL   r   r   r    Útest_assess_dimension_bad_rank:  s
    rÃ   c                  C   sd   t  ddddg¡} t| dddt j ks,t‚dD ]}t| |dƒt j ks0t‚q0t| dƒdks`t‚d S )Nr   rÁ   r"   ©rL   rK   )r#   r8   )r   rk   r   Úinfr   r   )rÂ   rL   r   r   r    Útest_small_eigenvalues_mleC  s
    rÆ   c                  C   s<   t jddddddd\} }tdd | ¡}|jdks8t‚d S )Nr“   r   é   é*   )r/   rX   Z
n_repeatedZn_redundantZn_clusters_per_classr=   r   r'   )r   Úmake_classificationr   r   r~   r   ©r   r¦   r   r   r   r    Útest_mle_redundant_dataP  s    ú
rË   c               	   C   sH   t jdddd\} }tddd}tjtdd	 | | ¡ W 5 Q R X d S )
Nr“   é   rÈ   )rK   r/   r=   r   r	   r   z?n_components='mle' is only supported if n_samples >= n_featuresrw   )r   rÉ   r   rH   ry   rz   r   rÊ   r   r   r    Útest_fit_mle_too_few_samples_  s    þrÍ   c                  C   sr   d\} }t j d¡ | |¡}t j|d d …d d…f dd|d d …df< tddd}| |¡ |j|d ksnt‚d S )	N)r‡   r"   r   r$   r9   r   r	   rv   r   )	r   r)   rB   rC   rF   r   r   r~   r   )rK   Zn_dimr   Zpca_sklr   r   r    Útest_mle_simple_casel  s    *
rÎ   c                  C   s   d\} }t  | |f¡}t jj|dd\}}}t|dd … t  |d ¡dd t  t|d| d¡sdt‚t	d|ƒD ]}t||| ƒt j
 ksnt‚qnd S )	N)é	   rˆ   T)Zfull_matricesr   r   r   rÄ   r#   )r   rE   r]   Zsvdr   rG   Úisfiniter   r   r   rÅ   )rK   r/   r   r¦   ÚsrL   r   r   r    Útest_assess_dimesion_rank_onew  s     rÒ   c                  C   s   t j d¡} d}|  d|¡}tdd|dd |¡}tddd |¡}tdd	dd
 |¡}tt  |j¡t  |j¡ƒ tt  |j¡t  |j¡ƒ dS )zßCheck that exposing and setting `n_oversamples` will provide accurate results
    even when `X` as a large number of features.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/20589
    r   r3   r‡   r   r   )r   r   Zn_oversamplesr=   r	   r   r
   rO   N)	r   r)   rB   rC   r   r   r   rl   re   )rJ   r/   r   Zpca_randomizedrT   Z
pca_arpackr   r   r    Ú%test_pca_randomized_svd_n_oversamples„  s    üûrÓ   c                  C   s6   t dd tj¡} |  ¡ }tdd„ tdƒD ƒ|ƒ dS )z Check feature names out for PCA.r#   r'   c                 S   s   g | ]}d |› ‘qS )r   r   )r‰   r²   r   r   r    r   £  s     z*test_feature_names_out.<locals>.<listcomp>N)r   r   r   r   Zget_feature_names_outr   r   )r   Únamesr   r   r    Útest_feature_names_outž  s    rÕ   c                 C   sV   t j d¡}| dd¡}tƒ  |¡}|j|j }t j|ddd 	¡ }t j
 ||¡ dS )z9Check the accuracy of PCA's internal variance calculationr   r‡   r    r   r?   N)r   r)   rB   rC   r   r   rQ   rR   r\   rc   Ztestingr   )r1   rJ   r   r   Zpca_varZtrue_varr   r   r    Útest_variance_correctness¦  s    rÖ   )Kr+   Znumpyr   rH   Zscipyr­   Znumpy.testingr   Zsklearnr   Zsklearn.datasetsr   Zsklearn.decompositionr   Zsklearn.decomposition._pcar   r   Zsklearn.utils._testingr   r   ZPCA_SOLVERSÚmarkZparametrizer   r   r   r!   r0   rM   rV   r)   rB   rC   rÉ   r_   ra   rg   rp   rq   rt   rk   r©   r}   Úminr   r‚   rƒ   r…   r’   r–   r˜   r¬   r™   rŸ   r¡   r§   r¨   rª   r*   r«   r±   r³   r¶   r´   rµ   rÀ   rÃ   rÆ   rË   rÍ   rÎ   rÒ   rÓ   rÕ   rÖ   r   r   r   r    Ú<module>   sæ   5
þú





 4ÿüþýþ




ýþ




ùþ





	