o
    ¢ÄiB  ã                   @   sJ  d Z ddlZddlZddlZddlZddlmZmZ ddl	m
Z
 ddlmZmZ ddlmZmZmZ ddlmZmZmZ e
 ¡ Zdd	„ Zej d
ee e ¡dd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z dd„ Z!dd„ Z"dd„ Z#dd„ Z$dd „ Z%d!d"„ Z&d#d$„ Z'd%d&„ Z(d'd(„ Z)d)d*„ Z*d+d,„ Z+d-d.„ Z,d/d0„ Z-d1d2„ Z.d3d4„ Z/dS )5zTests for Incremental PCA.é    N)Úassert_allcloseÚassert_array_equal)Údatasets)ÚPCAÚIncrementalPCA)Úassert_allclose_dense_sparseÚassert_almost_equalÚassert_array_almost_equal)ÚCSC_CONTAINERSÚCSR_CONTAINERSÚLIL_CONTAINERSc                  C   sÚ   t j} | jd d }td|d}tdd}| | ¡ | | ¡}|j| jd dfks+J ‚tjj|j	 
¡ |j	 
¡ dd dd| jd fD ](}t||d	}| | ¡ | ¡ }| ¡ }tjjt ||¡t | jd ¡d
d qBd S )Nr   é   é   ©Ún_componentsÚ
batch_size©r   çü©ñÒMbP?©Zrtolé   ©r   ç‚vIhÂ%<=©Úatol)ÚirisÚdataÚshaper   r   Úfit_transformÚnpÚtestingr   Úexplained_variance_ratio_ÚsumÚfitÚget_covarianceÚget_precisionÚdotÚeye)ÚXr   ÚipcaÚpcaÚX_transformedr   ÚcovÚ	precision© r-   új/home/kim/smarthome/.venv/lib/python3.10/site-packages/sklearn/decomposition/tests/test_incremental_pca.pyÚtest_incremental_pca   s*   


ý
ÿûr/   Úsparse_containerc           
      C   s  t j}tdd}| |¡ | |ƒ}|jd d }td|d}| |¡}|j|jd dfks/J ‚tjj|j	 
¡ |j	 
¡ dd dd|jd fD ](}t||d	}| |¡ | ¡ }| ¡ }	tjjt ||	¡t |jd ¡d
d qFtjtdd | |¡ W d   ƒ d S 1 s‡w   Y  d S )Nr   r   r   r   r   r   r   r   r   r   r   z…IncrementalPCA.partial_fit does not support sparse input. Either convert data to dense or use IncrementalPCA.fit to do so in batches.©Úmatch)r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   ÚpytestÚraisesÚ	TypeErrorÚpartial_fit)
r0   r'   r)   ZX_sparser   r(   r*   r   r+   r,   r-   r-   r.   Útest_incremental_pca_sparse1   s6   


ý
ÿý"ør7   c                 C   sª   t j | ¡}d\}}| ||¡d }|d d…  t  g d¢¡7  < d| d|¡ t  g d¢¡ }tdd |¡ |¡}|t  |d  	¡ ¡ }t
t  |d d ¡d	dƒ d S )
N)éd   r   gš™™™™™¹?é
   )r   é   é   r   r   r   r   ç      ð?)r   ÚrandomÚRandomStateÚrandnÚarrayr   r"   Ú	transformÚsqrtr!   r   Úabs)Úglobal_random_seedÚrngÚnÚpr'   ZXtZYtr-   r-   r.   Ú%test_incremental_pca_check_projectionZ   s   rH   c                 C   s|   t j | ¡}d\}}| ||¡}|d d …df  d9  < |g d¢7 }tddd |¡}| |¡}| |¡}t||dd	 d S )
N©é2   r   r   çñhãˆµøä>©r;   r:   r   r   r9   r   r   ©Údecimal)	r   r=   r>   r?   r   r"   rA   Úinverse_transformr   )rD   rE   rF   rG   r'   r(   ÚYZ	Y_inverser-   r-   r.   Útest_incremental_pca_inverseo   s   

rQ   c                  C   sÂ   t  g d¢g d¢g¡} | j\}}d}tjtd ||¡d t|dd | ¡ W d   ƒ n1 s1w   Y  d}tjtd	|› d
|› dd t|d 	| ¡ W d   ƒ d S 1 sZw   Y  d S )N)r   r   r   )r   r   r   r:   zdn_components={} invalid for n_features={}, need more rows than columns for IncrementalPCA processingr1   r9   r   r   zn_components=z6 must be less or equal to the batch number of samples z  for the first partial_fit call.r   )
r   r@   r   r3   r4   Ú
ValueErrorÚformatr   r"   r6   )r'   Ú	n_samplesÚ
n_featuresr   r-   r-   r.   Útest_incremental_pca_validation   s&   
ú	÷ÿý"ùrV   c                  C   s    t dd} t ¡  t dt¡ |  tj dd¡¡ W d   ƒ n1 s$w   Y  t ¡  t dt¡ |  	tj dd¡¡ W d   ƒ d S 1 sIw   Y  d S )Nr;   r   Úerroré   )
r   ÚwarningsÚcatch_warningsÚsimplefilterÚRuntimeWarningr6   r   r=   r?   r"   )r(   r-   r-   r.   Ú!test_n_samples_equal_n_components›   s   

þ
"þr]   c                  C   sr   t j d¡} dD ].\}}|  ||¡}td d}| |¡ |jt|jƒks&J ‚| |¡ |j|j	jd ks6J ‚qd S )NéÏ  ))rJ   r9   )r9   rJ   r   r   )
r   r=   r>   Úrandr   r6   Zn_components_Úminr   Úcomponents_)rE   rT   rU   r'   r(   r-   r-   r.   Útest_n_components_none§   s   


ôrb   c                  C   sæ   t j d¡} d}d}|  ||¡}|  ||¡}|  ||¡}tdd}| |¡ |jdd t t	¡ | 
|¡ W d   ƒ n1 sAw   Y  |jdd t t	¡ | 
|¡ W d   ƒ n1 saw   Y  |jdd | 
|¡ d S )Nr^   r8   é   r   r9   é   )r   r=   r>   r?   r   r"   Z
set_paramsr3   r4   rR   r6   )rE   rT   rU   r'   ÚX2ZX3r(   r-   r-   r.   Útest_incremental_pca_set_params¹   s$   

ÿÿrf   c                  C   sv   t j d¡} d}|  |d¡}|  |d¡}td d}| |¡ t t¡ | 	|¡ W d   ƒ d S 1 s4w   Y  d S )Nr^   r8   rc   rJ   r   )
r   r=   r>   r?   r   r"   r3   r4   rR   r6   )rE   rT   r'   re   r(   r-   r-   r.   Ú(test_incremental_pca_num_features_changeÐ   s   

"ÿrg   c                 C   sŠ   t j | ¡}d}d}| ||¡}g }t  dd¡}|D ]}td |d |¡}| |j¡ qt	 
|¡D ]\}	}
tt  |	¡t  |
¡dd q1d S )Nr8   r   r9   rc   r   é   rM   )r   r=   r>   r?   Úaranger   r"   Úappendra   Ú	itertoolsÚpairwiser   Úsign©rD   rE   rT   rU   r'   Úall_componentsÚbatch_sizesr   r(   ÚiÚjr-   r-   r.   Ú test_incremental_pca_batch_signsÜ   s   ÿrs   c                  C   s´   t j d¡} d\}}|  ||¡}|d d …df  d9  < |g d¢7 }|}t|d}| |d |… ¡ t||ƒD ]}| |||d … ¡ q7t|d}| |¡ t	|j
|j
dd d S )	Nr^   rI   r   rK   rL   r   r   r   )r   r=   r>   r?   r   r6   Úranger   r"   r   ra   )rE   rF   rG   r'   r   ÚpipcaÚidxr)   r-   r-   r.   Ú,test_incremental_pca_partial_fit_small_batchì   s   


rw   c                 C   s€   t j | ¡}d}d}| ||¡}g }t  ddd¡}|D ]}td |d |¡}| |j¡ qt	 
|¡D ]\}	}
t|	|
dd q2d S )Nr8   r   rc   é(   r   r   rM   )r   r=   r>   r?   ri   r   r"   rj   ra   rk   rl   r   rn   r-   r-   r.   Ú!test_incremental_pca_batch_values  s   ÿry   c            
      C   s|   t j d¡} d}d}|  ||¡}g }t  ddd¡}|D ]}td|d |¡}| |j¡ qt	 
|¡D ]	\}}	t||	ƒ q2d S )Nr^   r8   rc   éZ   r   r   )r   r=   r>   r?   ri   r   r"   rj   ra   rk   rl   r   )
rE   rT   rU   r'   ro   rp   r   r(   Zcomponents_iZcomponents_jr-   r-   r.   Útest_incremental_pca_batch_rank  s   ÿr{   c                 C   s¼   t j | ¡}d\}}| ||¡}|d d …df  d9  < |g d¢7 }d}td|d |¡}td|d}t  d|d |¡}t |¡D ]\}	}
| 	||	|
…d d …f ¡ qAt
|j|jd	d
 d S )NrI   r   rK   rL   r9   r   r   r   r   rM   )r   r=   r>   r?   r   r"   ri   rk   rl   r6   r   ra   )rD   rE   rF   rG   r'   r   r(   ru   Z	batch_itrrq   rr   r-   r-   r.   Ú test_incremental_pca_partial_fit!  s   r|   c                  C   sD   t j} tdd | ¡}tddd | ¡}tt |¡t |¡dƒ d S )Nr   r   é   r   r   )r   r   r   r   r   r   r   rC   )r'   ÚY_pcaÚY_ipcar-   r-   r.   Ú%test_incremental_pca_against_pca_iris5  s   r€   c                 C   sn   t j | ¡}d}d}| ||¡d| d|¡  }tdd |¡}tddd |¡}tt  	|¡t  	|¡dƒ d S )Nr8   r   r;   r   r   r}   r   )
r   r=   r>   r?   r_   r   r   r   r   rC   )rD   rE   rT   rU   r'   r~   r   r-   r-   r.   Ú,test_incremental_pca_against_pca_random_data?  s   r   c                  C   sˆ   t jdddddd} d}| j\}}dD ].}t|d	 | ¡}t|dd
 | ¡}t|j|j|d t|j|j|d t|j	|j	|d qd S )Néè  r8   ç        r9   r^   ©Ztail_strengthZeffective_rankÚrandom_stater   )Néc   r   r   rM   )
r   Úmake_low_rank_matrixr   r   r"   r   r   Zexplained_variance_r    Znoise_variance_)r'   ÚprecrT   rU   Úncr)   r(   r-   r-   r.   Útest_explained_variancesL  s    
ÿ

ÿ
ÿ÷rŠ   c           
      C   sä  t j | ¡}d}d}tj||dd|d}tdd|d |¡}tddd	 |¡}t|j	|j	d
ƒ | 
|¡}| 
|¡}tt  |j	d ¡t j |d¡d dƒ tt  |j	d ¡t j |d¡d d
ƒ t|j	t  t j|d dd¡dƒ t|j	t  t j|d dd¡d
ƒ t j | ¡}d}d}tj||dd|d}tdd|d}tddd	}| |¡}|t  t j|d dd¡ }|d d …df  d9  < |d d …df  d9  < t  ||j¡}	| |	¡ | |	¡ t|j	g d¢dƒ t|j	g d¢dƒ d S )Nr‚   r8   rƒ   r9   r„   Úfull)r   Z
svd_solverr…   é–   r   r   g       @Zfroé   r   )Zaxisén   r   ç‰A`åÐ"	@r   çX9´Èv¾@)r   r   r<   é   )r   r=   r>   r   r‡   r   r"   r   r	   Úsingular_values_rA   r!   ZlinalgZnormrB   r   r%   ra   )
rD   rE   rT   rU   r'   r)   r(   ZX_pcaZX_ipcaZX_hatr-   r-   r.   Útest_singular_values_  sP   
ÿ

 ÿ ÿÿÿ
ÿ


r“   c                 C   sÚ   t jdddd| d}d}dD ]\}td|d	 |¡}td|d
d |¡}|jdk}| |¡}| |¡}tt 	|¡d d …|f t 	|¡d d …|f |d | 
|¡}	| 
|¡}
t||	|d t||
|d t|
|	|d qd S )Nr‚   r9   rƒ   r   r„   r   )Né	   T)Úwhitenr   éú   )r•   r   r   gê-™—q=r   )r   r‡   r   r"   r   r    rA   r   r   rC   rO   )rD   r'   r   r‰   r)   r(   Zstable_maskZXt_pcaZXt_ipcaZ	Xinv_ipcaZXinv_pcar-   r-   r.   Útest_whitening˜  s*   
ÿ


ý
	
çr—   c                  C   s’   t j d¡} |  dd¡d }|  dd¡d }tdd}| |¡ t|jƒ|_| |¡ |j}tdd}| |¡ | |¡ |j}t j	 
||¡ d S )Nr   r;   r   r   rX   r   )r   r=   r>   r?   r   r6   ÚfloatZn_samples_seen_r’   r   r   )rE   ÚAÚBr)   Z singular_vals_float_samples_seenZpca2Zsingular_vals_int_samples_seenr-   r-   r.   Ú/test_incremental_pca_partial_fit_float_divisionº  s   





ÿr›   c                  C   sX   t j d¡} |  dd¡}tddd}| |¡ tdd}| |¡ t j |j	|j	¡ d S )Nr   i ¡ r   i'  r   r   )
r   r=   r>   r_   r   r"   r   r   r   r’   )rE   r™   r(   r)   r-   r-   r.   Ú'test_incremental_pca_fit_overflow_errorÓ  s   


rœ   c                  C   s6   t dd tj¡} |  ¡ }tdd„ tdƒD ƒ|ƒ dS )z+Check feature names out for IncrementalPCA.r   r   c                 S   s   g | ]}d |› ‘qS )Zincrementalpcar-   )Ú.0rq   r-   r-   r.   Ú
<listcomp>ç  s    z:test_incremental_pca_feature_names_out.<locals>.<listcomp>N)r   r"   r   r   Zget_feature_names_outr   rt   )r(   Únamesr-   r-   r.   Ú&test_incremental_pca_feature_names_outâ  s   r    )0Ú__doc__rk   rY   Únumpyr   r3   Znumpy.testingr   r   Zsklearnr   Zsklearn.decompositionr   r   Zsklearn.utils._testingr   r   r	   Zsklearn.utils.fixesr
   r   r   Z	load_irisr   r/   ÚmarkZparametrizer7   rH   rQ   rV   r]   rb   rf   rg   rs   rw   ry   r{   r|   r€   r   rŠ   r“   r—   r›   rœ   r    r-   r-   r-   r.   Ú<module>   sH    ÿ
&
9"