U
    3d                     @   s  d dl Z d dlZd dl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 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mZmZmZmZmZ d d
lm Z 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ddgZ*dd Z+G dd dZ,dd Z-dd Z.dd Z/dd  Z0d!d" Z1d#d$ Z2d%d& Z3d'd( Z4d)d* Z5d+d, Z6d-d. Z7d/d0 Z8d1d2 Z9ej:;d3ej:<d4d5d6d7d8gd9d: Z=d;d< Z>d=d> Z?d?d@ Z@dAdB ZAdCdD ZBdEdF ZCdGdH ZDdIdJ ZEdKdL ZFej:;d3ej:<dMdNdOdP ZGe)e dQdRdS ZHdTdU ZIdVdW ZJdXdY ZKdZd[ ZLd\d] ZMd^d_ ZNe)e dQd`da ZOdbdc ZPej:<dddedfdgdhgdidj ZQej:<dddedfdgdhgdkdl ZRdmdn ZSdodp ZTdqdr ZUdS )s    N)statslinalg)KMeans)EmpiricalCovariancemake_spd_matrix)StringIO)adjusted_rand_score)GaussianMixture)#_estimate_gaussian_covariances_full#_estimate_gaussian_covariances_tied#_estimate_gaussian_covariances_diag(_estimate_gaussian_covariances_spherical_estimate_gaussian_parameters_compute_precision_cholesky_compute_log_det_cholesky)ConvergenceWarningNotFittedError)fast_logdet)assert_allclose)assert_almost_equal)assert_array_almost_equal)assert_array_equal)ignore_warningsfulltieddiag	sphericalc                 C   sh  t jd}g }|dkrhtt|||d D ]:\}\}	}
}|||
|t | tt 	|	|   q,|dkrtt|||d D ]6\}\}	}
}|||
t 
|tt 	|	|   q|dkrtt||D ]2\}\}	}
|||
|d tt 	|	|   q|dkrZtt|||d D ]2\}\}	}
}|||
|tt 	|	|   q&t |}|S )Nr   r   r   r   r   )nprandomRandomState	enumeratezipappendmultivariate_normaleyeintroundr   vstack)	n_samples
n_featuresweightsmeans
precisionscovariance_typerngX_wmc r5   O/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/mixture/tests/test_gaussian_mixture.pygenerate_data*   s<    "  " 
  
"&
r7   c                   @   s   e Zd ZdddZdS )
RandomData      2   c                    s  _ |_ _|_jj  _| | _d| d|  d t dt	 fddt
|D d_djd  djd	  tjd
 t	dd jd D d_ttt fddtD _tfddtjD _d S )N      ?r:   random_statec                    s   g | ]}t  d d qS )r=   r<   r   ).0r1   )r*   r/   r5   r6   
<listcomp>W   s   z'RandomData.__init__.<locals>.<listcomp>r   r   r   r         ?r   r   r   c                 S   s   g | ]}t |qS r5   r   inv)r?   
covariancer5   r5   r6   r@   b   s     r   c              	      s$   g | ]}t  jjj|qS r5   )r7   r+   r,   covariances)r?   
covar_type)r*   r)   selfr5   r6   r@   i   s   	c                    s.   g | ]&\}}t jtt |  |td qS ))Zdtype)r   r   r&   r'   )r?   kr2   )r)   r5   r6   r@   w   s   )r)   n_componentsr*   randr+   sumr,   r   r   arrayrangerF   r   rD   r-   dictr"   COVARIANCE_TYPEr0   Zhstackr!   Y)rH   r/   r)   rJ   r*   scaler5   )r*   r)   r/   rH   r6   __init__J   sF    
		
zRandomData.__init__N)r9   r:   r:   r;   )__name__
__module____qualname__rS   r5   r5   r5   r6   r8   I   s   r8   c            
   	   C   s   t jd} | dd}d\}}}}}d\}}t|||||||d|}	|	j|ksXt|	j|ksft|	j	|kstt|	j
|kst|	j|kst|	j|kst|	j|kstd S )Nr   
   r:   )r:   g-C6?      皙?)r   r   )rJ   toln_initmax_iter	reg_covarr.   init_params)r   r   r    rK   r
   fitrJ   AssertionErrorr.   r[   r^   r]   r\   r_   )
r/   r0   rJ   r[   r\   r]   r^   r.   r_   gmmr5   r5   r6    test_gaussian_mixture_attributes~   s,    
rc   c            
   	   C   sf  t jd} t| }|j}|jd }t|d}| |d}||_t	
d| dt|j }tjt|d || W 5 Q R X | |d }||_t	
dt |d	d
t |d	}tjt|d || W 5 Q R X | |}|| d  }||_t	
dt |d	}tjt|d || W 5 Q R X |j}	t|	|d}|| t|	|j d S )Nr   r   rJ      z2The parameter 'weights' should have the shape of (z,), but got matchzIThe parameter 'weights' should be in the range [0, 1], but got max value z.5fz, min value zEThe parameter 'weights' should be normalized, but got sum(weights) = )weights_initrJ   )r   r   r    r8   rJ   r0   r
   rK   rh   reescapestrshapepytestraises
ValueErrorr`   minmaxrL   r+   r   )
r/   	rand_datarJ   r0   gZweights_bad_shapemsgZweights_bad_rangeZweights_bad_normr+   r5   r5   r6   test_check_weights   s>    



ru   c            	   	   C   s   t jd} t| }|j|j }}|jd }t|d}| |d |}||_	d}t
jt|d || W 5 Q R X |j}||_	|| t||j	 d S )Nr   r   rd   re   z/The parameter 'means' should have the shape of rf   )r   r   r    r8   rJ   r*   r0   r
   rK   
means_initrm   rn   ro   r`   r,   r   )	r/   rr   rJ   r*   r0   rs   Zmeans_bad_shapert   r,   r5   r5   r6   test_check_means   s    


rw   c               
   C   s  t jd} t| }|j|j }}t |d ||ft |d |d ft |d |ft |d d}t |||f}t ||d< d|d< ||d t ||fdt |dd}ddddd}t	D ]}t| j
| }	t||| d}
|| |
_d	| d
}tjt|d |
|	 W 5 Q R X || |
_d| d||  }tjt|d |
|	 W 5 Q R X |j| |
_|
|	 t|j| |
j qd S )Nr   re   )r   r   r   r   g      )r   r   r   zsymmetric, positive-definiteZpositiverJ   r.   r>   zThe parameter 'z$ precision' should have the shape ofrf   'z precision' should be )r   r   r    r8   rJ   r*   onesr%   r   rP   r0   r
   precisions_initrm   rn   ro   r`   r-   r   )r/   rr   rJ   r*   Zprecisions_bad_shapeZprecisions_not_posZprecisions_not_positiveZnot_positive_errorsrG   r0   rs   rt   r5   r5   r6   test_check_precisions   sN    
  


r|   c                  C   s  t jd} d\}}| ||}| |d}t || }t |g}t d|f}t||||d}tdd}	|		| t
|	j|d ddd t
|	j|d ddd t|d	}
t d
d |
D }t dd |D }t|| t |df}t |g}|jddd}t||||d}tdd}	|		| t
|	j|d ddd t
|	j|d ddd t|d	}
t dd |
D }t dd |D }t|| d S )Nr     r:   re   T)Zassume_centered	frobeniusnormspectralr   c                 S   s   g | ]}t ||jqS r5   r   dotTr?   precr5   r5   r6   r@   .  s     z)test_suffstat_sk_full.<locals>.<listcomp>c                 S   s   g | ]}t |qS r5   rC   r?   covr5   r5   r6   r@   /  s     Zaxis)re   Fc                 S   s   g | ]}t ||jqS r5   r   r   r5   r5   r6   r@   >  s     c                 S   s   g | ]}t |qS r5   rC   r   r5   r5   r6   r@   ?  s     )r   r   r    rK   sqrtrM   zerosr   r   r`   r   
error_normr   r   rz   meanZreshape)r/   r)   r*   r0   respZX_respnkxkZcovars_predecovprecs_chol_pred
precs_pred	precs_estr5   r5   r6   test_suffstat_sk_full  s8    






r   c                  C   s"  t jd} d\}}}| ||}||jddd d t jf  }| ||}|jdd}t |j||d d t jf  }t||||d}t |d d t jt jf | d| }t	||||d}	t
 }
||
_t|
j|	ddd t|
j|	ddd t|	d}t ||j}t|	}t|| d S )	Nr   r~   r:   r:   re   r   r   r   r   r   )r   r   r    rK   rL   newaxisr   r   r   r   r   covariance_r   r   r   r   rD   r   )r/   r)   r*   rJ   r   r0   r   r   covars_pred_fullZcovars_pred_tiedr   r   r   r   r5   r5   r6   test_suffstat_sk_tiedC  s&    
 $

r   c                  C   s  t jd} d\}}}| ||}||jddd d t jf  }| ||}|jdd}t |j||d d t jf  }t||||d}t	||||d}	t
 }
t||	D ]L\}}t t ||
_t |}t|
j|ddd t|
j|ddd qt|	d}t|	d	|d
   d S )Nr   r   re   r   r   r   r   r   rB   r:   )r   r   r    rK   rL   r   r   r   r   r   r   r"   r   r   r   r   r   )r/   r)   r*   rJ   r   r0   r   r   r   Zcovars_pred_diagr   Zcov_fullZcov_diagr   r5   r5   r6   test_suffstat_sk_diaga  s"    
 

r   c            
      C   s   t jd} d\}}| ||}||  }t |df}t |g}| }t||||d}t |	 j
|	 ||  }t|| t|d}	t|d|	d   d S )Nr   r}   re   r   rB   r:   )r   r   r    rK   r   rz   rM   r   r   flattenr   r   r   )
r/   r)   r*   r0   r   r   r   Zcovars_pred_sphericalZcovars_pred_spherical2r   r5   r5   r6   #test_gaussian_suffstat_sk_sphericalz  s    

r   c                  C   s   d} t tjd}tD ]}|j| }|dkrDtdd |D }nB|dkrXt|}n.|dkrvtdd |D }n|d	kr||  }t	t
|||| d
}t|dt|  qd S )Nr:   r   r   c                 S   s   g | ]}t |qS r5   )r   detr   r5   r5   r6   r@     s     z1test_compute_log_det_cholesky.<locals>.<listcomp>r   r   c                 S   s   g | ]}t |qS r5   )r   prodr   r5   r5   r6   r@     s     r   r*   g      )r8   r   r   r    rP   rF   rM   r   r   r   r   r   log)r*   rr   rG   rE   Zpredected_detZexpected_detr5   r5   r6   test_compute_log_det_cholesky  s$    
r   c                 C   sd   t t| t|f}t |}tt||D ]0\}\}}tj| ||j	dd|d d |f< q.|S )Nre   r   )
r   emptylenr   r!   r"   r   r   ZlogpdfrL   )r0   r,   Zcovarsr   Zstdsir   Zstdr5   r5   r6   _naive_lmvnpdf_diag  s
    
&r   c                     s^  ddl m}  tjd}t|}d}|j |j}|j}|	| }|	| }t
|||}tdd |D }	| |||	d}
t|
| dt| }| |||d}
t|
| td	d |D jdd
}ttd| }t
|||g| }| |||d}
t|
| |jdd
}dt|jdd
 }t
|| fdd|D }| |||d}
t|
| d S )Nr   )_estimate_log_gaussian_probr~   c                 S   s    g | ]}t d t | qS )rB   )r   r   r   r?   xr5   r5   r6   r@     s     z;test_gaussian_mixture_log_probabilities.<locals>.<listcomp>r   rB   r   c                 S   s   g | ]}|qS r5   r5   r   r5   r5   r6   r@     s     r   r   re   c                    s   g | ]}|g  qS r5   r5   r?   rI   r   r5   r6   r@     s     r   )!sklearn.mixture._gaussian_mixturer   r   r   r    r8   r*   rJ   r,   rK   r   rM   r   r   r   r   )r   r/   rr   r)   rJ   r,   Zcovars_diagr0   Zlog_prob_naiveZ
precs_fullZlog_probZprecs_chol_diagZcovars_tiedZ
precs_tiedZcovars_sphericalZprecs_sphericalr5   r   r6   'test_gaussian_mixture_log_probabilities  s<    


  r   c               	   C   s   t jd} t| dd}|j}|j}|j}| ||}tD ]~}|j	}|j
}|j| }	t|| |||	|d}
|
| |
|}t|jddt | t|
j| t|
j| t|
j|	 q:d S )Nr      rR   rJ   r>   rh   rv   r{   r.   re   r   )r   r   r    r8   r)   r*   rJ   rK   rP   r+   r,   r-   r
   r`   predict_probar   rL   rz   r   rh   rv   r{   )r/   rr   r)   r*   rJ   r0   rG   r+   r,   r-   rs   r   r5   r5   r6   ,test_gaussian_mixture_estimate_log_prob_resp  s0    


r   c            	   
   C   s   t jd} t| }tD ]}|j| }|j}t|j| |j	|j
|j| |d}d}tjt|d || W 5 Q R X || ||}||jdd}t|| t||dkstqd S )Nr   r   sThis GaussianMixture instance is not fitted yet. Call 'fit' with appropriate arguments before using this estimator.rf   re   r   ffffff?)r   r   r    r8   rP   r0   rQ   r
   rJ   r+   r,   r-   rm   rn   r   predictr`   r   Zargmaxr   r	   ra   )	r/   rr   rG   r0   rQ   rs   rt   ZY_predZY_pred_probar5   r5   r6   +test_gaussian_mixture_predict_predict_proba  s,    



r   zignore:.*did not converge.*zseed, max_iter, tol)r   r:   Hz>)re   r:   rZ   )rX   ,  r   )   r   rZ   c                 C   s   t j| }t|}tD ]x}|j| }|j}t|j||j	|j
|j| |||d}t|}	|	||}
||}t|
| t||dkstqd S )N)rJ   r>   rh   rv   r{   r.   r]   r[   r   )r   r   r    r8   rP   r0   rQ   r
   rJ   r+   r,   r-   copydeepcopyr`   r   fit_predictr   r	   ra   )seedr]   r[   r/   rr   rG   r0   rQ   rs   fZY_pred1ZY_pred2r5   r5   r6   !test_gaussian_mixture_fit_predict  s(    



r   c                  C   sD   t jddd} tdddd}|| }|| }t|| d S )Nr     r   )rJ   r\   r>   )r   r   r    randnr
   r   r   r   )r0   gmZy_pred1Zy_pred2r5   r5   r6   (test_gaussian_mixture_fit_predict_n_init?  s
    

r   c                     s  t jd} t| }|j |j}tD ]}|j| }t|dd| |d}|	| t
t |jt |jddd |jd d df  }|jd d df  }t
|j| |j| ddd |dkr|j}|jd }	n|dkrt |jg| }t |jd g| }	n~|d	krJt  fd
d|jD }t  fdd|jd	 D }	n:|dkrt dd |jD }t dd |jd D }	t j|ddd }t j|	ddd }t||D ]2\}
}t }|	| |_t
|||
 ddd qq$d S )Nr      rJ   r\   r^   r>   r.   rZ   g{Gz?)Zrtolatolr   r   r   c                    s   g | ]}t  | qS r5   r   r%   r?   r4   r   r5   r6   r@   l  s     z-test_gaussian_mixture_fit.<locals>.<listcomp>c                    s   g | ]}t  | qS r5   r   r   r   r5   r6   r@   n  s     r   c                 S   s   g | ]}t |qS r5   r   r   r?   dr5   r5   r6   r@   q  s     c                 S   s   g | ]}t |qS r5   r   r   r5   r5   r6   r@   r  s     re   r:   )Zaxis1Zaxis2g333333?)r   )r   r   r    r8   r*   rJ   rP   r0   r
   r`   r   sortweights_r+   means_Zargsortr,   precisions_r-   rM   tracer"   r   r   r   )r/   rr   rJ   rG   r0   rs   Zarg_idx1Zarg_idx2Z	prec_predZ	prec_testrI   hr   r5   r   r6   test_gaussian_mixture_fitH  s`    



 
     



r   c            
      C   s   t jd} t| }|j}d}tD ]}|j| }t|dd| |d}g }t|D ]}|	| |
|| qNt |}t||d| |d}	|		| t| |	| q"d S )Nr   rW   re   r   )r   r   r    r8   rJ   rP   r0   r
   rN   r`   r#   scorerM   r   rp   )
r/   rr   rJ   r\   rG   r0   rs   Zllr1   Zg_bestr5   r5   r6   %test_gaussian_mixture_fit_best_params}  s6    



r   c               
   C   s~   t jd} t| dd}|j}d}tD ]R}|j| }t|d|d| |d}d| d}tj	t
|d || W 5 Q R X q&d S )Nr   re   r   rJ   r\   r]   r^   r>   r.   zInitialization zi did not converge. Try different init parameters, or increase max_iter, tol or check for degenerate data.rf   )r   r   r    r8   rJ   rP   r0   r
   rm   Zwarnsr   r`   )r/   rr   rJ   r]   rG   r0   rs   rt   r5   r5   r6   -test_gaussian_mixture_fit_convergence_warning  s$    
	
r   c                  C   sr   t jd} d\}}}| ||}tD ]F}t||dd||}t||ddd||}||ks&tq&d S )Nr   r;   r   r:   rx   r   rJ   r.   r>   r\   )	r   r   r    r   rP   r
   r`   r   ra   )r/   r)   r*   rJ   r0   cv_typeZtrain1Ztrain2r5   r5   r6   test_multiple_init  s4    
  
r   c                  C   sf   t jd} d\}}}| ||}ddddd}tD ],}t||| d|}| || ks4tq4d S )	Nr   r            )   rA   rx   )	r   r   r    r   rP   r
   r`   _n_parametersra   )r/   r)   r*   rJ   r0   Zn_paramsr   rs   r5   r5   r6   "test_gaussian_mixture_n_parameters  s    
  r   c                  C   sn   t jd} d\}}}| ||}t|d| d||}dD ](}t||| d||}t|| q@d S )Nr   )d   re   re   r   rx   )r   r   r   )r   r   r    r   r
   r`   bicr   )r/   r)   Zn_dimrJ   r0   Zbic_fullr.   r   r5   r5   r6   test_bic_1d_1component  s2    
  	r   c                  C   s   t jd} d\}}}| ||}dtt j|jdd|dt dt j     }t	D ]}t
||| dd}|| d| | d|   }d| | t ||   }	|t | }
||| | |
k st|||	 | |
k sVtqVd S )	Nr   )r;   rX   r:   r<   re   )Zbiasr:   r9   )rJ   r.   r>   r]   )r   r   r    r   r   r   r   r   pirP   r
   r`   r   r   aicra   r   )r/   r)   r*   rJ   r0   Zsghr   rs   r   r   boundr5   r5   r6   test_gaussian_mixture_aic_bic  s&    
*
r   c               	   C   s   t jd} t| }|j}tD ]f}|j| }t|dd| |dd}t|dd| |dd}tj	}t
 t_	z|| || W 5 |t_	X qd S )Nr   re   )rJ   r\   r^   r>   r.   verboser:   )r   r   r    r8   rJ   rP   r0   r
   sysstdoutr   r`   )r/   rr   rJ   rG   r0   rs   r   Z
old_stdoutr5   r5   r6   test_gaussian_mixture_verbose  s6    

r   r   )r   re   r:   c              	   C   s0  | }t j|}d\}}}|||}t|ddd|dd}t|ddd|dd}|| |||}	|||}
t|j|j t|j	|j	 t|j
|j
 |
|	kstt|ddd|dd	d
}t|ddd|dd	d
}|| |jrt|| tdD ]}|| |jr  q q |js,td S )Nr   re   r:   r   F)rJ   r\   r]   r^   r>   
warm_startTr   ư>)rJ   r\   r]   r^   r>   r   r[   r   )r   r   r    rK   r
   r`   r   r   r   r   r   ra   
converged_rN   )r   r>   r/   r)   r*   rJ   r0   rs   r   Zscore1Zscore2r1   r5   r5   r6   test_warm_start+  sj    
	
	





r   )categoryc                  C   s|   t jd} t| }|j}|jd }dD ]N}t|d|| d}tdD ]}|| |j	rD q^qD|j	sht
||jks(t
q(d S )Nr   r   )re   r:   r;   T)rJ   r   r]   r>   r   )r   r   r    r8   rJ   r0   r
   rN   r`   r   ra   n_iter_)r/   rr   rJ   r0   r]   rb   r1   r5   r5   r6   )test_convergence_detected_with_warm_startp  s"    


r   c            
   	   C   s   d} t jd}t|dd}|j}|j|  }t|ddd|| d}d}tjt	|d |
| W 5 Q R X t  td	t || W 5 Q R X |
|}|| }t|| t|dd|| d
|}	|	
||
|kstd S )Nr   r      r   re   r   r   rf   ignorer   )r   r   r    r8   rJ   r0   r
   rm   rn   r   r   warningscatch_warningssimplefilterr   r`   score_samplesr   r   ra   )
rG   r/   rr   rJ   r0   gmm1rt   Z	gmm_scoreZgmm_score_probagmm2r5   r5   r6   
test_score  sB    
	


r   c               	   C   s   d} t jd}t|dd}|j}|j|  }t|dd|| d}d}tjt	|d |
| W 5 Q R X ||
|}|jd |jkstd S )	Nr   r   r   r   re   r   r   rf   )r   r   r    r8   rJ   r0   r
   rm   rn   r   r   r`   rl   r)   ra   )rG   r/   rr   rJ   r0   rb   rt   Zgmm_score_samplesr5   r5   r6   test_score_samples  s$    
r   c            	   
   C   s   t jd} t| dd}|j}tD ]}|j| }t||ddd| dd}t j }t	
 T t	dt td	D ].}|}|||}||kst|jrl qql|jstW 5 Q R X q"d S )
Nr   r   r   Tre   r   )rJ   r.   r^   r   r]   r>   r[   r   iX  )r   r   r    r8   rJ   rP   r0   r
   Zinftyr   r   r   r   rN   r`   r   ra   r   )	r/   rr   rJ   rG   r0   rb   Zcurrent_log_likelihoodr1   Zprev_log_likelihoodr5   r5   r6   test_monotonic_likelihood  s0    
	
r   c                  C   s   t jd} d\}}t t |d |ft |d |ff}tD ]t}t|d|| d}t	 R t
dt td}tjt|d || W 5 Q R X |jdd	| W 5 Q R X qBd S )
Nr   )rW   r   r:   )rJ   r^   r.   r>   r   zFitting the mixture model failed because some components have ill-defined empirical covariance (for instance caused by singleton or collapsed samples). Try to decrease the number of components, or increase reg_covar.rf   r   )r^   )r   r   r    r(   rz   r   rP   r
   r   r   r   RuntimeWarningri   rj   rm   rn   ro   r`   Z
set_params)r/   r)   r*   r0   rG   rb   rt   r5   r5   r6   test_regularisation  s(    "
r   c                  C   s   t jd} t| dd}|j}tD ]}|j| }t||| dd}|| |dkr|t	|j
|jD ]\}}tt|| q`q"|dkrtt|j
|j q"t|j
d|j  q"d S )	Nr   r   r   r   r   r   r   rB   )r   r   r    r8   rJ   rP   r0   r
   r`   r"   r   covariances_r   r   rD   )r/   rr   rJ   rG   r0   rb   r   Zcovarr5   r5   r6   test_property  s$    

r  c                     s  t jd} t| ddd}|j|j }}tD ]}|j| }t||| d}d}t	j
t|d |d W 5 Q R X || d}t	j
t|d |d W 5 Q R X d	}||\ t|D ]}	|d
krt|j|	 t  |	k jdd q|dkrt|jt  |	k jdd q|dkrRt|j|	 t t  |	k jdd qt|j|	 t  |	k |j|	  dd qt  fddt|D }
t|j|
dd  j||fksttddD ](}||\ } j||fkstqq,d S )Nr   r   rX   )rR   rJ   rx   z+This GaussianMixture instance is not fittedrf   zInvalid value for 'n_samples'i N  r   re   )decimalr   r   c                    s    g | ]}t  |k d qS )r   )r   r   r   ZX_sZy_sr5   r6   r@   R  s     ztest_sample.<locals>.<listcomp>r   )r   r   r    r8   r*   rJ   rP   r0   r
   rm   rn   r   sampler`   ro   rN   r   r  r   r   r   varr   rM   rl   ra   )r/   rr   r*   rJ   rG   r0   rb   rt   r)   rI   Zmeans_sZsample_sizer1   r5   r  r6   test_sample%  sb    

  
  
  
  r  c                  C   st   t dD ]f} ttj| ddd}|j}|jd }t|dd| d|}t|dd| d|}|j	|j	kst
qd S )N   r;   re   )r)   rR   r   )rJ   r\   r]   r>   rW   )rN   r8   r   r   r    rJ   r0   r
   r`   lower_bound_ra   )r>   rr   rJ   r0   r   r   r5   r5   r6   	test_init^  s2    
  
      r
  c               
   C   s   t jd} d}| j|dfd}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}t ddddddg}dddddd g}td!d||| t||d"d#}|| |jrt	d$D ]}t
||st	qd%S )&z`GaussianMixture`'s best_parameters, `n_iter_` and `lower_bound_`
    must be set appropriately in the case of divergence.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/18216
    r   rY   rX   sizegu?g?gn,?gqz=|?gdUX'n?g.ba˼?g8?g?g׏'?g{?g
 ?g(}I^?gLh?gtM?g@.?gY8?gj4}_?g$%?g(.Ag_S.Ag]IN@gŕ&i@g/@gYa2i]U@g?g?ggfffff?g?r   re   )r.   r^   rv   rh   r>   rJ   r{   r]   )r   r   r  precisions_cholesky_r   r	  N)r   r   r    uniformrM   r
   r   r`   r   ra   hasattr)Zrndr)   r0   rv   r{   rh   rb   attrr5   r5   r6   )test_gaussian_mixture_setting_best_paramsr  sT    
	

r  r_   r   Zrandom_from_dataz	k-means++Zkmeansc           
      C   st   t j|}t|dd}|j}|jd }t|| |dd}|| |j}t	j
|ddD ]\}}	t ||	rVtqVd S )Nr   r   r   r   )rJ   r_   r>   r]   r:   )r)r   r   r    r8   rJ   r0   r
   r`   r   	itertoolscombinationsZallclosera   )
r_   global_random_seedr/   rr   rJ   r0   rb   r,   Zi_meanZj_meanr5   r5   r6   test_init_means_not_duplicated  s    
   
r  c                 C   s   t j|}t|dd}|j}|jd }t|| |d}|| |jj	||j	d fksZt
t |jdd|jksvt
t |j|jddkst
|jst
d S )Nr   r   r   )rJ   r_   r>   re   r   r   )r   r   r    r8   rJ   r0   r
   r`   r   rl   ra   allrp   rq   r   )r_   r  r/   rr   rJ   r0   rb   r5   r5   r6   test_means_for_all_inits  s    
  
r  c                  C   sd   t jd} t| dd}|j}|jd }ddgddgg}t|| |ddd	}|| t|j	| d S )
Nr   r   r   r   r   rY      r   )rJ   r>   rv   r[   r]   )
r   r   r    r8   rJ   r0   r
   r`   r   r   )r/   rr   rJ   r0   rv   rb   r5   r5   r6   test_max_iter_zero  s    

r  c                  C   s   d} t jd}|| dt ddg }t ddgddgg}t || d|}t ||g}d	\}}}}	t |jd |f}
t	|d
|	d
|j}d
|
t |jd |f< t||
||d\}}}d
| }t|||||	d
|}t||||	d
|}|j|jkstt|j|j dS )a  Check that we properly initialize `precision_cholesky_` when we manually
    provide the precision matrix.

    In this regard, we check the consistency between estimating the precision
    matrix and providing the same precision matrix as initialization. It should
    lead to the same results with the same number of iterations.

    If the initialization is wrong then the number of iterations will increase.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/16944
    r   r   r:   r   g        gffffffg      @gffffff?)r:   r   r   r   re   )Z
n_clustersr\   r>   )r^   r.   )rJ   r.   r^   r{   r>   )rJ   r.   r^   r>   N)r   r   r    r   rM   r   r(   r   rl   r   r`   Zlabels_Zaranger   r
   r   ra   r   r  )r)   r/   Zshifted_gaussianCZstretched_gaussianr0   rJ   r.   r^   r>   r   labelr1   rE   r{   Zgm_with_initZgm_without_initr5   r5   r6   *test_gaussian_mixture_precisions_init_diag  sT        r  c                  C   sD   t jd} | jt dt ddd}tdd}||  dS )za
    Non-regression test for #23032 ensuring 1-component GM works on only a
    few samples.
    r   r:   rX   r  re   rd   N)	r   r   r    r$   r   identityr
   r`   r  )r/   r0   r   r5   r5   r6   -test_gaussian_mixture_single_component_stable1  s    
r  )Vr  ri   r   r   r   rm   Znumpyr   Zscipyr   r   Zsklearn.clusterr   Zsklearn.covariancer   Zsklearn.datasetsr   ior   Zsklearn.metrics.clusterr	   Zsklearn.mixturer
   r   r   r   r   r   r   r   r   Zsklearn.exceptionsr   r   Zsklearn.utils.extmathr   Zsklearn.utils._testingr   r   r   r   r   rP   r7   r8   rc   ru   rw   r|   r   r   r   r   r   r   r   r   r   markfilterwarningsZparametrizer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r
  r  r  r  r  r  r  r5   r5   r5   r6   <module>   s   $	509*0
		5
C
*" 9
E 

 

=