U
    3d$b                     @   sT  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 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!ddddddgZ#e!ddddddg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!dddddddddg	Z'e!dddddddddg	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!dddddddddg	Z+ej,e-de.df Z/e!d d d d d dddgZ0dd d!d"d#d$d%d&d'g	Z1d(d) Z2ej34d*ddgej34d+d,d-d.gd/d0 Z5d1d2 Z6d3d4 Z7d5d6 Z8d7d8 Z9d9d: Z:d;d< Z;d=d> Z<ej34d?e=d@dAdB Z>dCdD Z?ej34dEddFgej34d*dFdgdGdH Z@ej34dIejAejAfejBejBfejCejBfejDejBfgdJdK ZEdLdM ZFdNdO ZGdPdQ ZHej34dRdSdTdUgdVdW ZIdXdY ZJdZd[ ZKd\d] ZLd^d_ ZMej34d+d,d-d.gd`da ZNdbdc ZOej34dddedfgdgdh ZPdS )i    N)linalg)clone)config_context)check_random_state)assert_array_equal)assert_array_almost_equal)assert_allclose)assert_almost_equal)_convert_to_numpy)_convert_container)
make_blobs)LinearDiscriminantAnalysis)QuadraticDiscriminantAnalysis)_cov)ledoit_wolf)KMeans)ShrunkCovariance)
LedoitWolf)StandardScaler      fdtype      )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td| qtddd}tt |tt W 5 Q R X td	d
t d}tjtdd |tt W 5 Q R X tdt d}tjtdd |tt W 5 Q R X td	tdddd}tt |tt W 5 Q R X d S )Nsolver	shrinkagez	solver %sr         ?ư>)rtolatolerr_msgr   r"   r    皙?)r%   r&   covariance_estimatorz[covariance_estimator and shrinkage parameters are not None. Only one of the two can be set.match)r%   r-   z.covariance estimator is not supported with svdr   )Z
n_clustersZn_init)solver_shrinkager   fitXypredictr   X1predict_probapredict_log_probar   npexpy3anyAssertionErrorpytestraisesNotImplementedErrorr   
ValueErrorr   r   )	Z	test_caser%   r&   clfy_predy_pred1y_proba_pred1y_log_proba_pred1y_pred3 rG   L/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/tests/test_discriminant_analysis.pytest_lda_predictK   sX    
$
	    
rI   	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st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rngrG   rH   
<listcomp>   s   zDtest_lda_predict_proba.<locals>.generate_dataset.<locals>.<listcomp>c                    s   g | ]}|gt    qS rG   )rM   rN   clazz)rQ   rR   rG   rH   rT      s     )r   r8   vstackziphstackrangerM   )rR   rQ   covariancesrandom_stater2   r3   rG   rP   rH   generate_dataset   s    z0test_lda_predict_proba.<locals>.generate_datasetr   (   i   
   d   i_ *   )rR   rQ   r[   r\   T)r%   store_covariancer&   r,   )r*   r   r         i   c                 S   s   t || t | ||  S )N)r8   r9   dot)sampleZcoefZ	interceptrV   rG   rG   rH   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 rG   rG   rU   alpha_k	alpha_k_0ri   rh   rG   rH   rT      s   z5test_lda_predict_proba.<locals>.<listcomp>.<listcomp>)floatsumrZ   rU   rk   rl   ri   rJ   rh   rG   rH   rT      s   
z*test_lda_predict_proba.<locals>.<listcomp>c                    s   g | ]} |qS rG   rG   rU   rj   rG   rH   rT      s   {Gz?)N)r8   arrayrM   r   r1   r   means_covariance_r   invrZ   appendrg   newaxisrn   rm   r=   Zapproxr<   r6   rY   )r%   rJ   r]   Zblob_centersZ	blob_stdsr2   r3   ldaZ	precisionrV   ZprobZprob_refZ
prob_ref_2rG   ro   rH   test_lda_predict_proba   sr    
$    
   $ 

  rx   c               	   C   s   t ddg} t| d}d}tjt|d |tt W 5 Q R X tddgd}|tt t ddg} t ddg}t| d}t	t
 |tt W 5 Q R X t|j|d	 d S )
Nr'   re   priorszpriors must be non-negativer.   333333??g?r   )r8   rq   r   r=   r>   r@   r1   r2   r3   warnsUserWarningr   priors_)rz   rA   msgZ
prior_normrG   rG   rH   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     rR   
n_featuresrQ   r\   r   r%   r    r!   r   )r   r   r1   r   coef_)r   rJ   rR   r2   r3   clf_lda_svdZclf_lda_lsqrclf_lda_eigenrG   rG   rH   test_lda_coefs  s$       



r   c               	   C   s   t ddd} | ttt}|jd dks0tt ddd} | ttt}|jd dks`tt ddd} | tt d}tjt	|d | t W 5 Q R X d S )Nr   r   )r%   n_componentsr!   r    z$transform not implemented for 'lsqr'r.   )
r   r1   r2   r3   	transformshaper<   r=   r>   r?   )rA   ZX_transformedr   rG   rG   rH   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shtdtdd	}||| t|j	 d
d |jj
dkstdt|j|j d S )Nr   rb   )r_      )locZscalerL   r   )r_   rK   r!   r         ?)r   z/Unexpected length for explained_variance_ratio_r   )r8   randomRandomStatenormalrandintr   r1   r	   explained_variance_ratio_rn   r   r<   r   )stater2   r3   r   r   rG   rG   rH   !test_lda_explained_variance_ratio*  s&    

 r   c               
   C   s  t dddgdddgdddgdddgg} t dddgdddgdddgdddgdddgdddg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 )Nr   r   r   r      r,   g)r   r   r   r   r   r   r   )r8   rq   rv   reshaperepeataranger   r   r1   r   sqrtrn   r	   rO   TZeyeabsrg   )ZmeansZscatterr2   r3   rA   Zmeans_transformedd1Zd2rG   rG   rH   test_lda_orthogonalityG  s*    *6
$r   c                  C   s   d} t jd}|dd| dfdddg }|dd| dfdddg }t ||fddd	g }dg|  dg|   }d
D ]2}t|d}|||||dksxtd| qxd S )Nrb   i  r   r   r   r^   r   ra   i'  )r   r    r!   r   r   zusing covariance: %s)	r8   r   r   uniformrW   r   r1   Zscorer<   )nrS   x1Zx2xr3   r%   rA   rG   rG   rH   test_lda_scalingp  s    
r   c                  C   s   dD ]d} t | dtt}t|ds(tt | ddtt}t|dsJtt|jt	ddgddgg qt d	dtt}t|drtt | ddtt}t|dstt|jt	ddgddgg d S )
N)r    r!   r   rs   T)r%   rd   gil?gam?g	^?r   )
r   r1   X6y6hasattrr<   r   rs   r8   rq   )r%   rA   rG   rG   rH   test_lda_store_covariance  s(       r   seedra   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 )Nrb   ra   r   rK   Tr'   r    rd   r&   r%   )r&   rd   r-   r%   )r8   r   r   randr   r   r   r1   r   rr   rs   )r   rS   r2   r3   c1c2rG   rG   rH   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_r8   rv   rs   )selfr2   ZscZX_scsrG   rG   rH   r1     s
    
,z7test_lda_ledoitwolf.<locals>.StandardizedLedoitWolf.fitN)__name__
__module____qualname__r1   rG   rG   rG   rH   StandardizedLedoitWolf  s   r   r   rb   ra   r   )rb   rK   Tr"   r    r   r   )
r8   r   r   r   r   r   r1   r   rr   rs   )r   rS   r2   r3   r   r   rG   rG   rH   test_lda_ledoitwolf  s$    	  r   r   r   c           
   
   C   s   t d}d}|||}tt| ||  d d | }t|| d }|d d |fD ]}t|d}||| qT|d t|| d d fD ]8}t|d}d}	t	j
t|	d ||| W 5 Q R X qd S )Nr   ra   r   )r   z#n_components cannot be larger than r.   )r   Zrandnr8   ZtilerZ   minr   r1   maxr=   r>   r@   )
rJ   r   rS   rR   r2   r3   Zmax_componentsr   rw   r   rG   rG   rH   test_lda_dimension_warning  s     

r   zdata_type, expected_typec                 C   sF   t D ]<\}}t||d}|t| t|  |jj|kstqd S )Nr$   )	r0   r   r1   r2   astyper3   r   r   r<   )Z	data_typeZexpected_typer%   r&   rA   rG   rG   rH   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)   )r0   r   r1   r2   r   r8   float32r3   float64r   r   )r%   r&   Zclf_32Zclf_64r)   rG   rG   rH   ,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sttt | tt W 5 Q R X d S )Nr   r'   r   )r   r1   r   r   r4   r   X7r6   r7   r   r8   r9   y7r;   r<   r=   r>   r@   y4)rA   rB   rC   rD   rE   rF   rG   rG   rH   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sntd S )Nr   g|=r   ry   )	r   r1   r   r   r4   r8   rn   rq   r<   )rA   rB   Zn_posnegZn_pos2rG   rG   rH   test_qda_priors"  s    r   priors_typelisttuplerq   c                 C   sF   ddg}t tddg| dtt}t|jtjs6t	t
|j| dS )z$Check that priors accept array-like.r'   ry   N)r   r   r1   r   r   
isinstancer   r8   ndarrayr<   r   )r   rz   rA   rG   rG   rH   test_qda_prior_type/  s     r   c                  C   sR   t ddg} t| dtt}t|j|j d| d< |jd |jd ksNt	dS )zCCheck that altering `priors` without `fit` doesn't change `priors_`r'   ry   g?r   N)
r8   rq   r   r1   r2   r3   r   r   rz   r<   )rz   ZqdarG   rG   rH   test_qda_prior_copy:  s
    r   c                  C   s   t  tt} t| drtt ddtt} t| ds<tt| jd t	ddgddgg t| jd t	dd	gd	d
gg d S )Nrs   T)rd   r   gffffff?r|   r   gQUU?gQUUտgvWUU?)
r   r1   r   r   r   r<   r   rs   r8   rq   )rA   rG   rG   rH   test_qda_store_covarianceG  s    "r   c               	   C   s   d} t  }tjt| d |tt}W 5 Q R X tjtdd |t}W 5 Q R X t	
|tksftt dd}tjt| d |tt W 5 Q R X |t}t|t t dd}tjt| d |tt W 5 Q R X |t}t|t d S )NzVariables are collinearr.   zdivide by zerorp   )Z	reg_paramr,   )r   r=   r}   r~   r1   X2r   RuntimeWarningr4   r8   r;   r<   r   X5y5)Zcollinear_msgrA   rB   Zy_pred5rG   rG   rH   test_qda_regularizationX  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 )	Nrb   r   r   rc   r   r   Z	empiricalr"   )	r   r8   rg   r   r   r   r   r	   r   )r   r3   Zc_eZc_srG   rG   rH   test_covariance|  s    0

r   c              	   C   sX   t ddgddgg}t ddg}t| d}tjtdd ||| W 5 Q R X dS )	zg
    Tests that if the number of samples equals the number
    of classes, a ValueError is raised.
    r'   r{   abr   z"The number of samples must be morer.   N)r8   rq   r   r=   r>   r@   r1   )r%   r2   r3   rA   rG   rG   rH   =test_raises_value_error_on_same_number_of_classes_and_samples  s
    
r   c                     sT   t  tt} |  }d  tj fddt| j	j
d D td}t|| dS )z6Check get_feature_names_out uses class name as prefix.r   c                    s   g | ]}  | qS rG   rG   )rN   iZclass_name_lowerrG   rH   rT     s   z.test_get_feature_names_out.<locals>.<listcomp>r   r   N)r   r1   r2   r3   Zget_feature_names_outlowerr8   rq   rZ   r   r   objectr   )ZestZ	names_outZexpected_names_outrG   r   rH   test_get_feature_names_out  s    
r   array_namespaceznumpy.array_apizcupy.array_apic              
   C   s<  t | }|t}|t}t }|tt dd t| D }t	|}t
dd ||| W 5 Q R X | D ]B\}}t||}	t|	dstt|	|d}
t||
| ddd	 qxd
}|D ]r}t||t}t
dd t|||}W 5 Q R X t|dst| dt||d}t||| ddd	 qdS )zBCheck that the array_api Array gives the same results as ndarrays.c                 S   s"   i | ]\}}t |tjr||qS rG   )r   r8   r   )rN   keyvaluerG   rG   rH   
<dictcomp>  s      z&test_lda_array_api.<locals>.<dictcomp>T)Zarray_api_dispatchZ__array_namespace__)xpz not the samegMbP?)r+   r*   )Zdecision_functionr4   r7   r6   r   z" did not output an array_namespacez# did not the return the same resultr(   N)r=   ZimportorskipZasarrayr2   r:   r   r1   varsitemsr   r   getattrr   r<   r
   r   )r   r   ZX_xpZy_xprw   Zarray_attributesZlda_xpr   	attributeZlda_xp_paramZlda_xp_param_npmethodsmethodresultZ	result_xpZresult_xp_nprG   rG   rH   test_lda_array_api  sN    




    r   )QZnumpyr8   r=   Zscipyr   Zsklearn.baser   Zsklearn._configr   Zsklearn.utilsr   Zsklearn.utils._testingr   r   r   r	   Zsklearn.utils._array_apir
   r   Zsklearn.datasetsr   Zsklearn.discriminant_analysisr   r   r   Zsklearn.covariancer   Zsklearn.clusterr   r   r   Zsklearn.preprocessingr   rq   r2   r3   r:   r5   r   r   r   r   r   r   Zc_r   zerosr   r   r0   rI   markZparametrizerx   r   r   r   r   r   r   r   rZ   r   r   r   r   r   Zint32Zint64r   r   r   r   r   r   r   r   r   r   r   r   rG   rG   rG   rH   <module>   s   28.8?^)




	


$
