U
    3‰d  ã                   @   s°  d Z ddlZddlm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gZejdd	d
d„ ƒZej ddg¡ej dd¡dd„ ƒƒZej dd¡dd„ ƒZej ddddg¡dd„ ƒZej dd¡dd„ ƒZej de¡d d!„ ƒZd"d#„ Zej dd¡ej dd$d%g¡ej de¡d&d'„ ƒƒƒZej dd¡ej de¡d(d)„ ƒƒZej de¡d*d+„ ƒZej de¡d,d-„ ƒZd.d/„ Zej d0d1d2d3g¡ej dd¡d4d5„ ƒƒZdS )6zTest truncated SVD transformer.é    N)ÚTruncatedSVDÚPCA)Úcheck_random_state)Úassert_array_lessÚassert_allcloseÚarpackÚ
randomizedÚmodule)Zscopec                  C   s:   t dƒ} tjdddd| d}dt |j¡ |jd d …< |S )Né*   é<   é7   çš™™™™™É?Úcsr)ZdensityÚformatÚrandom_stateé   )r   ÚspÚrandomÚnpÚlogÚdata)ÚrngÚX© r   úR/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/decomposition/tests/test_truncated_svd.pyÚX_sparse   s    r   ÚsolverÚkind)ÚdenseÚsparsec           
      C   sÊ   |dkr| n|   ¡ }tddd}td|ddd}| |¡d d …d d…f }| |¡d d …d d…f }t||d	d
 t |j¡}t |j¡}	t|d d… |	d d… dd
 t|dd … |	dd … dd d S )Nr   é   r   ©Ú	algorithmr
   éd   )r"   r   Zn_oversamplesé   gü©ñÒMb`?©Úrtolé	   gü©ñÒMbP?ç{®Gáz„?©Úatol)Útoarrayr   Úfit_transformr   r   ÚabsÚcomponents_)
r   r   r   r   Zsvd_aÚsvdZXaZXrZcomp_aÚcompr   r   r   Útest_solvers   s    r1   Ún_components)é
   é   é)   r   c                 C   s>   |j d }t| ƒ |¡}|j| ks&t‚|jj | |fks:t‚d S )Nr   )Úshaper   Úfitr2   ÚAssertionErrorr.   )r2   r   Ú
n_featuresÚtsvdr   r   r   Útest_attributes*   s    
r;   zalgorithm, n_components)r   r   )r   é8   )r   r<   c              	   C   s0   t ||d}t t¡ | | ¡ W 5 Q R X d S )N)r2   r"   )r   ÚpytestZraisesÚ
ValueErrorr7   )r   r"   r2   r:   r   r   r   Útest_too_many_components2   s    	r?   Úfmt)Úarrayr   ZcscZcooZlilc                 C   sp   |j d }| dkr| ¡ nt|d|  ƒƒ }tdd}| |¡}|j |dfksPt‚| |¡}|j |dfkslt‚d S )Nr   r   Útoé   ©r2   )r6   r+   Úgetattrr   r,   r8   Ú	transform)r@   r   Ú	n_samplesZXfmtr:   ÚXtransr   r   r   Útest_sparse_formats@   s    
 


rI   Úalgoc                 C   s:   t dd| d}| |¡}| |¡}t|| ¡ ddd d S )Né4   r
   )r2   r   r"   gš™™™™™¹?r   )r&   r*   )r   r,   Zinverse_transformr   r+   )rJ   r   r:   ZXtZXinvr   r   r   Útest_inverse_transformK   s    

rL   c                 C   sB   | j d }|  tj¡}tdd}| |¡}|j ||jfks>t‚d S )Nr   r$   rD   )r6   Zastyper   Zint64r   r,   r2   r8   )r   rG   ZXintr:   rH   r   r   r   Útest_integersU   s
    


rM   r3   é   c           
      C   s‚   |dkr| n|   ¡ }t||d}| |¡}td|jƒ t|j ¡ dƒ tj|   ¡ dd ¡ }tj|dd}|| }	t|j|	ƒ d S )Nr   r!   ç        ç      ð?r   ©Zaxis)	r+   r   r,   r   Úexplained_variance_ratio_Úsumr   Úvarr   )
r   r   r2   r   r   r/   ZX_trZtotal_varianceZ	variancesZtrue_explained_variance_ratior   r   r   Útest_explained_variance]   s    
þrU   c                 C   sr   |dkr| n|   ¡ }td|dd |¡}td|dd |¡}t|j|jd d… dd |j ¡ |j ¡ ksnt‚d S )Nr   r3   )r"   Ún_iterrN   g{®Gázt?r%   )r+   r   r7   r   rR   rS   r8   )r   r   r   r   Zsvd_10Zsvd_20r   r   r   Ú(test_explained_variance_components_10_20u   s    ýÿrW   c                 C   sŽ   t j d¡}d\}}| ||¡}td| |d |¡}| |¡}tt  |j	d ¡t j
 |d¡d dd t|j	t  t j|d dd	¡dd d S )
Nr   )r#   éP   é   ©r2   r"   r   ç       @Zfror(   r%   rQ   )r   r   ÚRandomStateÚrandnr   r7   rF   r   rS   Úsingular_values_ZlinalgZnormÚsqrt)r   r   rG   r9   r   ÚpcaÚX_pcar   r   r   Ú test_singular_values_consistency‰   s    
ý  ÿrb   c                 C   s¶   t j 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d d S )Nr   r#   én   é   rZ   r[   rQ   g‰A`åÐ"	@r   gX9´Èv¾@rP   g›+¡†›„=r%   )r   r   r\   r]   r   r,   r_   rS   Údotr.   r7   r   r^   )r   r   rG   r9   r   r`   ra   Z	X_hat_pcar   r   r   Útest_singular_values_expected    s    

rf   c                 C   sŒ   |   ¡ }||jdd }tddd}tf ddi|—Ž}tf ddi|—Ž}| |¡}| |¡}t||d	d
 t|jdd	d t|j|jƒ d S )Nr   rQ   r3   r
   )r2   r   r"   r   Z
svd_solverg•Ö&è.>r%   r)   )	r+   ZmeanÚdictr   r   r,   r   Zmean_r.   )r   ZX_denseZX_cÚparamsr/   r`   ZXt_svdZXt_pcar   r   r   Útest_truncated_svd_eq_pcaµ   s    

ri   zalgorithm, tol)r   rO   )r   gíµ ÷Æ°>)r   rO   c                 C   sN   |dkr| n|   ¡ }tddd||d}| |¡}| |¡ |¡}t||ƒ d S )Nr   é   é   r
   )r2   rV   r   r"   Útol)r+   r   r,   r7   rF   r   )r   r"   rl   r   r   r/   ZX_transformed_1ZX_transformed_2r   r   r   Útest_fit_transformÉ   s        ÿ
rm   ) Ú__doc__Znumpyr   Zscipy.sparser   r   r=   Zsklearn.decompositionr   r   Zsklearn.utilsr   Zsklearn.utils._testingr   r   ZSVD_SOLVERSZfixturer   ÚmarkZparametrizer1   r;   r?   rI   rL   rM   rU   rW   rb   rf   ri   rm   r   r   r   r   Ú<module>   sZ   


ýþ



	

 ÿ