U
    3d>                     @   s	  d Z ddlZddlZddlZddlZddlm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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& 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Z/e	j01de/ Z2e3dddddgddd ddgdddddggZ4d!Z5e4j6\Z7Z8e,e5e4dd"d#\Z9Z:e;e9Z<e	j0j=d$ej3ej;gd%d&gd'e	j0=d(d)d*ge	j0=d+ej>ej?gd,d- Z@e	j0j=d$ej3ej;gd%d&gd'e	j0=d(d)d*gd.d/ ZAe	j0j=d$ej3ej;gd%d&gd'd0d1 ZBe	j0=d2d3d4ge	j0j=d$ej3ej;gd%d&gd'e	j0=d5d6d7d8dgd9d: ZCe	j0=d;d)d*gd<d= ZDe	j0=d;d>d?gd@dA ZEdBdC ZFdDdE ZGe	j0j=dFe9e<gd%d&gd'e	j0j=dGdHdIe4dJdK gdHdIdLdMgd'e	j0=dNeegdOdP ZHe	j0j=dGdHdIe4dQdK gdHdIdLdMgd'dRdS ZIe	j0=dNeegdTdU ZJdVdW ZKe	j0=d;d)d*ge	j0=d5d6dgdXdY ZLdZd[ ZMe	j0=dNeegd\d] ZNd^d_ ZOe	j0j=dFe9e<gd%d&gd'd`da ZPdbdc ZQddde ZRe	j0=dfdgdhgdidj ZSdkdl ZTdmdn ZUe	j0=dNeegdodp ZVe	j0j=d$ej3ej;gd%d&gd'e	j0=dqed)fed*fedfge	j0=drdsd!gdtdu ZWe	j0=dNeegdvdw ZXe	j0j=dGdHdIe4gdHdIdLgd'e	j0=dNeegdxdy ZYe	j0j=d$ej3ej;gd%d&gd'e	j0=d+ejZej[ge	j0=dGdIdLge	j0=dNeegdzd{ Z\e	j0=dNeegd|d} Z]e	j0=dNeegd~d Z^dd Z_dd Z`e	j0j=dFe9e<gd%d&gd'e	j0=dNeegdd Zae	j0=d+ejZej[ej>ej?ge	j0=dNeegdd Zbe	j0j=dFe9e<gd%d&gd'dd Zcdd Zddd Zedd Zfe	j0j=dFe9e<gd%d&gd'e	j0=dNeegdd Zge	j0j=dFe9e<gd%d&gd'e	j0=dNeegdd Zhdd Zie	j0j=d$ej3ej;gd%d&gd'dd Zje	j0=dNeegdd Zkdd Zle	j0j=d$ej3ej;gd%d&gd'e	j0=d(d)d*gdd Zme	j0=d+ej>ej?ge	j0=dddgdd Zne	j0=d+ej>ej?gdd Zoe	j0=dedfedfgdd Zpe	j0=dedfedfgdd Zqe	j0=dNeegdd Zre	j0=dNeege	j0=dde5d idfdGe9dds idfdGddK idfdGe9ddddsf idfdGddK idfgdd Zse	j0=dde9dds idfgdd Zte	j0=dFe9e<ge	j0=d+ej?ej>gdd Zue	j0=dee9dddgdd ZvddÄ Zwddń Zxe	j0=ddGeydIiddgddggddǜfddɄ Zze	j0=dedfedfedfgdd΄ Z{e	j0=dddgddф Z|dS )zTesting for K-means    N)sparse)assert_array_equal)assert_allclose)threadpool_limits)clone)ConvergenceWarning)	row_norms)pairwise_distances)pairwise_distances_argmin)v_measure_score)KMeansk_meanskmeans_plusplus)MiniBatchKMeans)_labels_inertia)_mini_batch_step)_relocate_empty_clusters_dense)_relocate_empty_clusters_sparse)_euclidean_dense_dense_wrapper)_euclidean_sparse_dense_wrapper)_inertia_dense)_inertia_sparse)_is_same_clustering)create_memmap_backed_data)
make_blobs)StringIOzThe default value of `n_init` will change from \d* to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning:FutureWarningzignore:        g      @      ?g      @d   *   )	n_samplescentersZcluster_stdrandom_statearray_constrZdenser   )idsalgolloydelkandtypec                 C   s   | ddgddgddgddgg|d}ddddg}t jddgddgg|d}ddddg}d}t jddgddgg|d}d	}	td	d||d
}
|
j||d t|
j| t|
j| t|
j| |
j	|	kst
d S )Nr         ?   r(      g      ?g      ?g      ?   
n_clustersn_initinit	algorithmsample_weight)nparrayr   fitr   labels_r   inertia_cluster_centers_n_iter_AssertionError)r#   r%   r(   Xr4   init_centersexpected_labelsexpected_inertiaexpected_centersexpected_n_iterkmeans rD   F/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/cluster/tests/test_k_means.pytest_kmeans_results;   s    $rF   c           	      C   s   | ddgddgddgddgg}t ddgddgg}tdd||d}|| d}d}t|j| |j|ksrtz8ddddg}ddgddgg}t|j	| t|j
| W nH tk
r   ddddg}dd	gdd
gg}t|j	| t|j
| Y nX d S )Nr   r)   r*   r,   r-   r.   g      ?g      ?r   r   )r5   r6   r   r7   r   r9   r;   r<   r   r8   r:   )	r#   r%   r=   r>   rC   rB   r@   r?   rA   rD   rD   rE   test_kmeans_relocated_clustersU   s$     
rG   c                 C   s   t ddddddddd	d
g
dd}| |}t d
}t dddgdd}t dddgdd}t dddg}t jd
t jd}| t jkrt|||||| nt|j|j	|j
||||| t|dddg t|dgd
gd	gg d S )Ng      $g      #ig      !ir*   	   g      #@
   ig     0g      $@r   r+      i)r5   r6   reshapeoneszerosint32r   r   dataindicesZindptrr   r   )r#   r=   r4   centers_oldcenters_newZweight_in_clusterslabelsrD   rD   rE   test_relocate_empty_clustersv   s8    &

     rU   distributionnormalZblobstolg{Gz?g:0yE>g0.++c           	      C   s   t j|}| dkr"|jdd}nt|d\}}d||dk < ||}td|d|d}td	d|d|d
}|| || t|j|j t	|j
|j
 |j|jkst|jtj|jddkstd S )NrW   i  rJ   sizer"   r      r*   )r/   r"   r0   rX   r'   )r2   r/   r"   r0   rX   ư>)rel)r5   randomRandomStaterW   r   r   r7   r   r:   r   r8   r;   r<   r9   pytestZapprox)	rV   r#   rX   global_random_seedrndr=   _Zkm_lloydZkm_elkanrD   rD   rE   test_kmeans_elkan_results   s(    

rf   r2   c                 C   sH   t j|}|jdd}d}t| d|dd|d|}|j|k sDtd S )NrY   rZ   i,  r]   r*   r   )r2   r/   r"   r0   rX   max_iter)r5   r`   ra   rW   r   r7   r;   r<   )r2   rc   rd   r=   rg   kmrD   rD   rE   test_kmeans_convergence   s    	ri   autofullc              	   C   sV   t jdd}t| d}tjtd|  dd || |jdksHt	W 5 Q R X d S )Nr   r-   r2   zalgorithm='zB' is deprecated, it will be removed in 1.3. Using 'lloyd' instead.matchr&   )
r5   r`   Zrandr   rb   warnsFutureWarningr7   
_algorithmr<   )r2   r=   rC   rD   rD   rE   ,test_algorithm_auto_full_deprecation_warning   s    


rr   c              	   C   sv  t j| }t|jtjd }| }t |}t |}t j|jd t	j
d}t j|jd t	j
d}t jt	jd t	j
d}t	d d }	td d }
|d d }t|	||||t j| dd}|dkstt|	||\}}|dkst||k stt|
||||t j| dd}|dkstt|
||\}}|dks<t||k sJtt|| t|| t|| t|| d S )NrZ   r   r+   rJ   F)random_reassignr   )r5   r`   ra   r!   rW   shapecopyZ
zeros_likerN   r=   r(   rM   X_csrr   r<   r   r   r   )rc   rngrR   Zcenters_old_csrrS   Zcenters_new_csrZweight_sumsZweight_sums_csrr4   ZX_mbZX_mb_csrZsample_weight_mbZold_inertiarT   Znew_inertiaZold_inertia_csrZ
labels_csrZnew_inertia_csrrD   rD   rE   !test_minibatch_update_consistency   sZ    


	
	  


rx   c                 C   sX   | j }|jttfkst| j}t|jd tks6ttt	t
|d | jdksTtd S )Nr   r   r   )r:   rt   r/   
n_featuresr<   r8   r5   uniquer   r   true_labelsr9   )rh   r!   rT   rD   rD   rE   _check_fitted_model#  s    r|   rP   r1   r`   	k-means++c                 C   s   t S Nr!   r=   kr"   rD   rD   rE   <lambda>4      r   ndarraycallable	Estimatorc                 C   s4   t |trdnd}| |td|d|}t| d S )NrJ   r*   r   r1   r/   r"   r0   )
isinstancestrr/   r7   r|   )r   rP   r1   r0   rh   rD   rD   rE   test_all_init1  s    	   r   c                 C   s   t S r~   r   r   rD   rD   rE   r   C  r   c                 C   sF   t | trdnd}t| td|d}tdD ]}|t q*t| d S )NrJ   r*   r   r   r   )r   r   r   r/   rangepartial_fitr=   r|   )r1   r0   rh   irD   rD   rE   &test_minibatch_kmeans_partial_fit_initA  s       r   c                 C   s`   t t}t t}| ttd|dt}| t|d|d|}t|j|j t|j	|j	 d S )Nr*   r/   r1   r0   r"   )
r5   asfortranarrayr=   r!   r/   r7   r   r:   r   r8   )r   rc   	X_fortrancenters_fortranZkm_cZkm_frD   rD   rE   test_fortran_aligned_dataR  s(    

   r   c                  C   s8   t tddd} tj}t t_z| t W 5 |t_X d S )Nr   r*   )r/   r"   verbose)r   r/   sysstdoutr   r7   r=   )rh   Z
old_stdoutrD   rD   rE   test_minibatch_kmeans_verbosee  s    r   c              	   C   s   t jdjdd}t| tddd|dd| | }t	d|j
sJtt	d	|j
s\t|dkrxt	d
|j
stnt	d|j
std S )Nr   rY   rZ   r   r`   r*   )r2   r/   r"   r1   r0   rX   r   zInitialization completezIteration [0-9]+, inertiazstrict convergencez center shift .* within tolerance)r5   r`   ra   rW   r   r/   r7   
readouterrresearchoutr<   )r2   rX   capsysr=   capturedrD   rD   rE   test_kmeans_verbosep  s$    
r   c                	   C   s0   t jtdd tdddt W 5 Q R X d S )Nz,init_size.* should be larger than n_clustersrm   rJ      )	init_sizer/   )rb   ro   RuntimeWarningr   r7   r=   rD   rD   rD   rE   'test_minibatch_kmeans_warning_init_size  s
     r   c              	   C   s2   t jtdd | ttddt W 5 Q R X d S )NzAExplicit initial center position passed: performing only one initrm   rJ   r1   r/   r0   )rb   ro   r   r!   r/   r7   r=   )r   rD   rD   rE   'test_warning_n_init_precomputed_centers  s
    r   c                 C   s   t dd| d\}}d|d d dd d f< tdd| dd	|}|jjd
d dksXttdd| dd	|}|jjd
d dksttd| dd}tdD ]}|| q|jjd
d dkstd S )Nr   r]   )r    r!   r"   r   r-   r   rJ   r`   )r/   
batch_sizer"   r1   r*   Zaxis   )r/   r"   r1   )	r   r   r7   r:   anysumr<   r   r   )rc   Zzeroed_Xr{   rh   r   rD   rD   rE    test_minibatch_sensible_reassign  s8      
      r   c              
   C   s   t ttf}ttD ]}tt|k jdd||< qt t	}t 
|}t| ||dd  }t| |||t tt j|ddd t| ||dd  }||kstt| |||t tt j|ddd t|| d S )Nr   r   r*   T)rs   Zreassignment_ratiogV瞯<)r5   emptyr/   ry   r   r=   r{   meanrM   r    Z
empty_liker   r   rN   r`   ra   r<   r   )rP   rc   Zperfect_centersr   r4   rS   Zscore_beforeZscore_afterrD   rD   rE   test_minibatch_reassign  s:    



r   c                   C   s   t ddtdddt d S )Nr   rJ   r   T)r/   r   r   r"   r   )r   r    r7   r=   rD   rD   rD   rE   &test_minibatch_with_many_reassignments  s    r   c                  C   sp   t ddddt} | jdks"tt ddddt} | jdksDtt dddtd dt} | jtksltd S )NrJ   r]   r*   )r/   r   r0         )r/   r   r0   r   )r   r7   r=   Z
_init_sizer<   r    rh   rD   rD   rE   test_minibatch_kmeans_init_size  s       r   ztol, max_no_improvement)-C6?N)r   rJ   c                 C   s   t dddd\}}}td|d|dddd|d	}|| d|j  k rNdk sTn t|  }|d krrd	|jksrt|dkrd
|jkstd S )Nr,   r   T)r!   r"   Zreturn_centersr   rJ   r*   )	r/   r1   r   rX   r"   rg   r0   r   max_no_improvementz Converged (small centers change)z*Converged (lack of improvement in inertia))r   r   r7   r;   r<   r   r   )r   rX   r   r=   re   r!   rh   r   rD   rD   rE   #test_minibatch_declared_convergence  s&    
r   c                  C   s   d} t jd }td| ddt }|jt|j|  | ks@tt	|jt
sPttd| ddd ddt }|jdksxt|jd| |  kstt	|jt
std S )Nr   r   r,   )r/   r   r"   rJ   )r/   r   r"   rX   r   rg   )r=   rt   r   r7   r;   r5   ceilZn_steps_r<   r   int)r   r    rh   rD   rD   rE   test_minibatch_iter_steps'  s$    
	r   c                  C   s6   t  } tdtdd}||  t| t| t  d S )NFr   )Zcopy_xr/   r"   )r=   ru   r   r/   r7   r|   r   )Zmy_Xrh   rD   rD   rE   test_kmeans_copyx@  s
    
r   c                 C   s`   t j|dd}| d|dd}|||}| d|dd}|||}||ks\td S )Nr   rJ   r*   )r0   r"   rg   )r5   r`   ra   randnr7   Zscorer<   )r   rc   r=   km1s1km2s2rD   rD   rE   test_score_max_iterK  s    r   zEstimator, algorithmrg   r-   c                 C   s   t ddd|d\}}|||d}| ddd||d}|d k	rF|j|d || |j}	||}
t|
|	 ||}
t|
|	 ||j}
t|
t	d d S )Nr   rJ   r    ry   r!   r"   r+   r`   )r/   r1   r0   rg   r"   rl   )
r   
set_paramsr7   r8   predictr   fit_predictr:   r5   Zarange)r   r2   r#   rg   Zglobal_dtyperc   r=   re   rh   rT   predrD   rD   rE   test_kmeans_predictX  s0       





r   c                 C   sl   t j|tf}| t|dd}|jt|d | t|dd}|jt|d t	|j
|j
 t|j|j d S Nr*   r/   r"   r0   r3   )r5   r`   ra   Zrandom_sampler    r/   r7   r=   rv   r   r8   r   r:   )r   rc   r4   Zkm_denseZ	km_sparserD   rD   rE   test_dense_sparse  s"        r   c                 C   s^   t |trdnd}| t||dd}|t t|t|j |t t|t|j d S )NrJ   r*   r   r   )	r   r   r/   r7   rv   r   r   r=   r8   )r   r1   r0   rh   rD   rD   rE   test_predict_dense_sparse  s    

r   c           
   	   C   s   t ddgddgddgddgddgddgg}|||d	}|d
krFdnd}|d
kr^|d d n|}| d|||d}| tkr|jdd || |jjt jkstddddddg}	t	t
|j|	d | tkrt||}|jjt jkstd S )Nr   rJ      rI   rH   r*   r-   rK   r+   r   r   )r   r   )r5   r6   r   r   r7   r:   r(   float64r<   r   r   r8   r   r   )
r   r#   r(   r1   rc   X_denser=   r0   rh   r?   rD   rD   rE   test_integer_input  s&    .   
r   c                 C   sb   | t |dt}||j}t|t|j t| t	
t  |t}t|tt|j d S )Nr/   r"   )r/   r7   r=   	transformr:   r   r	   r   Zdiagonalr5   rN   )r   rc   rh   XtrD   rD   rE   test_transform  s    
r   c                 C   s8   | |dd tt}| |ddt}t|| d S )Nr*   )r"   r0   )r7   r=   r   Zfit_transformr   )r   rc   ZX1ZX2rD   rD   rE   test_fit_transform  s    r   c                 C   s:   t j}dD ]*}ttd|| ddt}|j|ks
tq
d S )N)r*   r]   rJ   r`   r*   )r/   r1   r0   r"   rg   )r5   infr   r/   r7   r=   r9   r<   )rc   Zprevious_inertiar0   rh   rD   rD   rE   test_n_init  s    r   c                 C   s`   t ttd | d\}}}|jttfks(tt|jd tks@ttt	t
|d |dks\td S )N)r/   r4   r"   r   r   r   )r   r=   r/   rt   ry   r<   r5   rz   r   r   r{   )rc   Zcluster_centersrT   inertiarD   rD   rE   test_k_means_function  s       r   c           
      C   s0  | d|d}i }i }i }i }t jt jfD ]}|j|dd}	||	 |j||< ||	||< |j||< |j||< |jj	|kst
| tkr(||	dd  |jj	|ks(t
q(t|t j |t j dd t|t j |t j |t j  d d	 t|t j |t j |t j  d d	 t|t j |t j  d S )
Nr*   )r0   r"   Fru   r   r,   r   rtol)Zatol)r5   r   float32astyper7   r9   r   r:   r8   r(   r<   r   r   r   maxr   )
r   rP   rc   rh   r   r   r!   rT   r(   r=   rD   rD   rE   test_float_precision  s0    



(  r   c                 C   sJ   t j|dd}tj|dd}| |tdd}|| t|j|rFtd S )NFr   r*   r   )	r=   r   r!   r/   r7   r5   Zmay_share_memoryr:   r<   )r   r(   Z
X_new_typeZcenters_new_typerh   rD   rD   rE   test_centers_not_mutated'  s
    
r   c                 C   s8   t td| }t t|jdd| }t|j|j d S )N)r/   r*   r/   r1   r0   )r   r/   r7   r:   r   )rP   r   r   rD   rD   rE   test_kmeans_init_fitted_centers6  s    r   c              	   C   st   t ddgddgddgddgg}td| d}d}tjt|d* || t|jtt	dksft
W 5 Q R X d S )Nr   r*      r   zmNumber of distinct clusters \(3\) found smaller than n_clusters \(4\). Possibly due to duplicate points in X.rm   r,   )r5   asarrayr   rb   ro   r   r7   setr8   r   r<   )rc   r=   rh   msgrD   rD   rE   1test_kmeans_warns_less_centers_than_unique_points@  s    "
r   c                 C   s   t j| ddS Nr   r   )r5   sortr   rD   rD   rE   _sort_centersQ  s    r   c                 C   s   t j| jddtd}t jt|dd}ttdt	| d}t
|jt|d}t |j|}t
||}t|j| t|j|j tt|jt|j d S )Nr*   r]   rZ   r   r   )r1   r0   r/   r"   r3   )r5   r`   ra   randintr    repeatr=   r   r!   r/   r   r7   r8   r   r   r9   r   r:   )rc   r4   ZX_repeatrh   Zkm_weightedZrepeated_labelsZkm_repeatedrD   rD   rE   test_weighted_vs_repeatedU  s*         r   c                 C   s\   t t}| t|dd}t|j|d d}t|j||d}t|j|j t|j	|j	 d S r   )
r5   rM   r    r/   r   r7   r   r8   r   r:   )r   rP   rc   r4   rh   Zkm_noneZkm_onesrD   rD   rE   test_unit_weights_vs_no_weightso  s    
r   c                 C   sj   t j|jtd}| t|dd}t|j||d}t|j|d| d}t|j	|j	 t
|j|j d S )NrZ   r*   r   r3   r)   )r5   r`   ra   uniformr    r/   r   r7   r   r8   r   r:   )r   rP   rc   r4   rh   Zkm_origZ	km_scaledrD   rD   rE   test_scaled_weights~  s    r   c                  C   s$   t dddt} | jdks td S )Nr'   r*   )r2   rg   )r   r7   r=   r;   r<   r   rD   rD   rE    test_kmeans_elkan_iter_attribute  s    r   c                 C   st   | dgdgg}ddg}t dgdgg}td|dd}|j||d tt|jdks\tt|j	dgdgg d S )	NrH   r*   gffffff?g?rJ   r-   r   r3   )
r5   r6   r   r7   lenr   r8   r<   r   r:   )r#   r=   r4   r1   rh   rD   rD   rE   #test_kmeans_empty_cluster_relocated  s    r   c              	   C   s~   t j|}|jdd}tddd | t|d|j}W 5 Q R X tddd | t|d|j}W 5 Q R X t|| d S )N)2   rJ   rZ   r*   Zopenmp)ZlimitsZuser_apir   r-   )	r5   r`   ra   rW   r   r/   r7   r8   r   )r   rc   rd   r=   Zresult_1Zresult_2rD   rD   rE   #test_result_equal_in_diff_n_threads  s    r   c                	   C   s0   t jtdd tdddt W 5 Q R X d S )Nz9algorithm='elkan' doesn't make sense for a single clusterrm   r*   r'   )r/   r2   )rb   ro   r   r   r7   r=   rD   rD   rD   rE   test_warning_elkan_1_cluster  s
    r   c                 C   sz   t j|jdd}|d d }| |}dd }|||\}}tdd||dd|}|j}	|j}
t||	 t	||
 d S )N)r   r]   rZ   r]   c                 S   sP   |  }t| |}t|jd D ]}| ||k jdd||< q t| |}||fS r   )ru   r
   r   rt   r   )r=   r1   Znew_centersrT   labelrD   rD   rE   	py_kmeans  s    

z+test_k_means_1_iteration.<locals>.py_kmeansr*   )r/   r0   r1   r2   rg   )
r5   r`   ra   r   r   r7   r8   r:   r   r   )r#   r%   rc   r=   r>   r   Z	py_labelsZ
py_centersZ	cy_kmeansZ	cy_labelsZ
cy_centersrD   rD   rE   test_k_means_1_iteration  s$        
r   squaredTFc                 C   s   t j|}tjdddd|| d}| d}|dj| dd}|d	  }|| d	  }|rh|nt 	|}t
|||}	t|j|j|||}
| t jkrd
nd}t|	|
|d t|	||d t|
||d d S )Nr*   r   r)   csrZdensityformatr"   r(   rH   Fr   r-   r   gHz>r   )r5   r`   ra   sptoarrayrL   r   r   r   sqrtr   r   rP   rQ   r   r   )r(   r   rc   rw   Za_sparseZa_densebZb_squared_normexpectedZdistance_dense_denseZdistance_sparse_denser   rD   rD   rE   test_euclidean_distance  s4             r  c                 C   s|  t j|}tjdddd|| d}| }|dj| dd}|ddj| dd}|jddt jd	}|||  d
 j	dd}t 	|| }	t
||||dd}
t||||dd}| t jkrdnd}t|
||d t|
|	|d t||	|d d}||k}|| ||  d
 j	dd}t 	|||  }	t
||||d|d}
t||||d|d}t|
||d t|
|	|d t||	|d d S )Nr   rJ   r)   r   r   Fr   r]   )r[   r(   r-   r*   r   )	n_threadsr   r^   r   )r  Zsingle_label)r5   r`   ra   r   r   r   r   r   rO   r   r   r   r   r   )r(   rc   rw   ZX_sparser   r4   r!   rT   Z	distancesr   Zinertia_denseZinertia_sparser   r   maskrD   rD   rE   test_inertia  sd                       r  zKlass, default_n_initrJ   r,   c              	   C   s   | dd}t   t dt |t W 5 Q R X | jdkrBdnd}d| d}|  }tjt|d	 |t W 5 Q R X d S )
Nr*   r0   errorr   rJ   r,   z/The default value of `n_init` will change from z to 'auto' in 1.4rm   )	warningscatch_warningssimplefilterrp   r7   r=   __name__rb   ro   )Klassdefault_n_initestr   rD   rD   rE   !test_change_n_init_future_warning*  s    


r  c                 C   s\   | ddd}| t |jdks$t| ddd}| t | jdkrP|jdksXndsXtd S )	Nrj   r}   )r0   r1   r*   r`   r   rJ   r,   )r7   r=   Z_n_initr<   r
  )r  r  r  rD   rD   rE   test_n_init_auto;  s    

r  c                 C   sV   t dgdgdgg}t dddg}| dddj||d	 t|t dddg d S )
Nr*   r-   r   r)   g?g333333?r   r   r3   )r5   r6   r7   r   )r   r=   r4   rD   rD   rE   test_sample_weight_unchangedF  s    r  zparam, matchr/   r*   z#n_samples.* should be >= n_clusterszIThe shape of the initial centers .* does not match the number of clustersc                 C   s   | d d S )Nr-   rD   ZX_r   r"   rD   rD   rE   r   [  r   rK   zUThe shape of the initial centers .* does not match the number of features of the datac                 C   s   | d dd df S )NrK   r-   rD   r  rD   rD   rE   r   e  r   c              	   C   s:   | dd}t jt|d |jf |t W 5 Q R X d S )Nr*   r  rm   )rb   raises
ValueErrorr   r7   r=   )r   paramrn   rh   rD   rD   rE   test_wrong_paramsP  s    
r  x_squared_normszKThe length of x_squared_norms .* should be equal to the length of n_samplesc              	   C   s,   t jt|d tttf|  W 5 Q R X d S )Nrm   )rb   r  r  r   r=   r/   )r  rn   rD   rD   rE   !test_kmeans_plusplus_wrong_paramst  s    r  c                 C   s   |  |} t| t|d\}}|jd tks.t|dk s>t|| jd k sTt|jd tksft|jdd| jddk st|jdd| jddk sttt	|  || d S )Nr\   r   r   )
r   r   r/   rt   r<   allr   minr   r=   )rP   r(   rc   r!   rQ   rD   rD   rE   test_kmeans_plusplus_output  s    
  
  r  )r   c                 C   s$   t tt| d\}}tt| | d S )N)r  )r   r=   r/   r   )r  r!   rQ   rD   rD   rE   test_kmeans_plusplus_norms  s    r  c                 C   s<   t tt| d\}}tt}t |t| d\}}t|| d S )Nr\   )r   r=   r/   r5   r   r   )rc   Z	centers_cre   r   r   rD   rD   rE   test_kmeans_plusplus_dataorder  s    
  
r  c               	   C   s   t jddddddddgt jd} t| | ds0tt jddddddddgt jd}t| |ds`tt jddddddddgt jd}t| |drtd S )Nr*   r   r-   r+   r,   )r5   r6   rO   r   r<   )Zlabels1Zlabels2Zlabels3rD   rD   rE   test_is_same_clustering  s       r  kwargs)r1   r0   c                 C   sH   t jddgddgddgddggt jd}tf ddi| }|| dS )zZCheck that init works with numpy scalar strings.

    Non-regression test for #21964.
    r   r)   r*   r+   r/   r-   N)r5   r   r   r   r7   )r  r=   Z
clusteringrD   rD   rE   -test_kmeans_with_array_like_or_np_scalar_init  s    (r  zKlass, methodr7   r   c                    sR   | j   |  }t||t |jjd }| }t fddt|D | dS )z=Check `feature_names_out` for `KMeans` and `MiniBatchKMeans`.r   c                    s   g | ]}  | qS rD   rD   ).0r   
class_namerD   rE   
<listcomp>  s     z*test_feature_names_out.<locals>.<listcomp>N)	r
  lowergetattrr=   r:   rt   Zget_feature_names_outr   r   )r  methodrC   r/   Z	names_outrD   r!  rE   test_feature_names_out  s    
r'  	is_sparsec                 C   sb   t ddddd\}}| r"t|}t }||}t|j|_t|j|_||}t	|| dS )z_Check that predict does not change cluster centers.

    Non-regression test for gh-24253.
    r   rJ   r   r   N)
r   r   
csr_matrixr   r   r   r:   r8   r   r   )r(  r=   re   rC   Zy_pred1Zy_pred2rD   rD   rE   ,test_predict_does_not_change_cluster_centers  s    


r*  )}__doc__r   r   r  Znumpyr5   Zscipyr   r   rb   Zsklearn.utils._testingr   r   Zsklearn.utils.fixesr   Zsklearn.baser   Zsklearn.exceptionsr   Zsklearn.utils.extmathr   Zsklearn.metricsr	   r
   Zsklearn.metrics.clusterr   Zsklearn.clusterr   r   r   r   Zsklearn.cluster._kmeansr   r   Zsklearn.cluster._k_means_commonr   r   r   r   r   r   r   r   Zsklearn.datasetsr   ior   r   markfilterwarningsZ
pytestmarkr6   r!   r    rt   r/   ry   r=   r{   r)  rv   Zparametrizer   r   rF   rG   rU   rf   ri   rr   rx   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rO   Zint64r   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  Zstr_r  r'  r*  rD   rD   rD   rE   <module>   s  
   

 
  
  
 
) 
 

?
	





.

 
 #
   
 

$
	 
 

	 
 
+



	

	


 "

