o
    Z&i1                     @   s  d dl Z 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mZmZmZ d dlmZ d dlmZ d d	lmZmZmZmZ ejd
dge e e e ejdddgdd Zdd Zdd Zdd Zdd Z dd Z!ejdej"ej#fdd Z$ejd
ee e e dd Z%ejd
ee e e dd Z&ejd
ee e d d! Z'd"d# Z(d$d% Z)d&d' Z*d(d) Z+d*d+ Z,dS ),    N)assert_allclose)issparse)datasets)pairwise_distances)calinski_harabasz_scoredavies_bouldin_scoresilhouette_samplessilhouette_score)_silhouette_reduce)assert_array_equal)CSC_CONTAINERSCSR_CONTAINERSDOK_CONTAINERSLIL_CONTAINERSsparse_containersample_sizehalfc                 C   s   t  }|j|j}}| d ur| |}|dkr t|jd d n|}t|dd}t||d|dd}t||d|dd}|dks@J |dksFJ |t	|ksOJ d S )Nr   r      Z	euclideanmetricprecomputed)r   r   Zrandom_state)
r   	load_irisdatatargetintshaper   r	   pytestapprox)r   r   datasetXyDZscore_precomputedZscore_euclidean r"   ZC:\wamp64\www\opt\env\Lib\site-packages\sklearn/metrics/cluster/tests/test_unsupervised.pytest_silhouette   s   

r$   c                  C   s^   dgdgdgdgdgdgg} t g d}t| |}t |r!J t| |}t|g d d S )N              ?g       @      @)r      r(   r(   r   r   )r         ?r)   r   r(   r(   )nparrayr	   isnanr   r   )r   labelsZ
silhouettessr"   r"   r#   test_cluster_size_14   s   


r/   c                     s   g d} t d}| |t dd< ||j7 }g d}g d}ddd	d
ddddddddd}d}g d}ddddddddddddd}d}|||f|||ffD ].\}	 }
 fd d!|D  tj t|t |	d"d#d$d% tj|
t|t |	d"d#d$d% qNd S )&N)BRQ@      @      @gRQ@r1   gp=
ף@RQ@gRQ@gףp=
W @RQ@g\(\@      @Gz@Gz@Gz@Gz@      @r0         @gGz@r9   g\(\@g      @r9   r9   r:   g\(\@Gz@g      @r8   g      @gRQ@      @g      @gRQ@g      @RQ@r6   g      @g\(\@r;   r<   r<   r7   r<   g      @gRQ@r=   g      @r5   gGz@r>   r4   r6   g\(\@g      @r'   r>   r6   r:   r0   r3   r<   gGz@r2   r7   )   r?   r?   )BELBRACHICUBEGYFRAINDISRUSAUSSYUGZAI)r(   r(   r   r   r(   r(   r   r(   r(   r   r   r(   gQ?g(\?gffffff?g333333?g)\(?皙?gRQ?g?g(\?gQ?gp=
ף?g{Gz)rI   rA   rF   rH   rB   rE   rL   rD   rJ   rC   rK   rG   gQ?)r(   r      rN   r(   r(   r   r(   r(   rN   rN   r   gGz?g)\(?gzG?gGz?g{Gz?g      ?g(\?gQ?gףp=
?)rI   rF   rA   rH   rE   rL   rB   rG   rD   rJ   rK   rC   c                    s   g | ]} | qS r"   r"   ).0nameexpectedr"   r#   
<listcomp>   s    z1test_silhouette_paper_example.<locals>.<listcomp>r   r   g{Gz?)abs)	r*   zerosZtril_indicesTr   r   r   r+   r	   )lowerr!   namesZlabels1Z	expected1Zscore1Zlabels2Z	expected2Zscore2r-   Zscorer"   rQ   r#   test_silhouette_paper_exampleK   s`   
D
rY   c                  C   s   t  } | j}t|jd }dtt| }tj	t
|d t|| W d    n1 s/w   Y  t|jd }dtt| }tj	t
|d t|| W d    d S 1 s]w   Y  d S )Nr   zJNumber of labels is %d\. Valid values are 2 to n_samples - 1 \(inclusive\)match)r   r   r   r*   aranger   lenuniquer   raises
ValueErrorr	   rU   )r   r   r    err_msgr"   r"   r#   test_correct_labelsize   s$   "rb   c                  C   sV   t  } | j}| j}t||d d t||ksJ tt||d d t|| d S )Nr   
   )r   r   r   r   r	   r   r   )r   r   r-   r"   r"   r#   test_non_encoded_labels   s    rd   c                  C   s8   t  } | j}| j}tt|t|t||ksJ d S )N)r   r   r   r   r	   list)r   r   r    r"   r"   r#   test_non_numpy_labels   s   $rf   dtypec                 C   s   t tjg dg| dj}g d}t|jjd |d d< t||dd t|jjd |d d< tj	t
d	d
 t||dd W d    d S 1 sLw   Y  d S )N)rM   皙?gQ?gq=
ףp?g(\?皙?rg   )r   r   r   r(   r(   r(   rc   r   r   r   i  contains non-zerorZ   )r   r*   r+   rV   Zfinforg   Zepsr   r   r_   r`   )rg   distsr-   r"   r"   r#   test_silhouette_nonzero_diag  s   "rm   c                 C   sf   t jg dgt jdj}g d}t|}| |}t|sJ t||dd}t||dd}t|| dS )BCheck that silhouette_samples works for sparse matrices correctly.rM   rh   rh   rM   rh   ri   rM   rh   rj   r   r   r   r   r(   r(   r(   r(   r   r   Nr*   r+   float32rV   r   r   r   r   r   r   r    pdist_densepdist_sparseZoutput_with_sparse_inputZoutput_with_dense_inputr"   r"   r#   *test_silhouette_samples_precomputed_sparse  s   rv   c                 C   s^   t jg dgt jdj}g d}t|}| |}t|sJ t||}t||}t|| dS )rn   ro   rj   rp   Nrq   rs   r"   r"   r#   (test_silhouette_samples_euclidean_sparse'  s   

rw   c                 C   s~   t jg dgt jdj}t|}| |}g d}t |}tjtdd t	|d||d W d   dS 1 s8w   Y  dS )	z?Check for non-CSR input to private method `_silhouette_reduce`.ro   rj   rp   z=Expected CSR matrix. Please pass sparse matrix in CSR format.rZ   r   )startr-   label_freqsN)
r*   r+   rr   rV   r   Zbincountr   r_   	TypeErrorr
   )r   r   rt   ru   r    ry   r"   r"   r#   test_silhouette_reduce7  s   
"r{   c                 C   Z   t jjdd}tjtdd | |ddt d W d   dS 1 s&w   Y  dS )z+Assert message when there is only one labelr   seedNumber of labels isrZ   rc   r   N)r*   randomRandomStater   r_   r`   randrU   funcrngr"   r"   r#   assert_raises_on_only_one_labelH     "r   c                 C   r|   )z7Assert message when all point are in different clustersr   r}   r   rZ   rc   r   N)r*   r   r   r   r_   r`   r   r\   r   r"   r"   r#   (assert_raises_on_all_points_same_clusterO  r   r   c                  C   s   t t tt dttddgd dgd  ksJ dtddgddggd dgd dgd  ks5J ddgddggd d	d	gd
d
ggd  dd
gdd	ggd  d	dgd
dggd  } dgd dgd  dgd  d	gd  }tt| |d d S )Nr&   rc   r   r      r(   r%   r@   rc   rN      r   g      [@)r   r   r   r*   onesr   r   r   r-   r"   r"   r#   test_calinski_harabasz_scoreV  s   (2(r   c                  C   s  t t tt ttddgd dgd  tdksJ tddgddggd dgd dgd  tdks;J ddgddggd ddgd	d	ggd  dd	gddggd  ddgd	dggd  } dgd dgd  d
gd  dgd  }tt| |d
td d  t	  t
dt t| | W d    n1 sw   Y  ddgd
d
gddgddgg} g d}tt| |d d S )Nr   r   r   r(   r%   r@   rc   rN   r   r   r)   error)r   r   r(   r   g?)r   r   r   r*   r   r   r   sqrtwarningscatch_warningssimplefilterRuntimeWarningr   r"   r"   r#   test_davies_bouldin_scorel  s6   "
$( 
r   c                  C   s   t g dg dg dgg ddd} | tdksJ tjtdd	 t g d
g dg dgg ddd W d   dS 1 s@w   Y  dS )zvCheck that silhouette_score works for precomputed metrics that are integers.

    Non-regression test for #22107.
    )r   r(   r   )r(   r   r(   )r   r(   r   )r   r   r(   r   r   gUUUUUU?rk   rZ   )r(   r(   r   N)r	   r   r   r_   r`   )resultr"   r"   r#   )test_silhouette_score_integer_precomputed  s   "r   )-r   numpyr*   r   Znumpy.testingr   Zscipy.sparser   Zsklearnr   Zsklearn.metricsr   Zsklearn.metrics.clusterr   r   r   r	   Z%sklearn.metrics.cluster._unsupervisedr
   Zsklearn.utils._testingr   Zsklearn.utils.fixesr   r   r   r   markZparametrizer$   r/   rY   rb   rd   rf   rr   Zfloat64rm   rv   rw   r{   r   r   r   r   r   r"   r"   r"   r#   <module>   sX     




#