ó
‡ˆ\c           @   sÉ  d  Z  d d l m 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 d d l m Z m Z m Z 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* d d l+ m, Z, d d l m- Z- d d l m. Z. d d l/ m0 Z0 m1 Z1 d „  Z2 d „  Z3 d „  Z4 d „  Z5 d „  Z6 d „  Z7 e j8 j9 d ƒ d  „  ƒ Z: d! „  Z; e j8 j9 d ƒ d" „  ƒ Z< d# „  Z= d$ „  Z> e j8 j9 d ƒ d% „  ƒ Z? d& „  Z@ d' „  ZA d( „  ZB d) „  ZC d* „  ZD d+ „  ZE d, „  ZF d- „  ZG d. „  ZH d/ „  ZI d0 „  ZJ d S(1   s=   
Several basic tests for hierarchical clustering procedures

iÿÿÿÿ(   t   mkdtempN(   t   partial(   t   sparse(   t	   hierarchy(   t   assert_raises(   t   assert_equal(   t   assert_almost_equal(   t   assert_array_almost_equal(   t   assert_raise_message(   t   ignore_warnings(   t	   ward_tree(   t   AgglomerativeClusteringt   FeatureAgglomeration(   t   _hc_cutt   _TREE_BUILDERSt   linkage_treet   _fix_connectivity(   t   grid_to_graph(   t   PAIRED_DISTANCESt   cosine_distancest   manhattan_distancest   pairwise_distances(   t   normalized_mutual_info_score(   t   kneighbors_graph(   t   average_merget	   max_merge(   t   IntFloatDict(   t   assert_array_equal(   t   assert_warns(   t
   make_moonst   make_circlesc    
      C   sž   t  j j d ƒ }  |  j d d ƒ } t t t | j d d ƒ\ } } } } t | j ƒ \ } } } }	 t | | ƒ t	 | | ƒ t	 | | ƒ t	 | |	 ƒ d  S(   Ni    i2   id   t   n_componentsi
   (
   t   npt   randomt   RandomStatet   randnR   t   DeprecationWarningR   t   TR   R   (
   t   rngt   Xt   childrent   n_nodest   n_leavest   parentt
   children_tt	   n_nodes_tt
   n_leaves_tt   parent_t(    (    sF   lib/python2.7/site-packages/sklearn/cluster/tests/test_hierarchical.pyt0   test_deprecation_of_n_components_in_linkage_tree(   s    	c          C   sû   t  j j d ƒ }  |  j d d ƒ } t t t d d ƒ j | ƒ t t t | d d ƒt t t | d t  j	 d ƒ ƒt
 ƒ  j | ƒ t | ƒ } t | d d	 ƒ} t | d
 t | d d ƒd
 ƒ t | d t ƒ} t | d
 t | d d ƒd
 ƒ d  S(   Ni*   t   sizei   t   linkaget   foot   connectivityi   t   affinityt   precomputedi    t   cosinet	   manhattan(   i   i   (   i   i   (   R    R!   R"   t   normalR   t
   ValueErrorR   t   fitR   t   onesR   R   R   R   (   R&   R'   t   dist   res(    (    sF   lib/python2.7/site-packages/sklearn/cluster/tests/test_hierarchical.pyt   test_linkage_misc7   s    !c    
      C   s  t  j j d ƒ }  t  j d d g d t  j ƒ} d | d d … d d … f <|  j d d ƒ } t | j Œ  } xœ t j	 ƒ  D]Ž } | | j
 | ƒ \ } } } } d | j d	 d	 }	 t | ƒ | |	 k sÏ t ‚ t t | | j
 t  j d
 ƒ ƒ t t | | j
 d  | ƒ qz Wd  S(   Ni    i
   t   dtypei   i   i2   id   i   i   (   i   i   (   R    R!   R"   R<   t   boolR#   R   t   shapeR   t   valuesR%   t   lent   AssertionErrorR   R:   (
   R&   t   maskR'   R4   t   tree_builderR(   R   R*   R+   R)   (    (    sF   lib/python2.7/site-packages/sklearn/cluster/tests/test_hierarchical.pyt   test_structured_linkage_treeM   s    c          C   s;  t  j j d ƒ }  |  j d d ƒ } x{ | | d f D]i } t ƒ  , t t t | j d d ƒ\ } } } } Wd  QXd | j	 d d } t
 t | ƒ | | ƒ q5 Wx’ t j ƒ  D]„ } x{ | | d f D]i } t ƒ  , t t | | j d d ƒ\ } } } } Wd  QXd | j	 d d } t
 t | ƒ | | ƒ qÆ Wq¯ Wd  S(   Ni    i2   id   t
   n_clustersi
   i   i   (   R    R!   R"   R#   R	   R   t   UserWarningR
   R%   RB   R   RD   R   RC   (   R&   R'   t   this_XR(   R)   R*   R+   RG   (    (    sF   lib/python2.7/site-packages/sklearn/cluster/tests/test_hierarchical.pyt   test_unstructured_linkage_treec   s    
*
*c    	      C   s»   t  j j d ƒ }  t  j d d g d t  j ƒ} |  j d d ƒ } t | j Œ  } xc t j	 ƒ  D]U } | | j
 | ƒ \ } } } } d | j d d } t | ƒ | | k s^ t ‚ q^ Wd  S(   Ni    i
   R@   i2   id   i   i   (   R    R!   R"   R<   RA   R#   R   RB   R   RC   R%   RD   RE   (	   R&   RF   R'   R4   t   linkage_funcR(   R)   R*   R+   (    (    sF   lib/python2.7/site-packages/sklearn/cluster/tests/test_hierarchical.pyt   test_height_linkage_treez   s    c          C   sV   t  j j d ƒ }  d } |  j | d ƒ } d } t d | ƒ } t t | j | ƒ d  S(   Ni    id   i2   i   t   memory(   R    R!   R"   R#   R   R   R:   R;   (   R&   t	   n_samplesR'   RO   t
   clustering(    (    sF   lib/python2.7/site-packages/sklearn/cluster/tests/test_hierarchical.pyt.   test_agglomerative_clustering_wrong_arg_memory†   s    s6   ignore:the behavior of nmi will change in version 0.22c       
   C   s4  t  j j d ƒ }  t  j d d g d t  j ƒ} d } |  j | d ƒ } t | j Œ  } x‰d D]} t d
 d d | d | ƒ } | j	 | ƒ zh t
 ƒ  } t d
 d d | d | d | ƒ } | j	 | ƒ | j } t  j t  j | ƒ ƒ d k só t ‚ Wd  t j | ƒ Xt d
 d d | d | ƒ } t | _ | j	 | ƒ t t | j | ƒ d ƒ d  | _ | j	 | ƒ t  j t  j | j ƒ ƒ d k sŒt ‚ t d
 d d t j | j ƒ  d  d … d  d … f ƒ d | ƒ } t t | j	 | ƒ q^ Wt d
 d d | j ƒ  d d d d ƒ } t t | j	 | ƒ x› t j ƒ  D] }	 t d
 d d t  j | | f ƒ d |	 d d ƒ } | j	 | ƒ t d
 d d d  d |	 d d ƒ }
 |
 j	 | ƒ t t |
 j | j ƒ d ƒ q*Wt d
 d d | d d ƒ } | j	 | ƒ t | ƒ } t d
 d d | d d d d ƒ }
 |
 j	 | ƒ t | j |
 j ƒ d  S(   Ni    i
   R@   id   i2   t   wardt   completet   averaget   singleRI   R4   R2   RO   i   R5   R8   R6   (   RS   RT   RU   RV   (    R    R!   R"   R<   RA   R#   R   RB   R   R;   R    t   labels_R1   t   uniqueRE   t   shutilt   rmtreet   Falset   compute_full_treeR   R   t   NoneR4   R   t
   lil_matrixt   toarrayR   R:   R   t   keysR   R   (   R&   RF   RP   R'   R4   R2   RQ   t   tempdirt   labelsR5   t   clustering2t   X_dist(    (    sF   lib/python2.7/site-packages/sklearn/cluster/tests/test_hierarchical.pyt   test_agglomerative_clustering‘   sˆ    				(		'%							c          C   s$  t  j j d ƒ }  t  j d d g d t  j ƒ} |  j d d ƒ } t | j Œ  } t d d d | ƒ } | j	 | ƒ t  j
 t  j | j ƒ ƒ d k sš t ‚ | j | ƒ } | j d	 d k sÂ t ‚ | j | ƒ } t  j | d ƒ j
 d k só t ‚ t | j | ƒ | ƒ t t | j	 | d  ƒ d  S(
   Ni    i
   R@   i2   id   RI   i   R4   i   (   R    R!   R"   R<   RA   R#   R   RB   R   R;   R1   RX   RW   RE   t	   transformt   inverse_transformR   R   R:   (   R&   RF   R'   R4   t   agglot   X_redt   X_full(    (    sF   lib/python2.7/site-packages/sklearn/cluster/tests/test_hierarchical.pyt   test_ward_agglomerationë   s    '"c          C   s¶   t  d d d d ƒ \ }  } t d d d d ƒ } | j |  ƒ t t | j | ƒ d	 ƒ t d
 d d d d d ƒ \ } } t d d d d ƒ } | j | ƒ t t | j | ƒ d	 ƒ d  S(   Nt   noisegš™™™™™©?t   random_statei*   RI   i   R2   RV   i   t   factorg      à?gš™™™™™™?(   R   R   R;   R   R   RW   R   (   t   moonst   moon_labelsRQ   t   circlest   circle_labels(    (    sF   lib/python2.7/site-packages/sklearn/cluster/tests/test_hierarchical.pyt   test_single_linkage_clusteringÿ   s    c         C   s§   g  } xz |  | g D]l } t  | ƒ } | j ƒ  d } t j | | f ƒ } d | t j | ƒ | f <| j t j | | j ƒ ƒ q W| d | d k j ƒ  s£ t	 ‚ d S(   s   Util for comparison with scipyi   i    N(
   RD   t   maxR    t   zerost   aranget   appendt   dotR%   t   allRE   (   t   cut1t   cut2t   co_clustt   cutt   nt   kt   ecut(    (    sF   lib/python2.7/site-packages/sklearn/cluster/tests/test_hierarchical.pyt   assess_same_labelling  s     c          C   s¢  d \ }  } } t  j j d ƒ } t  j |  |  f ƒ } xKt j ƒ  D]=} x4t d ƒ D]&} d | j d |  | f ƒ } | d t  j |  ƒ d  d  … t  j	 f 8} | | j
 d d	 ƒ d  d  … t  j	 f 8} t j | d
 | ƒ} | d  d  … d  d … f j t  j ƒ }	 t | | | ƒ \ }
 } } } |
 j d d	 ƒ t |
 |	 d | ƒ t | |
 | ƒ } t | |	 | ƒ } t | | ƒ qV WqC Wt t t | d	 |
 | ƒ d  S(   Ni
   i   i   i    gš™™™™™¹?R1   g      @t   axisi   t   methodi   s2   linkage tree differs from scipy impl for linkage: (   i
   i   i   (   R    R!   R"   R<   R   R`   t   rangeR9   Rv   t   newaxist   meanR   R2   t   astypet   intt   sortR   R   R   R   R:   (   R~   t   pR   R&   R4   R2   t   iR'   t   outt	   children_R(   t   _R*   R}   t   cut_(    (    sF   lib/python2.7/site-packages/sklearn/cluster/tests/test_hierarchical.pyt   test_scikit_vs_scipy  s$    *)(c       	   C   s  t  j 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  j d d d d d d g ƒ } t |  d d d t ƒ} d | | j } t |  | d ƒ \ } } xO d D]G } t d d d | d | ƒ } | j |  ƒ t t	 | j
 | ƒ d ƒ qÀ Wd  S(   Ni    i   i   t   n_neighborsi   t   include_selfg      à?t	   euclideanRV   RU   RS   RI   R2   R4   (   RV   RU   RU   RS   (   R    t   arrayR   R[   R%   R   R   R;   R   R   RW   (   R'   t   true_labelsR4   R   R2   RQ   (    (    sF   lib/python2.7/site-packages/sklearn/cluster/tests/test_hierarchical.pyt   test_identical_points>  s     !!	c          C   s}   t  j d d d d d d d d d d d d d d d  g ƒ }  t |  d d t ƒ} t d d d | d d ƒ } | j |  ƒ d  S(!   Ngyé&1¬Œ?g¸…ëQ¸¾?gòÒMbX¹?g¢E¶óýÔ¸?gœÄ °rh‘?g/Ý$•Ã?g;ßO—n’?gÛù~j¼tÃ?gßO—nÃ?g;ßO—nÂ?i
   R’   RI   i   R4   R2   RS   (   gyé&1¬Œ?g¸…ëQ¸¾?(   gyé&1¬Œ?gòÒMbX¹?(   gyé&1¬Œ?g¢E¶óýÔ¸?(   gœÄ °rh‘?g/Ý$•Ã?(   gœÄ °rh‘?g/Ý$•Ã?(   g;ßO—n’?g/Ý$•Ã?(   g;ßO—n’?g/Ý$•Ã?(   g;ßO—n’?g/Ý$•Ã?(   g;ßO—n’?g/Ý$•Ã?(   g;ßO—n’?g/Ý$•Ã?(   g;ßO—n’?g/Ý$•Ã?(   g;ßO—n’?g/Ý$•Ã?(   g;ßO—n’?gÛù~j¼tÃ?(   g;ßO—n’?gßO—nÃ?(   g;ßO—n’?g;ßO—nÂ?(   R    R”   R   R[   R   R;   (   R'   R4   RS   (    (    sF   lib/python2.7/site-packages/sklearn/cluster/tests/test_hierarchical.pyt   test_connectivity_propagationW  s    			c          C   sð   d
 \ }  } t  j j d ƒ } t  j |  |  f ƒ } x¶ t d ƒ D]¨ } d | j d |  | f ƒ } | d t  j |  ƒ d  d  … t  j f 8} | | j d d ƒ d  d  … t  j f 8} t	 | ƒ } t	 | d	 | ƒ} t
 | d | d ƒ q@ Wd  S(   Ni
   i   i    gš™™™™™¹?R1   g      @R‚   i   R4   (   i
   i   (   R    R!   R"   R<   R„   R9   Rv   R…   R†   R
   R   (   R~   RŠ   R&   R4   R‹   R'   t   out_unstructuredt   out_structured(    (    sF   lib/python2.7/site-packages/sklearn/cluster/tests/test_hierarchical.pyt   test_ward_tree_children_orderg  s    *)c       
   C   sû  d0 \ }  } t  j j d ƒ } t  j |  |  f ƒ } x‰t d ƒ D]{} d | j d |  | f ƒ } | d t  j |  ƒ d  d  … t  j f 8} | | j d d ƒ d  d  … t  j f 8} t	 | d	 t
 ƒ} t	 | d
 | d	 t
 ƒ} | d } | d }	 t | |	 ƒ | d }
 | d } t |
 | ƒ x— d d d g D]† } t | d
 | d | d	 t
 ƒd } t | d | d	 t
 ƒd } | d } | d } | d } | d } t | | ƒ t | | ƒ q1Wq@ Wt  j d d g d d g d d g d d g d d g d d g g ƒ } t  j d d d d g d d  d! d g d" d d# d g d$ d% d& d g d' d( d) d$ g g ƒ } t  j d d d d g d d  d! d g d" d d# d g d$ d% d* d g d' d( d+ d$ g g ƒ } t  j d d d d g d d  d! d g d" d d# d g d$ d% d, d g d' d( d- d$ g g ƒ } t  j | ƒ \ } } t  j | | f ƒ } t	 | d	 t
 ƒ} t	 | d
 | d	 t
 ƒ} t | d  d  … d  d. … f | d ƒ t | d  d  … d  d. … f | d ƒ t | d  d  … d. f | d/ ƒ t | d  d  … d. f | d/ ƒ d d d g } | | g } xã t | | ƒ D]Ò \ } } t | d	 t
 d | ƒ} t | d
 | d | d	 t
 ƒ} t | d  d  … d  d. … f | d ƒ t | d  d  … d  d. … f | d ƒ t | d  d  … d. f | d/ ƒ t | d  d  … d. f | d/ ƒ q!Wd  S(1   Ni
   i   i    gš™™™™™¹?R1   g      @R‚   i   t   return_distanceR4   iÿÿÿÿRU   RT   RV   R2   g»™Ñ†ãö?gææeGÀg…w7äÕ@g}°Î)¯J@gZ!E•ø@gÇÇn]#Àgú!ºÜ„@gŠ´,8Àg!«Yùz @gRÕ¡&<aÀg¤ÚŽF‘@gÜT“–€!@g      @g0rqÐ5×?g       @g      ð?g      @gAæVJÇSü?g        gòL/ùu@g      @g       @g6S„HD4"@g      @g      "@gˆwÊ´GÇ8@gwîfÛ£Þ@g63CÆ2@gÐéýoº;@g_‡ ½á.@i   i   (   i
   i   (   R    R!   R"   R<   R„   R9   Rv   R…   R†   R
   t   TrueR   R   R   R”   RB   t   zip(   R~   RŠ   R&   R4   R‹   R'   R˜   R™   t   children_unstructuredt   children_structuredt   dist_unstructuredt   dist_structuredR2   t   structured_itemst   unstructured_itemst   structured_distt   unstructured_distt   structured_childrent   unstructured_childrent   linkage_X_wardt   linkage_X_completet   linkage_X_averageRP   t
   n_featurest   connectivity_Xt   out_X_unstructuredt   out_X_structuredt   linkage_optionst   X_linkage_trutht   X_truth(    (    sF   lib/python2.7/site-packages/sklearn/cluster/tests/test_hierarchical.pyt&   test_ward_linkage_tree_return_distance{  s’    *)	







					''!!	''!c          C   s‰   t  j d d g d d g g ƒ }  t  j t t g t t g g ƒ } t d d d d d | ƒ } t d | d d	 ƒ } t t | j |  ƒ d  S(
   Ni    i   t   n_xi   t   n_yRF   R4   R2   RS   (	   R    R”   Rœ   R[   R   R   R   RJ   R;   (   t   xt   mt   ct   w(    (    sF   lib/python2.7/site-packages/sklearn/cluster/tests/test_hierarchical.pyt    test_connectivity_fixing_non_lilæ  s
    !!c    	   	   C   sR  t  j j d ƒ }  t  j |  j d d d ƒj t  j ƒ ƒ } |  j t | ƒ ƒ } t	 | | ƒ } x3 t
 | | ƒ D]" \ } } | | | k sp t ‚ qp Wt  j d ƒ j t  j ƒ d  d  d … } t  j d d ƒ d  d  d … } t	 | | ƒ } t | | d t  j d d	 t  j ƒd
 d d d ƒt | | d t  j d d	 t  j ƒd
 d d d ƒd  S(   Ni    id   R1   i
   i2   i   g      à?RF   R@   t   n_ai   t   n_b(   R    R!   R"   RX   t   randintR‡   t   intpt   randRD   R   R   RE   Rv   t   fullR   R<   R   (	   R&   R`   RC   t   dt   keyt   valuet
   other_keyst   other_valuest   other(    (    sF   lib/python2.7/site-packages/sklearn/cluster/tests/test_hierarchical.pyt   test_int_float_dictò  s    *(1c          C   sš   t  j j d ƒ }  |  j d d ƒ } t | d d t ƒ} t d | ƒ } t d t t d d d t ƒƒ } | j | ƒ | j | ƒ t	 | j
 | j
 ƒ d  S(   Ni    i   i   i   R’   R4   R‘   (   R    R!   R"   R¾   R   R[   R   R   R;   R   RW   (   R&   R'   R4   t   aglc1t   aglc2(    (    sF   lib/python2.7/site-packages/sklearn/cluster/tests/test_hierarchical.pyt   test_connectivity_callable  s    c          C   s   t  j j d ƒ }  |  j d d ƒ } t | d d t ƒ} t | d d t ƒ} t d | ƒ } t d | ƒ } | j | ƒ | j | ƒ t	 | j
 | j
 ƒ d  S(   Ni    i   i   i   R’   R4   (   R    R!   R"   R¾   R   R[   Rœ   R   R;   R   RW   (   R&   R'   R4   t   connectivity_include_selfRÇ   RÈ   (    (    sF   lib/python2.7/site-packages/sklearn/cluster/tests/test_hierarchical.pyt"   test_connectivity_ignores_diagonal  s    c          C   s
  t  j j d ƒ }  |  j d d ƒ } t | d d t ƒ} t d d d | ƒ } | j | ƒ | j d } | j	 j d } t
 | | d ƒ d	 } |  j d
 d ƒ } t | d d t ƒ} t d | d | ƒ } | j | ƒ | j d } | j	 j d } t
 | | | ƒ d  S(   Ni    i
   i   i   R’   RI   R4   i   ie   iÈ   (   R    R!   R"   R#   R   R[   R   R;   RB   R   R   (   R&   R'   R4   t   agcRP   R)   RI   (    (    sF   lib/python2.7/site-packages/sklearn/cluster/tests/test_hierarchical.pyt   test_compute_full_tree  s"    	c          C   sn   t  j j d ƒ }  |  j d d ƒ } t  j d ƒ } x4 t j ƒ  D]& } t t | ƒ | | ƒ d d ƒ q@ Wd  S(   Ni    i   i   (	   R    R!   R"   R¾   t   eyeR   RC   R   R	   (   R&   R'   R4   RM   (    (    sF   lib/python2.7/site-packages/sklearn/cluster/tests/test_hierarchical.pyt   test_n_components7  s
    c          C   sw   t  j j d ƒ }  |  j d d ƒ } xL d d g D]> } t d | ƒ } d t | j ƒ } t t | | j	 | ƒ q1 Wd  S(   Ni    i   i
   iÿÿÿÿRI   s@   n_clusters should be an integer greater than 0. %s was provided.(
   R    R!   R"   R¾   R   t   strRI   R   R:   R;   (   R&   R'   t   n_clusRÌ   t   msg(    (    sF   lib/python2.7/site-packages/sklearn/cluster/tests/test_hierarchical.pyt   test_agg_n_clustersC  s    c       	   C   s²   d }  t  j j d ƒ } | j |  |  ƒ } t  j t t t t g ƒ } t d |  d |  d | d t  j ƒ } d d d „  ƒ  Y} | ƒ  } t	 | d	 | d
 | j
 ƒt | j d ƒ d  S(   Ni   i    R³   R´   RF   t	   return_ast   FakeAffinityc           B   s   e  Z d  „  Z d „  Z RS(   c         S   s   d |  _  d  S(   Ni    (   t   counter(   t   self(    (    sF   lib/python2.7/site-packages/sklearn/cluster/tests/test_hierarchical.pyt   __init__\  s    c         _   s   |  j  d 7_  |  j  S(   Ni   (   RÖ   (   R×   t   argst   kwargs(    (    sF   lib/python2.7/site-packages/sklearn/cluster/tests/test_hierarchical.pyt	   increment_  s    (   t   __name__t
   __module__RØ   RÛ   (    (    (    sF   lib/python2.7/site-packages/sklearn/cluster/tests/test_hierarchical.pyRÕ   [  s   	R4   R5   i   (    (   R    R!   R"   R#   R”   Rœ   R[   R   t   ndarrayR   RÛ   R   RÖ   (   R1   R&   R'   RF   R4   RÕ   t   fa(    (    sF   lib/python2.7/site-packages/sklearn/cluster/tests/test_hierarchical.pyt(   test_affinity_passed_to_fix_connectivityO  s    	(K   t   __doc__t   tempfileR    RY   t   pytestt	   functoolsR   t   numpyR    t   scipyR   t   scipy.clusterR   t   sklearn.utils.testingR   R   R   R   R   R	   t   sklearn.clusterR
   R   R   t   sklearn.cluster.hierarchicalR   R   R   R   t    sklearn.feature_extraction.imageR   t   sklearn.metrics.pairwiseR   R   R   R   t   sklearn.metrics.clusterR   t   sklearn.neighbors.graphR   t   sklearn.cluster._hierarchicalR   R   t   sklearn.utils.fast_dictR   R   R   t   sklearn.datasetsR   R   R0   R?   RH   RL   RN   RR   t   markt   filterwarningsRe   Rk   Rs   R   R   R–   R—   Rš   R²   R¹   RÆ   RÉ   RË   RÍ   RÏ   RÓ   Rà   (    (    (    sF   lib/python2.7/site-packages/sklearn/cluster/tests/test_hierarchical.pyt   <module>   s`   ""						Z			!			k							