U
    3d)                     @   s   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 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dd Zdd Zdd Z dd  Z!d!d" Z"dS )#    N)
csr_matrix)datasets)assert_array_equal)silhouette_score)silhouette_samples)pairwise_distances)calinski_harabasz_score)davies_bouldin_scorec                  C   s   t  } | j}t|}t|}t|}| j}||||fD ]}t|dd}t	||dd}|dksft
t	||dd}	t||	 ||kr|}
nt|	|
 t	||dt|jd d dd}t	||dt|jd d dd}	|dkst
|	dkst
t|	| ||kr|}q<t|	| q<d S )NZ	euclideanmetricprecomputedr      )r   Zsample_sizeZrandom_state)r   	load_irisdatar   spZ
dok_matrixZ
lil_matrixtargetr   r   AssertionErrorpytestapproxintshape)datasetZX_denseZX_csrZX_dokZX_lilyXDZscore_precomputedZscore_euclideanZscore_dense_without_samplingZscore_dense_with_sampling r   S/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/metrics/cluster/tests/test_unsupervised.pytest_silhouette   sF    

        
r   c                  C   sn   dgdgdgdgdgdgg} t ddddddg}t| |}t |rJtt| |}t|ddddddg d S )	N              ?g       @      @r      r         ?)nparrayr   isnanr   r   r   )r   labelsZ
silhouettessr   r   r   test_cluster_size_1:   s    


r(   c               B      s  dddddddddd	d
ddddddddddddddddddddddddddddd dddddd!d"dd#dd$dd	dd%d&d'ddddddd(ddgB} t d)}| |t d*d+< ||j7 }d,d-d.d/d0d1d2d3d4d5d6d7g}d8d8d9d9d8d8d9d8d8d9d9d8g}d:d;d<d=d>d?d@dAdBdCdDdEdF}dG}d8d9dHdHd8d8d9d8d8dHdHd9g}dIdJdKdLdMdGdNdOdPdJdQdQdR}dC}|||f|||ffD ]^\}	 }
 fdSdT|D  tj t|t |	dUdVdWdX tj|
t|t |	dUdVdWdX qXd S )YNgRQ@g      @g      @gRQ@gp=
ף@gRQ@gRQ@gףp=
W @gRQ@g\(\@g      @gGz@gGz@gGz@gGz@g      @g      @gGz@g\(\@g      @g\(\@gGz@g      @g      @gRQ@g      @g      @gRQ@g      @gRQ@g      @g\(\@g      @gRQ@g      @gGz@g\(\@g      @r    gGz@)   r)   r)   BELBRACHICUBEGYFRAINDISRUSAUSSYUGZAIr!   r   gQ?g(\?gffffff?g333333?g)\(?皙?gRQ?g?g(\?gQ?gp=
ף?g{Gz)r3   r+   r0   r2   r,   r/   r6   r.   r4   r-   r5   r1   gQ?   gGz?g)\(?gzG?gGz?g{Gz?g      ?g(\?gQ?gףp=
?)r3   r0   r+   r2   r/   r6   r,   r1   r.   r4   r5   r-   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   r;   r   test_silhouette_paper_exampleQ   s    D

  rC   c               	   C   s   t  } | j}t|jd }dtt| }tj	t
|d t|| W 5 Q R X t|jd }dtt| }tj	t
|d t|| W 5 Q R X 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   r?   )r   r   r   err_msgr   r   r   test_correct_labelsize   s     rL   c                  C   sV   t  } | j}| j}t||d d t||ks4ttt||d d t|| d S )Nr   
   )r   r   r   r   r   r   r   r   )r   r   r&   r   r   r   test_non_encoded_labels   s      rN   c                  C   s8   t  } | j}| j}tt|t|t||ks4td S )N)r   r   r   r   r   listr   )r   r   r   r   r   r   test_non_numpy_labels  s    rP   dtypec              	   C   s   t tjddddddgg| dj}dddd	d	d	g}t|jjd
 |d d< t||dd t|jjd |d d< tj	t
dd t||dd W 5 Q R X d S )Nr7   g?gQ?gq=
ףp?g(\?g?)rQ   r   r!   rM   r   r   r
   i  contains non-zerorD   )r   r#   r$   r@   ZfinforQ   Zepsr   r   rI   rJ   )rQ   distsr&   r   r   r   test_silhouette_nonzero_diag  s    rT   c              	   C   sD   t jjdd}tjtdd | |ddt d W 5 Q R X dS )z+Assert message when there is only one labelr   seedNumber of labels isrD   rM   r   N)r#   randomRandomStater   rI   rJ   randr?   funcrngr   r   r   assert_raises_on_only_one_label  s    r^   c              	   C   sD   t jjdd}tjtdd | |ddt d W 5 Q R X dS )z7Assert message when all point are in different clustersr   rU   rW   rD   rM   r   N)r#   rX   rY   r   rI   rJ   rZ   rF   r[   r   r   r   (assert_raises_on_all_points_same_cluster$  s    r_   c                  C   s   t t tt dttddgd dgd  ks8tdtddgddggd dgd dgd  ksjt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   rM   r   r      r!   r   r*   rM   r8      r   g      [@)r^   r   r_   r#   onesr   r   r   r   r&   r   r   r   test_calinski_harabasz_score+  s    (2(re   c               	   C   sv  t t tt ttddgd dgd  tdks>ttddgddggd dgd dgd  tdksvt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 5 Q R X ddgd
d
gddgddgg} dddd
g}tt| |d d S )Nr`   r   ra   r!   r   r*   rM   r8   rb   r   r"   errorg?)r^   r	   r_   r#   rc   r   r   r   sqrtwarningscatch_warningssimplefilterRuntimeWarningrd   r   r   r   test_davies_bouldin_scoreA  s6    "
 ( 
rl   c               	   C   s   t dddgdddgdddggdddgdd} | tdks>ttjtdd2 t dddgdddgdddggdddgdd W 5 Q R X d	S )
zvCheck that silhouette_score works for precomputed metrics that are integers.

    Non-regression test for #22107.
    r   r!   r   r   r
   gUUUUUU?rR   rD   N)r   r   r   r   rI   rJ   )resultr   r   r   )test_silhouette_score_integer_precomputedd  s        rn   )#rh   Znumpyr#   Zscipy.sparsesparser   r   r   Zsklearnr   Zsklearn.utils._testingr   Zsklearn.metrics.clusterr   r   Zsklearn.metricsr   r   r	   r   r(   rC   rL   rN   rP   markZparametrizeZfloat32Zfloat64rT   r^   r_   re   rl   rn   r   r   r   r   <module>   s2   ) 

#