ó
‡ˆ\c           @   se  d  d l  Z d  d l j Z d  d l 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 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 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 d „  Z d „  Z  d „  Z! e d e" ƒ d „  ƒ Z# e j$ j% d d+ ƒ d „  ƒ Z& e j$ j% d d, ƒ d „  ƒ Z' d „  Z( e j$ j% d d- ƒ d „  ƒ Z) d „  Z* d „  Z+ d  „  Z, d! „  Z- d" „  Z. d# „  Z/ d$ „  Z0 d% „  Z1 e d e ƒ d& „  ƒ Z2 d' „  Z3 d( „  Z4 e d e ƒ d) „  ƒ Z5 d* „  Z6 d S(.   iÿÿÿÿN(   t   linalg(   t   NMFt   non_negative_factorization(   t   nmf(   t
   csc_matrix(   t   assert_false(   t   assert_raise_messaget   assert_no_warnings(   t   assert_array_equal(   t   assert_array_almost_equal(   t   assert_almost_equal(   t   assert_less(   t   assert_greater(   t   ignore_warnings(   t   squared_norm(   t   clone(   t   ConvergenceWarningc          C   s‘   t  j j j d ƒ }  t  j |  j d d ƒ ƒ } xZ d
 D]R } t j | d d | d d	 ƒ\ } } t | d	 k  j	 ƒ  p… | d	 k  j	 ƒ  ƒ q7 Wd  S(   Ni*   i
   t   randomt   nndsvdt   nndsvdat   nndsvdart   initt   random_statei    (   R   R   R   R   (
   t   npR   t   mtrandt   RandomStatet   abst   randnR   t   _initialize_nmfR   t   any(   t   rngt   dataR   t   Wt   H(    (    sC   lib/python2.7/site-packages/sklearn/decomposition/tests/test_nmf.pyt   test_initialize_nn_output   s
    $c          C   s2  t  j d ƒ }  d } d } t t | t d | ƒ j |  ƒ d } t t | t d | ƒ j |  ƒ d } t t | t d d d	 | ƒ j |  ƒ d
 } | d 7} t t | t d d d	 d ƒ j |  ƒ d } t t | t ƒ  j |  ƒ t t | t j |  d d ƒ t d d d ƒj |  ƒ } t t | | j |  ƒ d  S(   Ni   t   spams6   Invalid solver parameter: got 'spam' instead of one oft   solvers4   Invalid init parameter: got 'spam' instead of one ofR   s6   Invalid beta_loss parameter: got 'spam' instead of onet   mut	   beta_losss9   Invalid beta_loss parameter: solver 'cd' does not handle s   beta_loss = 1.0t   cdg      ð?s!   Negative values in data passed toR   t   tolgš™™™™™¹?(   i   i   (	   R   t   onesR   t
   ValueErrorR   t   fitR   R   t	   transform(   t   At   namet   msgt   clf(    (    sC   lib/python2.7/site-packages/sklearn/decomposition/tests/test_nmf.pyt   test_parameter_checking"   s&    

c          C   sœ   t  j j j d ƒ }  t  j |  j d d ƒ ƒ } t j | d d d ƒ\ } } t j	 t  j
 | | ƒ | ƒ } t j	 | | j ƒ  ƒ } | | k s˜ t ‚ d  S(   Ni*   i
   R   R   (   R   R   R   R   R   R   R   R   R    t   normt   dott   meant   AssertionError(   R   R-   R    R!   t   errort   sdev(    (    sC   lib/python2.7/site-packages/sklearn/decomposition/tests/test_nmf.pyt   test_initialize_close9   s    c    
      C   sð   t  j j j d ƒ }  t  j |  j d d ƒ ƒ } t j | d d d ƒ\ } } t j | d d d ƒ\ } } t j | d d d d d ƒ\ } } xY | | f | | f | | f | | f f D]- \ } }	 t |	 | d k | | d k ƒ q» Wd  S(	   Ni*   i
   R   R   R   R   R   i    (	   R   R   R   R   R   R   R   R   R
   (
   R   R   t   W0t   H0t   Wat   Hat   Wart   Hart   reft   evl(    (    sC   lib/python2.7/site-packages/sklearn/decomposition/tests/test_nmf.pyt   test_initialize_variantsE   s    7t   categoryc          C   s´   t  j d t  j d d ƒ d t  j d d ƒ f }  xz d D]r } xi d D]a } t d
 d d | d | d d ƒ } | j |  ƒ } t | j d k  j ƒ  p¤ | d k  j ƒ  ƒ qG Wq: Wd  S(   Ng      @i   i   R'   R%   R   R   R   R   t   n_componentsi   R$   R   R   i    (   R'   R%   (   NR   R   R   R   (	   R   t   c_t   aranget   NoneR   t   fit_transformR   t   components_R   (   R-   R$   R   t   modelt   transf(    (    sC   lib/python2.7/site-packages/sklearn/decomposition/tests/test_nmf.pyt   test_nmf_fit_nn_outputU   s    	R$   R'   R%   c      
   C   sq   t  j j j d ƒ } t d d |  d d d d d d	 ƒ} t  j | j d
 d ƒ ƒ } t | j | ƒ j	 d ƒ d  S(   Ni*   i   R$   R   R   R   i    t   max_iteriX  i   gš™™™™™¹?(
   R   R   R   R   R   R   R   R   R+   t   reconstruction_err_(   R$   R   t   pnmft   X(    (    sC   lib/python2.7/site-packages/sklearn/decomposition/tests/test_nmf.pyt   test_nmf_fit_closec   s
    	c         C   sŒ   t  j j j d ƒ } t  j | j d d ƒ ƒ } t d |  d d d d d	 d
 d d ƒ } | j | ƒ } | j | ƒ } t	 | | d d ƒd  S(   Ni*   i   i   R$   RC   i   R   R   R   i    R(   gñhãˆµøä>t   decimali   (
   R   R   R   R   R   R   R   RG   R,   R	   (   R$   R   R-   t   mt   ftt   t(    (    sC   lib/python2.7/site-packages/sklearn/decomposition/tests/test_nmf.pyt   test_nmf_transformm   s    c       	   C   sÕ   t  j j d ƒ }  t  j |  j d d ƒ ƒ } d } t  j | j ƒ  | ƒ } t  j | |  j | d ƒ ƒ } t  j | |  j d | ƒ ƒ } t d d d | d d	 d
 d ƒ } | j | d | d | ƒ| j	 | ƒ d  S(   Ni    i   i   i   R$   R'   RC   R   t   customR   R    R!   (
   R   R   R   R   R   t   sqrtR4   R   RG   R,   (   R   R-   RC   t   avgt   H_initt   W_initRR   (    (    sC   lib/python2.7/site-packages/sklearn/decomposition/tests/test_nmf.pyt   test_nmf_transform_custom_inity   s    	c         C   s‰   t  j j d ƒ } t  j | j d d ƒ ƒ } t d |  d d d d d d d	 d
 ƒ } | j | ƒ } | j | ƒ } t | | d d ƒd  S(   Ni    i   i   R$   RC   R   R   R   RL   iè  RQ   i   (	   R   R   R   R   R   R   RG   t   inverse_transformR	   (   R$   R   R-   RR   RS   t   A_new(    (    sC   lib/python2.7/site-packages/sklearn/decomposition/tests/test_nmf.pyt   test_nmf_inverse_transformˆ   s    	c          C   sV   t  j j j d ƒ }  t  j |  j d d ƒ ƒ } t d d d d d d	 ƒ j | ƒ d  S(
   Ni*   i   i
   RC   i   R   i    R(   g{®Gáz„?(   R   R   R   R   R   R   R   R+   (   R   R-   (    (    sC   lib/python2.7/site-packages/sklearn/decomposition/tests/test_nmf.pyt$   test_n_components_greater_n_features”   s    c          C   s  d d l  m }  t j j j d ƒ } t j | j d d ƒ ƒ } d | d  d  … d t j d ƒ f <|  | ƒ } xA d D]9 } t	 d
 | d d d d d d d d ƒ } t
 | ƒ } qv W| j | ƒ } | j | ƒ } | j }	 | j }
 t | | ƒ t |	 |
 ƒ d  S(   Niÿÿÿÿ(   R   i*   i
   i    i   i   R'   R%   R$   RC   R   R   R   R(   g{®Gáz„?(   R'   R%   (   t   scipy.sparseR   R   R   R   R   R   R   RE   R   R   RG   RH   R	   (   R   R   R-   t   A_sparseR$   t   est1t   est2t   W1t   W2t   H1t   H2(    (    sC   lib/python2.7/site-packages/sklearn/decomposition/tests/test_nmf.pyt   test_nmf_sparse_input›   s    #		c       
   C   s­   t  j j j d ƒ }  t  j |  j d d ƒ ƒ } d | d <t | ƒ } x` d D]X } t d | d	 d d
 d d d ƒ } | j | ƒ } | j	 | ƒ } t
 | | d d ƒqM Wd  S(   Ni*   i   i   i    i   R'   R%   R$   R   RC   RL   i  RQ   (   i   i   (   R'   R%   (   R   R   R   R   R   R   R   R   RG   R,   R	   (   R   R-   R$   RI   t   A_fit_trt   A_tr(    (    sC   lib/python2.7/site-packages/sklearn/decomposition/tests/test_nmf.pyt   test_nmf_sparse_transform²   s    
	c    
      C   s!  t  j j j d ƒ }  t  j |  j d d ƒ ƒ } d | d  d  … d t  j d ƒ f <xÇ d D]¿ } t | d | d	 d
 d d ƒ\ } } } t | d | d t d | d	 d
 d d ƒ\ } } } t	 d | d	 d
 d d ƒ } | j
 | ƒ } | j | ƒ }	 t | | d d ƒt | |	 d d ƒqZ Wd  S(   Ni*   i
   i    i   i   R'   R%   R$   R   i   R(   g{®Gáz„?R!   t   update_HRQ   (   R'   R%   (   R   R   R   R   R   R   RE   R   t   FalseR   RG   R,   R	   (
   R   R-   R$   t   W_nmfR!   t   _t   W_nmf_2t   model_classt   W_clst   W_cls_2(    (    sC   lib/python2.7/site-packages/sklearn/decomposition/tests/test_nmf.pyt+   test_non_negative_factorization_consistencyÁ   s    #$0c          C   s2  t  j d ƒ }  t } t | |  |  |  t  j d ƒ ƒ d } t t | | |  |  |  d ƒ d } t t | | |  |  |  d ƒ d } t t | | |  |  |  d d ƒ d	 } t t | | |  |  |  d d ƒ d
 } t t | | |  |  d |  d d ƒ d } t t | | |  |  d |  d d t d d d d d d d ƒ d  S(   Ni   i   sG   Number of components must be a positive integer; got (n_components=1.5)g      ø?sG   Number of components must be a positive integer; got (n_components='2')t   2s/   Negative values in data passed to NMF (input H)RV   s/   Negative values in data passed to NMF (input W)s.   Array passed to NMF (input H) is full of zerosi    s>   Invalid regularization parameter: got 'spam' instead of one ofR'   g       @g-Cëâ6?iÈ   g        R#   (   i   i   (   R   R)   R   R   t   int64R   R*   t   True(   R-   t   nnmfR/   (    (    sC   lib/python2.7/site-packages/sklearn/decomposition/tests/test_nmf.pyt(   test_non_negative_factorization_checkingÕ   s       #"c   	      C   sª  t  |  t j ƒ rT t j | g g ƒ } t j | g g ƒ } t j |  g g ƒ }  n  t j | | ƒ } | d k r„ t |  | ƒ d S| |  d k } |  |  d k } t j | d d | ƒ| d k rt j | t j	 | | ƒ ƒ } | | j ƒ  |  j ƒ  7} n£ | d k rH| | } t j | ƒ |  j
 t j t j	 | ƒ ƒ } n^ | | j ƒ  } | | d | | j ƒ  7} | | | | | d j ƒ  8} | | | d :} | S(   s~   Compute the beta-divergence of X and W.H for dense array only.

    Used as a reference for testing nmf._beta_divergence.
    i   i    g•Ö&è.>t   outi   (   t
   isinstancet   numberst   NumberR   t   arrayR3   R   t   maximumt   sumt   logt   size(	   RO   R    R!   t   betat   WHt   WH_Xnonzerot	   X_nonzerot   rest   div(    (    sC   lib/python2.7/site-packages/sklearn/decomposition/tests/test_nmf.pyt   _beta_divergence_denseë   s*     
/ c          C   s  d }  d } d } d d d d d g } t  j j j d	 ƒ } | j |  | ƒ } t  j | d
 d  d | ƒt j | ƒ } t	 j
 | | d d d d	 ƒ\ } } xy | D]q }	 t | | | |	 ƒ }
 t	 j | | | |	 ƒ } t	 j | | | |	 ƒ } t |
 | d d ƒt |
 | d d ƒq¡ Wd  S(   Ni   i
   i   g        g      à?g      ð?g      ø?g       @i*   i    Rz   R   R   R   RQ   i   (   R   R   R   R   R   t   clipRF   t   spt
   csr_matrixR   R   R‰   t   _beta_divergenceR
   (   t	   n_samplest
   n_featuresRC   t   beta_lossesR   RO   t   X_csrR    R!   Rƒ   R?   t   losst   loss_csr(    (    sC   lib/python2.7/site-packages/sklearn/decomposition/tests/test_nmf.pyt   test_beta_divergence  s    $c          C   sL  d }  d } d } t  j j j d ƒ } | j |  | ƒ } t  j | d d  d | ƒt j | ƒ } t  j	 | j |  | ƒ ƒ } t  j	 | j | | ƒ ƒ } t
 j | | | ƒ } t
 j | | | ƒ }	 | j ƒ  \ }
 } t  j | |
 | f ƒ j ƒ  } t | |	 |
 | f d d ƒt | j | j ƒ t | j | j ƒ t | j | j ƒ d  S(   Ni
   i   i   i*   i    Rz   RQ   (   R   R   R   R   R   RŠ   RF   R‹   RŒ   R   R   t   _special_sparse_dott   nonzerot   asarrayt   ravelR	   R   t   indicest   indptrt   shape(   RŽ   R   RC   R   RO   R‘   R    R!   t   WH_safeR„   t   iit   jjt   WH_safe_data(    (    sC   lib/python2.7/site-packages/sklearn/decomposition/tests/test_nmf.pyt   test_special_sparse_dot%  s"    c          C   s?  d }  d } d } d } d } d } t  j j j d ƒ } | j |  | ƒ } t  j | ƒ } t j | ƒ } t j	 | | d d d	 d
 ƒ\ }	 }
 x«d D]£} |	 j
 ƒ  |
 j
 ƒ  } } t | | | | d d d t d d d | d | d | d | d d d	 d
 ƒ	\ } } } |	 j
 ƒ  |
 j
 ƒ  } } t | | | | d d d t d d d | d | d | d | d d d	 d
 ƒ	\ } } } t | | d d ƒt | | d d ƒ| d 8} |	 j
 ƒ  |
 j
 ƒ  } } t | | | | d d d t d d d | d | d | d | d d d	 d
 ƒ	\ } } } t | | d d ƒt | | d d ƒq” Wd  S(    Ni   i
   i   gš™™™™™¹?g      à?i9  R   R   R   i*   g333333ó¿i    gš™™™™™É?g      ð?g       @g      @RV   Rl   R$   R%   R&   RL   t   alphat   l1_ratiot   regularizationt   bothRQ   i   gñhãˆµøä>i   (   g333333ó¿i    gš™™™™™É?g      ð?g       @g      @(   R   R   R   R   R   R   R‹   RŒ   R   R   t   copyR   Rw   R	   (   RŽ   R   RC   R¡   R¢   t   n_iterR   RO   R‘   R9   R:   R&   R    R!   Rd   Rf   Ro   Re   Rg   t   W3t   H3(    (    sC   lib/python2.7/site-packages/sklearn/decomposition/tests/test_nmf.pyt%   test_nmf_multiplicative_update_sparse@  sB    
c             sÝ   d }  d } d ‰  t  j j j d ƒ } | j |  | ƒ } t  j | d d  d | ƒt j | ƒ } ‡  f d †  } d } x5 d D]- } t	 t
 | | | | ƒ | | d | ƒ q} Wx( d D]  } | | | ƒ | | | ƒ qµ Wd  S(   Ni   i   i   i*   i    Rz   c            so   t  |  d ˆ  d d d | d d d d ƒ\ } } } t t j t j | ƒ ƒ ƒ t t j t j | ƒ ƒ ƒ d  S(	   NRC   R$   R%   R&   R   i    RL   iè  (   R   R   R   R   t   isnan(   RO   R&   R    R!   Ro   (   RC   (    sC   lib/python2.7/site-packages/sklearn/decomposition/tests/test_nmf.pyt   _assert_nmf_no_nan~  s
    sA   When beta_loss <= 0 and X contains zeros, the solver may diverge.g333333ã¿g        g•Ö&è.>gš™™™™™É?g      ð?g333333ó?g       @g      @(   g333333ã¿g        (   gš™™™™™É?g      ð?g333333ó?g       @g      @(   R   R   R   R   R   RŠ   RF   R‹   RŒ   R   R*   (   RŽ   R   R   RO   R‘   R«   R/   R&   (    (   RC   sC   lib/python2.7/site-packages/sklearn/decomposition/tests/test_nmf.pyt   test_nmf_negative_beta_lossr  s    c          C   s   d }  d } d } t  j j j d ƒ } t  j | j |  | ƒ ƒ } d } xþ d d g D]ð } t j d | d	 | d
 d d | d d ƒ } t j d | d	 | d
 d d | d d ƒ } | j | ƒ }	 | j | ƒ }
 | j	 } | j	 } |	 |	 d k j
 } |
 |
 d k j
 } | | d k j
 } | | d k j
 } t | | ƒ t | | ƒ qU Wd } xÊ d d g D]¼ } t j d | d	 | d
 d d | d d ƒ } t j d | d	 | d
 d d | d d ƒ } | j | ƒ }	 | j | ƒ }
 | j	 } | j	 } t |
 j ƒ  |	 j ƒ  ƒ t | j ƒ  | j ƒ  ƒ q\Wd  S(   Ni   i   i   i*   g      ð?R'   R%   RC   R$   R¡   g      à?R¢   R   g        i    (   R   R   R   R   R   R   R   R   RG   RH   R‚   R   R4   (   RŽ   R   RC   R   RO   R¢   R$   t   regulRI   t   W_regult   W_modelt   H_regult   H_modelt   W_regul_n_zerost   W_model_n_zerost   H_regul_n_zerost   H_model_n_zeros(    (    sC   lib/python2.7/site-packages/sklearn/decomposition/tests/test_nmf.pyt   test_nmf_regularization  sB    				c          C   s–  d }  d } d } d } d } d } t  j j j d ƒ } | j |  | ƒ } t  j | | ƒ t j | | d d	 d
 d ƒ\ } }	 xd" D]}
 xÿ d# D]÷ } | d k r· |
 d k r· q“ n  | j ƒ  |	 j ƒ  } } d  } x± t
 d ƒ D]£ } t | | | d |
 d d d | d d d | d | d | d | d d d d  d
 d d! t ƒ\ } } } t j | | | |
 ƒ } | d  k	 r€t | | ƒ n  | } qã Wq“ Wq† Wd  S($   Ni   i   i
   gš™™™™™¹?g      à?g        i*   R   R   R   g333333ó¿i    gš™™™™™É?g      ð?g       @g      @R'   R%   i   i   R&   RV   RC   RL   i   R¡   R$   R(   R¢   t   verboseR£   R¤   Rl   (   g333333ó¿i    gš™™™™™É?g      ð?g       @g      @(   R'   R%   (   R   R   R   R   R   R   R   R   R¥   RF   t   rangeR   Rw   R   R   (   RŽ   R   RC   R¡   R¢   R(   R   RO   R9   R:   R&   R$   R    R!   t   previous_lossRo   R’   (    (    sC   lib/python2.7/site-packages/sklearn/decomposition/tests/test_nmf.pyt   test_nmf_decreasing¿  s6    c    	      C   sÕ   t  j j d ƒ }  d \ } } } t  j |  j | | ƒ ƒ d } t  j |  j | | ƒ ƒ d } t  j |  j | | ƒ ƒ } d | d <t j | | | d d ƒ} d | d	 <t j | | | d d ƒ} t | | ƒ d  S(
   Ni    i
   i   Rƒ   g      ð?g       (   i
   i   i   (   i    i    (   i    i    (   R   R   R   R   R   R   R   R
   (	   R   RŽ   R   RC   RO   R    R!   R?   R‡   (    (    sC   lib/python2.7/site-packages/sklearn/decomposition/tests/test_nmf.pyt   test_nmf_underflowå  s    

(   R'   R%   (   R'   R%   (   R'   R%   (7   t   numpyR   R`   t   sparseR‹   R|   t   scipyR    t   sklearn.decompositionR   R   R   R   t   pytestt   sklearn.utils.testingR   R   R   R   R	   R
   R   R   R   t   sklearn.utils.extmathR   t   sklearn.baseR   t   sklearn.exceptionsR   R"   R1   R8   RA   t   UserWarningRK   t   markt   parametrizeRP   RU   R[   R^   R_   Rh   Rk   Rt   Ry   R‰   R”   R    R©   R¬   R¶   Rº   R»   (    (    (    sC   lib/python2.7/site-packages/sklearn/decomposition/tests/test_nmf.pyt   <module>   sP   					
							#		2		0&