a
    ;ZaCX                     @   s  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 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 d dlmZ d dlmZ d dlmZ ejddgddgddgddgddgddggddZeg dZeg dZejdgdgdgdgdgdggddZed d gddgddgddgddgddgddgddgddgg	Zeg dZ eg dZ!edgdgdgdgd gdgdgdgdgg	Z"edd gdd gdd gdd gd d gdd gdd gdd gdd gg	Z#eg dZ$ej%e&de'df Z(eg d Z)g d!Z*d"d# Z+ej,-d$ddgej,-d%g d&d'd( Z.d)d* Z/d+d, Z0d-d. Z1d/d0 Z2d1d2 Z3d3d4 Z4d5d6 Z5ej,-d7e6d8d9d: Z7d;d< Z8ej,-d=dd>gej,-d$d>dgd?d@ Z9ej,-dAej:ej:fej;ej;fej<ej;fej=ej;fgdBdC Z>dDdE Z?dFdG Z@dHdI ZAdJdK ZBdLdM ZCdNdO ZDej,-d%dPdQgdRdS ZEdS )T    N)linalg)check_random_state)assert_array_equal)assert_array_almost_equal)assert_allclose)assert_almost_equal)
make_blobs)LinearDiscriminantAnalysis)QuadraticDiscriminantAnalysis)_cov)ledoit_wolf)KMeans)ShrunkCovariance)
LedoitWolf)StandardScaler      f)dtype)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   r   r   r   r   r      )r   r   )r   r   r   r   r   r   r   r   )	)svdN)lsqrN)eigenN)r   auto)r   r   )r   Q?)r   r   )r   r   )r   r   c            	      C   s*  t D ]} | \}}t||d}|ttt}t|td|  |ttt}t|td|  |t}t|d d df dkd td|  |	t}t
t||ddd| d |ttt}t|tksJ d| qtddd}tt |tt W d    n1 s0    Y  td	d
d}tt |tt W d    n1 s`0    Y  tddd}tt |tt W d    n1 s0    Y  tdtddgd}tjtdd |tt W d    n1 s0    Y  tddt d}tjtdd |tt W d    n1 sB0    Y  td
d}tt |tt W d    n1 s0    Y  tdt d}tjtdd |tt W d    n1 s0    Y  tdtddd}tjtdd |tt W d    n1 s0    Y  d S )Nsolver	shrinkagez	solver %sr         ?ư>)rtolatolerr_msgr   giq̿r   Zdummyr   r   r   z%shrinkage must be a float or a stringmatch皙?)r    r!   covariance_estimatorz[covariance_estimator and shrinkage parameters are not None. Only one of the two can be set.r    )r    r*   z.covariance estimator is not supported with svd)Z
n_clustersz,KMeans does not have a covariance_ attribute)solver_shrinkager	   fitXypredictr   X1predict_probapredict_log_probar   npexpy3anypytestraises
ValueErrorNotImplementedErrorarray	TypeErrorr   r   r   )	Z	test_caser    r!   clfy_predy_pred1y_proba_pred1y_log_proba_pred1y_pred3 rD   Glib/python3.9/site-packages/sklearn/tests/test_discriminant_analysis.pytest_lda_predictG   sl    
$
	,,,,,
,,
rF   	n_classesr    r   r   r   c              
      s  ddd}t ddgddgddggd  }t ddgdd	gggt| }|d
||dd\}}t| dd d||}t|j|dd t|j|d dd t	|d }g  g t
t|d D ]d}	 t |||	 |d  d d t jf  t d||	 |d  t jd d f   d  qt ddggdd t  fddt
d D }
dt |
 }tddt fddt
d D   }|t|ksJ t|t |
|gt j dd d S )Nc                    sT   t |t fddt |D }t fddtt D }||fS )zNGenerate a multivariate normal data given some centers and
        covariancesc                    s(   g | ] \}}j ||t  d qS )size)Zmultivariate_normallen).0Zmeancovcenters	n_samplesrngrD   rE   
<listcomp>   s   zDtest_lda_predict_proba.<locals>.generate_dataset.<locals>.<listcomp>c                    s   g | ]}|gt    qS rD   )rK   rL   clazz)rO   rP   rD   rE   rR          )r   r4   vstackziphstackrangerK   )rP   rO   covariancesrandom_stater.   r/   rD   rN   rE   generate_dataset   s    z0test_lda_predict_proba.<locals>.generate_datasetr   (   i   
   d   i_ *   )rP   rO   rZ   r[   T)r    store_covariancer!   r)   )r%   r   r         i   c                 S   s   t || t | ||  S )N)r4   r5   dot)sampleZcoefZ	interceptrT   rD   rD   rE   discriminant_func   s    z1test_lda_predict_proba.<locals>.discriminant_funcc              
      sF   g | ]>}t  |d t fddtd  D   qS )r   c                    s   g | ]} |qS rD   rD   rS   alpha_k	alpha_k_0rh   rg   rD   rE   rR      s   z5test_lda_predict_proba.<locals>.<listcomp>.<listcomp>)floatsumrY   rS   rj   rk   rh   rG   rg   rD   rE   rR      s   
z*test_lda_predict_proba.<locals>.<listcomp>c                    s   g | ]} |qS rD   rD   rS   ri   rD   rE   rR      s   {Gz?)N)r4   r<   rK   r	   r-   r   means_covariance_r   invrY   appendrf   newaxisrm   rl   r8   Zapproxr2   rX   )r    rG   r\   Zblob_centersZ	blob_stdsr.   r/   ldaZ	precisionrT   ZprobZprob_refZ
prob_ref_2rD   rn   rE   test_lda_predict_proba   sb    
$ 
$ 

rv   c                  C   s   t ddg} t| d}d}tjt|d |tt W d    n1 sL0    Y  tddgd}|tt t ddg} t ddg}t| d}t	t
 |tt W d    n1 s0    Y  t|j|d	 d S )
Nr"   rd   priorszpriors must be non-negativer'   333333??g?r   )r4   r<   r	   r8   r9   r:   r-   r.   r/   warnsUserWarningr   Zpriors_)rx   r>   msgZ
prior_normrD   rD   rE   test_lda_priors   s    
*
*r~   c                  C   s   d} d}d}t || |dd\}}tdd}tdd}tdd}||| ||| ||| t|j|jd	 t|j|jd	 t|j|jd	 d S )
Nr   i     rP   
n_featuresrO   r[   r   r+   r   r   r   )r   r	   r-   r   coef_)r   rG   rP   r.   r/   clf_lda_svdZclf_lda_lsqrclf_lda_eigenrD   rD   rE   test_lda_coefs  s    



r   c                  C   s   t ddd} | ttt}|jd dks0J t ddd} | ttt}|jd dks`J t ddd} | tt d}tjt|d | t W d    n1 s0    Y  d S )Nr   r   )r    n_componentsr   r   z$transform not implemented for 'lsqr'r'   )	r	   r-   r.   r/   	transformshaper8   r9   r;   )r>   ZX_transformedr}   rD   rD   rE   test_lda_transform)  s    r   c                  C   s   t jd} | jdddd}| jdddd}tdd	}||| t|j	 d
d |jj
dkshJ dtdd	}||| t|j	 d
d |jj
dksJ dt|j|j d S )Nr   ra   )r^      )ZlocZscalerJ   r   )r^   rI   r   r+         ?)r   z/Unexpected length for explained_variance_ratio_r   )r4   randomRandomStateZnormalrandintr	   r-   r   Zexplained_variance_ratio_rm   r   r   )stater.   r/   r   r   rD   rD   rE   !test_lda_explained_variance_ratio:  s$    

r   c               	   C   sz  t g dg dg dg dg} t g dg dg dg dg d	g d
g}| d d t jd d f |t jd d d d f  d}t t | jd |jd }tdd||}|	| }|d |d  }|d |d  }|t 
t |d  }|t 
t |d  }tt |	|jt d tt t |d d ddgd tt t |d d ddgd d S )N)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   r   r   r   )r4   r<   rt   reshaperepeataranger   r	   r-   r   Zsqrtrm   r   rM   TZeyeabsrf   )ZmeansZscatterr.   r/   r>   Zmeans_transformedZd1Zd2rD   rD   rE   test_lda_orthogonalityW  s*    "6
$r   c                  C   s   d} t jd}|dd| dfg d }|dd| dfg d }t ||fg d }dg|  dg|   }d	D ]2}t|d
}|||||dksrJ d| qrd S )Nra   i  r   r   r   )r]   r   r   )r`   r   r   )r   ra   i'  rH   r+   r   zusing covariance: %s)r4   r   r   ZuniformrV   r	   r-   Zscore)nrQ   Zx1Zx2xr/   r    r>   rD   rD   rE   test_lda_scaling  s    
r   c                  C   s   dD ]d} t | dtt}t|ds(J t | ddtt}t|dsJJ t|jtddgddgg qt d	dtt}t|drJ t | ddtt}t|dsJ t|jtddgddgg d S )
N)r   r   r+   rq   T)r    rc   gil?gam?g	^?r   )	r	   r-   X6y6hasattrr   rq   r4   r<   )r    r>   rD   rD   rE   test_lda_store_covariance  s"    r   seedr`   c                 C   s   t j| }|dd}|jddd}tdddd}tdtdd	dd
}||| ||| t|j	|j	 t|j
|j
 d S )Nra   r`   r   rI   Tr"   r   rc   r!   r    )r!   rc   r*   r    )r4   r   r   randr   r	   r   r-   r   rp   rq   )r   rQ   r.   r/   c1c2rD   rD   rE   test_lda_shrinkage  s    r   c                  C   s   G dd d} t jd}|dd}|jddd}td	d
dd}td	|  dd}||| ||| t|j|j t|j	|j	 d S )Nc                   @   s   e Zd Zdd ZdS )z3test_lda_ledoitwolf.<locals>.StandardizedLedoitWolfc                 S   sR   t  }||}t|d }|jd d tjf | |jtjd d f  }|| _d S )Nr   )r   Zfit_transformr   Zscale_r4   rt   rq   )selfr.   ZscZX_scsrD   rD   rE   r-     s
    
,z7test_lda_ledoitwolf.<locals>.StandardizedLedoitWolf.fitN)__name__
__module____qualname__r-   rD   rD   rD   rE   StandardizedLedoitWolf  s   r   r   ra   r`   r   )ra   rI   Tr   r   r   r   )
r4   r   r   r   r   r	   r-   r   rp   rq   )r   rQ   r.   r/   r   r   rD   rD   rE   test_lda_ledoitwolf  s     	r   r   r   c           
   	   C   s  t d}d}|||}tt| ||  d d | }t|| d }|d d |fD ]D}t|d}td  |	|| W d    qT1 s0    Y  qT|d t
|| d d fD ]L}t|d}d}	tjt|	d |	|| W d    q1 s0    Y  qd S )Nr   r`   r   )r   z#n_components cannot be larger than r'   )r   Zrandnr4   ZtilerY   minr	   r8   r{   r-   maxr9   r:   )
rG   r   rQ   rP   r.   r/   Zmax_componentsr   ru   r}   rD   rD   rE   test_lda_dimension_warning  s     
,
r   zdata_type, expected_typec                 C   sF   t D ]<\}}t||d}|t| t|  |jj|ksJ qd S )Nr   )r,   r	   r-   r.   astyper/   r   r   )Z	data_typeZexpected_typer    r!   r>   rD   rD   rE   test_lda_dtype_match  s    
r   c                  C   sx   t D ]n\} }t| |d}|ttjttj t| |d}|ttjttj d}t	|j
|j
|d qd S )Nr   r#   )r$   )r,   r	   r-   r.   r   r4   float32r/   float64r   r   )r    r!   Zclf_32Zclf_64r$   rD   rD   rE   ,test_lda_numeric_consistency_float32_float64  s    r   c                  C   s   t  } | ttt}t|t | ttt}t|t | t}t|d d df dkd t | t}t	t
||d | ttt}t
|tksJ tt | tt W d    n1 s0    Y  d S )Nr   r"   r   )r
   r-   r   r   r0   r   X7r2   r3   r   r4   r5   y7r7   r8   r9   r:   y4)r>   r?   r@   rA   rB   rC   rD   rD   rE   test_qda  s    



r   c                  C   sr   t  } | ttt}t|dk}d}t t|d| gd} | ttt}t|dk}||ksnJ d S )Nr   g|=r   rw   )r
   r-   r   r   r0   r4   rm   r<   )r>   r?   Zn_posnegZn_pos2rD   rD   rE   test_qda_priors3  s    r   c                  C   s   t  tt} t| drJ t ddtt} t| ds<J t| jd tddgddgg t| jd tdd	gd	d
gg d S )Nrq   T)rc   r   gffffff?rz   r   gQUU?gQUUտgvWUU?)	r
   r-   r   r   r   r   rq   r4   r<   )r>   rD   rD   rE   test_qda_store_covariance@  s    "r   c                  C   sD  d} t  }tjt| d |tt}W d    n1 s:0    Y  tjtdd |t}W d    n1 sr0    Y  t	
|tksJ t dd}tjt| d |tt W d    n1 s0    Y  |t}t|t t dd}tjt| d |tt W d    n1 s"0    Y  |t}t|t d S )NzVariables are collinearr'   zdivide by zeroro   )Z	reg_paramr)   )r
   r8   r{   r|   r-   X2r   RuntimeWarningr0   r4   r7   r   X5y5)Zcollinear_msgr>   r?   Zy_pred5rD   rD   rE   test_qda_regularizationQ  s"    *(
*


,
r   c                  C   st   t ddddd\} }t| t| jd d | jd | jd } t| d}t||j t| d}t||j d S )	Nra   r   r   rb   r   r   Z	empiricalr   )	r   r4   rf   r   r   r   r   r   r   )r   r/   Zc_eZc_srD   rD   rE   test_covarianceu  s    0

r   z	svd, lsqrr   c                 C   sl   t ddgddgg}t ddg}t| d}tjtdd ||| W d   n1 s^0    Y  dS )	zg
    Tests that if the number of samples equals the number
    of classes, a ValueError is raised.
    r"   ry   abr+   z"The number of samples must be morer'   N)r4   r<   r	   r8   r9   r:   r-   )r    r.   r/   r>   rD   rD   rE   =test_raises_value_error_on_same_number_of_classes_and_samples  s
    
r   )FZnumpyr4   r8   Zscipyr   Zsklearn.utilsr   Zsklearn.utils._testingr   r   r   r   Zsklearn.datasetsr   Zsklearn.discriminant_analysisr	   r
   r   Zsklearn.covariancer   Zsklearn.clusterr   r   r   Zsklearn.preprocessingr   r<   r.   r/   r6   r1   r   r   r   r   r   r   Zc_r   Zzerosr   r   r,   rF   ZmarkZparametrizerv   r~   r   r   r   r   r   r   rY   r   r   r   r   r   Zint32Zint64r   r   r   r   r   r   r   r   rD   rD   rD   rE   <module>   s   28.8S^)




	
$