U
    3‰dÐ;  ã                   @   sB  d 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 ddlmZmZ dd	lmZ e ¡ Zd
d„ Zej dejejejg¡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_almost_equal)Úassert_array_almost_equal)Úassert_allclose_dense_sparse)Úassert_array_equal)Údatasets)ÚPCAÚIncrementalPCA)Úsparsec                  C   sÚ   t j} | jd d }td|d}tdd}| | ¡ | | ¡}|j| jd dfksVt‚tjj	|j
 ¡ |j
 ¡ dd dd| jd fD ]P}t||d	}| | ¡ | ¡ }| ¡ }tjj	t ||¡t | jd ¡d
d q„d S )Nr   é   é   ©Ún_componentsÚ
batch_size©r   çü©ñÒMbP?©Zrtolé   ©r   ç‚vIhÂ%<=©Zatol)ÚirisÚdataÚshaper   r   Úfit_transformÚAssertionErrorÚnpÚtestingÚassert_allcloseÚexplained_variance_ratio_ÚsumÚfitÚget_covarianceÚget_precisionÚdotÚeye)ÚXr   ÚipcaÚpcaÚX_transformedr   ÚcovÚ	precision© r+   úT/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/decomposition/tests/test_incremental_pca.pyÚtest_incremental_pca   s,    


ý

  ÿr-   Úmatrix_classc           
   	   C   s  t j}tdd}| |¡ | |ƒ}|jd d }td|d}| |¡}|j|jd dfks^t‚tjj	|j
 ¡ |j
 ¡ dd dd|jd fD ]P}t||d	}| |¡ | ¡ }| ¡ }	tjj	t ||	¡t |jd ¡d
d qŒtjtdd | |¡ W 5 Q R X 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#   r$   ÚpytestÚraisesÚ	TypeErrorÚpartial_fit)
r.   r%   r'   ZX_sparser   r&   r(   r   r)   r*   r+   r+   r,   Útest_incremental_pca_sparse.   s8    


ý

  ÿýr5   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 S )NéÏ  )éd   r
   gš™™™™™¹?é
   r
   é   é   r   r   r   r   ç      ð?)r   ÚrandomÚRandomStateÚrandnÚarrayr   r    Ú	transformÚsqrtr   r   Úabs)ÚrngÚnÚpr%   ZXtZYtr+   r+   r,   Ú%test_incremental_pca_check_projectionW   s      rF   c                  C   s~   t j d¡} d\}}|  ||¡}|d d …df  d9  < |dddg7 }tdd	d
 |¡}| |¡}| |¡}t||dd d S )Nr6   ©é2   r
   r   çñhãˆµøä>r:   r9   r
   r   r8   r   ©Údecimal)	r   r<   r=   r>   r   r    r@   Úinverse_transformr   )rC   rD   rE   r%   r&   ÚYZ	Y_inverser+   r+   r,   Útest_incremental_pca_inversel   s    

rN   c               	   C   s–   t  dddgdddgg¡} | j\}}d}tjtd ||¡d t|dd | ¡ W 5 Q R X d}tjtd	 ||¡d t|d
 	| ¡ W 5 Q R X d S )Nr   r   r9   zdn_components={} invalid for n_features={}, need more rows than columns for IncrementalPCA processingr/   r8   r   r
   zGn_components={} must be less or equal to the batch number of samples {}r   )
r   r?   r   r1   r2   Ú
ValueErrorÚformatr   r    r4   )r%   Ú	n_samplesÚ
n_featuresr   r+   r+   r,   Útest_incremental_pca_validation|   s(    
 ýý	 þýrS   c               	   C   sv   t dd} t ¡ & t dt¡ |  tj dd¡¡ W 5 Q R X t ¡ & t dt¡ |  	tj dd¡¡ W 5 Q R X d S )Nr:   r   Úerroré   )
r   ÚwarningsÚcatch_warningsÚsimplefilterÚRuntimeWarningr4   r   r<   r>   r    )r&   r+   r+   r,   Ú!test_n_samples_equal_n_components™   s    


rZ   c                  C   sr   t j d¡} dD ]\\}}|  ||¡}td d}| |¡ |jt|jƒksLt	‚| |¡ |j|j
jd kst	‚qd S )Nr6   ))rH   r8   )r8   rH   r   r   )r   r<   r=   Úrandr   r4   Zn_components_Úminr   r   Úcomponents_)rC   rQ   rR   r%   r&   r+   r+   r,   Útest_n_components_none¥   s    


r^   c               	   C   s¾   t j d¡} d}d}|  ||¡}|  ||¡}|  ||¡}tdd}| |¡ |jdd t t	¡ | 
|¡ W 5 Q R X |jdd t t	¡ | 
|¡ W 5 Q R X |jdd | 
|¡ d S )Nr6   r7   é   r   r8   é   )r   r<   r=   r>   r   r    Z
set_paramsr1   r2   rO   r4   )rC   rQ   rR   r%   ÚX2ZX3r&   r+   r+   r,   Útest_incremental_pca_set_params·   s     

rb   c               	   C   s`   t j d¡} d}|  |d¡}|  |d¡}td d}| |¡ t t¡ | 	|¡ W 5 Q R X d S )Nr6   r7   r_   rH   r   )
r   r<   r=   r>   r   r    r1   r2   rO   r4   )rC   rQ   r%   ra   r&   r+   r+   r,   Ú(test_incremental_pca_num_features_changeÎ   s    

rc   c            
      C   sš   t j d¡} d}d}|  ||¡}g }t  dd¡}|D ]"}td |d |¡}| |j¡ q4t	|d d… |dd … ƒD ]"\}}	t
t  |¡t  |	¡d	d
 qrd S )Nr6   r7   r
   r8   r_   r   éÿÿÿÿr   é   rJ   )r   r<   r=   r>   Úaranger   r    Úappendr]   Úzipr   Úsign©
rC   rQ   rR   r%   Úall_componentsÚbatch_sizesr   r&   ÚiÚjr+   r+   r,   Ú test_incremental_pca_batch_signsÚ   s    "ro   c            
      C   s   t j d¡} d}d}|  ||¡}g }t  ddd¡}|D ]"}td |d |¡}| |j¡ q6t	|d d… |dd … ƒD ]\}}	t
||	dd	 qtd S )
Nr6   r7   r
   r_   é(   r   rd   r   rJ   )r   r<   r=   r>   rf   r   r    rg   r]   rh   r   rj   r+   r+   r,   Ú!test_incremental_pca_batch_valuesê   s    "rq   c            
      C   sŒ   t j d¡} d}d}|  ||¡}g }t  ddd¡}|D ]"}td|d |¡}| |j¡ q6t	|d d… |dd … ƒD ]\}}	t
||	ƒ qtd S )	Nr6   r7   r_   éZ   r
   r   rd   r   )r   r<   r=   r>   rf   r   r    rg   r]   rh   r   )
rC   rQ   rR   r%   rk   rl   r   r&   Zcomponents_iZcomponents_jr+   r+   r,   Útest_incremental_pca_batch_rankú   s    "rs   c            
      C   sÎ   t j d¡} d\}}|  ||¡}|d d …df  d9  < |dddg7 }d}td	|d
 |¡}td	|d
}t  d|d |¡}t|d d… |dd … ƒD ]"\}}	| |||	…d d …f ¡ q”t	|j
|j
dd d S )Nr6   rG   r   rI   r:   r9   r
   r8   r   r   r   rd   rJ   )r   r<   r=   r>   r   r    rf   rh   r4   r   r]   )
rC   rD   rE   r%   r   r&   ZpipcaZ	batch_itrrm   rn   r+   r+   r,   Ú test_incremental_pca_partial_fit
  s    "rt   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   rB   )r%   ÚY_pcaÚY_ipcar+   r+   r,   Ú%test_incremental_pca_against_pca_iris  s    rx   c                  C   sn   t j d¡} d}d}|  ||¡d|  d|¡  }tdd |¡}tddd |¡}tt  	|¡t  	|¡dƒ d S )	Nr6   r7   r
   r:   r   r   ru   r   )
r   r<   r=   r>   r[   r   r   r   r   rB   )rC   rQ   rR   r%   rv   rw   r+   r+   r,   Ú,test_incremental_pca_against_pca_random_data(  s    ry   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éè  r7   ç        r8   r6   ©Ztail_strengthZeffective_rankÚrandom_stater
   )Néc   r   r   rJ   )
r   Úmake_low_rank_matrixr   r   r    r   r   Zexplained_variance_r   Znoise_variance_)r%   ÚprecrQ   rR   Úncr'   r&   r+   r+   r,   Útest_explained_variances5  s.        ÿ
  ÿ  ÿr‚   c            	      C   sè  t j d¡} 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}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	dddgdƒ t|j	dddgdƒ d S )Nr   rz   r7   r{   r8   r|   Úfull)r   Z
svd_solverr}   r   r   g       @Zfroé   )Zaxisén   r
   g‰A`åÐ"	@r   gX9´Èv¾@r;   é   )r   r<   r=   r   r   r   r    r   r   Úsingular_values_r@   r   ZlinalgZnormrA   r   r#   r]   )	rC   rQ   rR   r%   r'   r&   ZX_pcaZX_ipcaZX_hatr+   r+   r,   Útest_singular_valuesH  sp        ÿ

  ÿ  ÿ  ÿ  ÿ    ÿ


rˆ   c                  C   sÂ   t jdddddd} d}| j\}}dD ]–}td	|d
 | ¡}td	|dd | ¡}| | ¡}| | ¡}tt 	|¡t 	|¡|d | 
|¡}	| 
|¡}
t| |	|d t| |
|d t|
|	|d q&d S )Nrz   r8   r{   r   r6   r|   r
   )Né	   T)Úwhitenr   éú   )rŠ   r   r   rJ   )r   r   r   r   r    r   r@   r   r   rB   rL   )r%   r€   rQ   rR   r   r'   r&   Z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   rU   r   )r   r<   r=   r>   r   r4   ÚfloatZn_samples_seen_r‡   r   r   )rC   Ú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‡   )rC   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+   )Ú.0rm   r+   r+   r,   Ú
<listcomp>Ã  s     z:test_incremental_pca_feature_names_out.<locals>.<listcomp>N)r   r    r   r   Zget_feature_names_outr   Úrange)r&   Únamesr+   r+   r,   Ú&test_incremental_pca_feature_names_out¾  s    r–   ).Ú__doc__Znumpyr   r1   rV   Zsklearn.utils._testingr   r   r   Znumpy.testingr   Zsklearnr   Zsklearn.decompositionr   r   Zscipyr	   Z	load_irisr   r-   ÚmarkZparametrizeZ
csc_matrixZ
csr_matrixZ
lil_matrixr5   rF   rN   rS   rZ   r^   rb   rc   ro   rq   rs   rt   rx   ry   r‚   rˆ   rŒ   r   r‘   r–   r+   r+   r+   r,   Ú<module>   sH    ÿ
&
9