o
    `^hS                     @   s  d dl Z d dlZd dlZd dlZd dlmZ d dlmZm	Z	 d dl
mZmZ d dlmZmZmZmZmZ d dlmZmZmZmZ d dlmZ eeeegZeeg Zedd	gd	d	gd	dgd
d
gd
dgdd
ggZeg dZdd Zdd Z dd Z!dd Z"dd Z#dd Z$dd Z%dd Z&dd Z'dd  Z(d!d" Z)d#d$ Z*d%d& Z+d'd( Z,ej-.d)ed*d+ Z/ej-.d)ed,d- Z0ej-.d.ed/d0 Z1d1d2 Z2ej-.d)ed3d4 Z3ej-.d)ed5d6 Z4ej-.d)ed7d8 Z5ej-.d)ed9d: Z6ej-.d)eej-.d;d<d=gej-.d>d<d=gd?d@ Z7ej-.dAdBej-.dCedDdE Z8dFdG Z9dHdI Z:dJdK Z;dLdM Z<dNdO Z=ej-.dPdQeg dRg dSgeg dSg dSged dggedQdQgfdQdTgeg dRg dSgeg dUg dUged dQggedQdTgfd
edd gd
d
gged
d
gd
d
gged d
ggeddgggdVdW Z>ej-.dXdQdgddTggdYfgdZd[ Z?ej-.dCed\d] Z@d^d_ ZAd`da ZBdbdc ZCej-.ddededf ZDdS )g    N)	logsumexp)load_digits	load_iris)cross_val_scoretrain_test_split)BernoulliNBCategoricalNBComplementNB
GaussianNBMultinomialNB)assert_allcloseassert_almost_equalassert_array_almost_equalassert_array_equal)CSR_CONTAINERS      )r   r   r   r   r   r   c                 C   s6   t j| }|jdd}|jdddkt}||fS )N)
      sizer   r   )nprandomRandomStatenormalastypeint)global_random_seedrngX1y1 r#   \/home/air/shanriGPT/back/venv/lib/python3.10/site-packages/sklearn/tests/test_naive_bayes.pyget_random_normal_x_binary_y!   s   r%   c                 C   s0   t j| }|jddd}t g d}||fS )N   )   d   r   )r   r   r   r   r   r   )r   r   r   randintarray)r   r    X2y2r#   r#   r$   $get_random_integer_x_three_classes_y)   s   r-   c                  C   s   t  } | ttt}t|t | t}| t}tt	
||d tjtdd t  jttddgd W d    d S 1 sBw   Y  d S )N   z;The target label.* in y do not exist in the initial classesmatchr   r   classes)r
   fitXypredictr   predict_probapredict_log_probar   r   logpytestraises
ValueErrorpartial_fit)clfy_predy_pred_probay_pred_log_probar#   r#   r$   test_gnb2   s   


"rB   c                 C   sX   t  tt}ttddgd |jd t| \}}t  ||}t|j	 d d S )Nr         @r.   r   )
r
   r3   r4   r5   r   r   r*   class_prior_r%   sum)r   r>   r!   r"   r#   r#   r$   test_gnb_priorH   s
   rF   c           
      C   sN  t d}t tt}t tt|}t|j|j t|j|j t j	
| }|tjd }t jtt|d}t jttddg|d d}|jtt|d d t|j|j t|j|j |dtjd d}t j|tjd d}t t| t| }	t tt|}t|	j|j t|	j|j tdkt j}t jtt|d}d	S )
z5Test whether sample weights are properly used in GNB.r'   r   sample_weightr   r   r2   rH      )	minlengthN)r   onesr
   r3   r4   r5   r   theta_var_r   r   randshaper=   r)   bincountr   float64)
r   swr>   clf_swr    clf1clf2indrH   clf_duplr#   r#   r$   test_gnb_sample_weightR   s(   
rY   c                  C   X   t tddgd} d}tjt|d | tt W d   dS 1 s%w   Y  dS )z:Test whether an error is raised in case of negative priorsg             @priorszPriors must be non-negativer/   N	r
   r   r*   r:   r;   r<   r3   r4   r5   r>   msgr#   r#   r$   test_gnb_neg_priorsy   
   "ra   c                  C   sZ   t tddgdtt} t| ddggtddggd t| jtddg dS )	z6Test whether the class prior override is properly used333333?gffffff?r\   皙g[9h?gs\?r.   N)	r
   r   r*   r3   r4   r5   r   r7   rD   r>   r#   r#   r$   test_gnb_priors   s   rf   c                  C   s|   t ddgddgddgddgddgddgddgddgd	d	gd
d
gg
} t g d}t g d}t|d}|| | d S )Nr   r   r   r   r      r&   )
g{Gz?Q?gQ?{Gz?)\(?rl   gQ?rk   rm           )
r   r   r   rj   r&   r'      r.   	   r   r\   )r   r*   r
   r3   )r4   r]   Yr>   r#   r#   r$   test_gnb_priors_sum_isclose   s"   
rr   c                  C   sX   t tg dd} d}tjt|d | tt W d   dS 1 s%w   Y  dS )z`Test whether an error is raised if the number of prior is different
    from the number of class)      ?rs   rs   rs   r\   -Number of priors must match number of classesr/   Nr^   r_   r#   r#   r$   test_gnb_wrong_nb_priors   s
   "ru   c                  C   rZ   )z?Test if an error is raised if the sum of prior greater than oner[         ?r\   z!The sum of the priors should be 1r/   Nr^   r_   r#   r#   r$   test_gnb_prior_greater_one   rb   rw   c                  C   sD   t tddgd} | tt | ddggtdgks J dS )z@Test if good prediction when class prior favor largely one classg{Gz?gGz?r\   rd   r   N)r
   r   r*   r3   r4   r5   r6   re   r#   r#   r$   test_gnb_prior_large_bias   s   $rx   c                  C   sP   d} d}d}t dtjd f}t| |||\}}||ks J ||ks&J dS )z4Test when the partial fit is called without any datar(   rn   rv   r   r   N)r   emptyr4   rP   r
   _update_mean_variance)prev_pointsmeanvarx_emptytmeantvarr#   r#   r$   "test_gnb_check_update_with_no_data   s   r   c                  C   s   t  tt} t  tttt}t| j|j t| j	|j	 t| j
|j
 t  tdd dd d f tdd d tt}|tdd d tdd d  t| j|j t| j	|j	 t| j
|j
 d S )Nr   r   r   )r
   r3   r4   r5   r=   r   uniquer   rM   rN   rD   )r>   clf_pfclf_pf2r#   r#   r$   test_gnb_partial_fit   s   2 r   c                     sP   t  } | j| j  fdddD }t|d |d  t|d |d  d S )Nc                    s(   g | ]}t  |  |  qS r#   )r
   r3   r6   ).0fr4   r5   r#   r$   
<listcomp>   s   ( z9test_gnb_naive_bayes_scale_invariance.<locals>.<listcomp>)绽|=r   g    _Br   r   r   )r   datatargetr   )irislabelsr#   r   r$   %test_gnb_naive_bayes_scale_invariance   s
   r   DiscreteNaiveBayesc                 C   s@   t |\}}|  ||}tttg dd |jd d S )N)r   r   r   rC   r.   )r-   r3   r   r   r9   r*   class_log_prior_)r   r   r+   r,   r>   r#   r#   r$   test_discretenb_prior   s
   r   c                 C   s  |  }| ddgddgddggg d |  }|jddgddgddggg dddgd t|j|j | tu rMtt|jD ]}t|j| |j|  q>nt|j|j |  }|jddggdgddgd |ddggdg |ddggdg t|j|j | tu rtt|jD ]$}t|j| j	|j| j	 tt
j|j| ddt
j|j| dd qt|jd d t
ddg t|jd d t
ddg t|jd d t
ddg t|jd d t
ddg d S t|j|j d S )Nr   r   r   r   r   r1   axisr   )r3   r=   r   class_count_r   rangelencategory_count_feature_count_rP   r   rE   r*   )r   rU   rV   iclf3r#   r#   r$   test_discretenb_partial_fit   s:   "*"r   
NaiveBayesc                 C   s   t |\}}tjtdd |  || W d    n1 sw   Y  |  }|j||t|d tjtdd |j||tdd W d    d S 1 sPw   Y  d S )Nz8classes must be passed on the first call to partial_fit.r/   r1   .is not the same as on last call to partial_fit*   )r-   r:   r;   r<   r=   r   r   arange)r   r   r+   r,   r>   r#   r#   r$   $test_NB_partial_fit_no_first_classes  s   "r   c                  C   s|  g dg dg dg} ddgddgddgg}g d}t ttg| |gD ];\}}| ||}||d	d  d
ks;J ||d gjdksHJ t||d d
 jddt	
ddgd q#g d}t ttg| |gD ]O\}}| ||}||dd jdksJ ||d d
 jdksJ tt	||d gd tt	||d	 gd tt	t	|jd qld S )N)r   r(   r   r   r   r   )r   r(   r   r   r   r   rj   )r   r   r   r   r   )r   r   r   rv   r'   r   r   r   )r   r   )r   r   )zipr   r   r3   r6   r7   rP   r   rE   r   r*   r   expr   )X_bernoulliX_multinomialr5   r   r4   r>   r#   r#   r$   test_discretenb_predict_proba0  s.   &r   c                 C   sR   |  }|j dd |dgdgdggg d t|j}t|tddg d S )NF)	fit_priorr   r   r   r   r         ?)
set_paramsr3   r   r   r   r   r*   )r   r>   priorr#   r#   r$   test_discretenb_uniform_priorQ  s
   r   c                 C   s   | ddgd}| dgdgdggg d t|j}t|tddg d}tjt|d | dgdgdggg d	 W d    n1 sGw   Y  d
}tjt|d |j	dgdggddgg dd W d    d S 1 sqw   Y  d S )Nr   class_priorr   r   r   rt   r/   r   r   r   r   r1   )
r3   r   r   r   r   r*   r:   r;   r<   r=   )r   r>   r   r`   r#   r#   r$   test_discretenb_provide_prior]  s   ""r   c           	      C   s   t  }t|j|jddd\}}}}d g dfD ]+}| |d}||j|j | |d}|j||g dd ||| t|j|j qd S )N皙?i  )	test_sizerandom_state)rc   rc   r   r   r   r1   )r   r   r   r   r3   r=   r   r   )	r   r   
iris_data1
iris_data2iris_target1iris_target2r   clf_fullclf_partialr#   r#   r$   .test_discretenb_provide_prior_with_partial_fitp  s   

r   c                 C   s  g dg dg dg dg}g d}t jg dt jd}||  }|  j|||d}t||g d |  }|j|d d	 |d d	 g d
|d d	 d |j|d	d |d	d |d	d d |j|dd  |dd  |dd  d t||g d d S )Nr   r   r   r   r   )r   r   r   r   r   r   r   r   )dtyperG   )r   r   r   r   r   r   rI   r   )r   r*   rR   rE   r3   r   r6   r=   )r   r4   r5   rH   r>   r#   r#   r$   (test_discretenb_sample_weight_multiclass  s   .((r   use_partial_fitFTtrain_on_single_class_yc                 C   s   g dg dg dg}g d}|r|d d }|d d }t tt|}t|}|  }|r7|j|||d n||| ||d d |d ksLJ g d	}|D ]+}	t||	d }
|
d u r_qRt|
t	j
ro|
jd |ksnJ qR|
D ]}|jd |ks|J qqqRd S )
Nr   r   r   )r   r   r   r   r1   r   r   )classes_r   r   r   feature_log_prob_)sortedlistsetr   r=   r3   r6   getattr
isinstancer   ndarrayrP   )r   r   r   r4   r5   r2   num_classesr>   attribute_namesattribute_name	attributeelementr#   r#   r$   )test_discretenb_degenerate_one_class_case  s.   r   kind)densesparsecsr_containerc                 C   s  t |\}}| dkr|}n| dkr||}t }d}tjt|d || | W d    n1 s3w   Y  ||||}t|| ||}	|	|}
t
t|	|
d t }|j|d d |d d t|d ||dd |dd  ||dd  |dd   ||}t|| ||}|	|}t
t||d t
||	 t
||
 t }|j||t|d ||}t|| ||}|	|}t
t||d t
||	 t
||
 d S )	Nr   r   z!Negative values in data passed tor/   r.   r   r1   r&   )r-   r   r:   r;   r<   r3   r6   r   r7   r8   r   r   r9   r=   r   )r   r   r   r+   r,   r4   r>   r`   r?   r@   rA   rV   y_pred2y_pred_proba2y_pred_log_proba2r   y_pred3y_pred_proba3y_pred_log_proba3r#   r#   r$   	test_mnnb  sF   


&










r   c                  C   sN  t ddgddgg} t ddg}t }t  tdt |j| |g dd W d    n1 s4w   Y  |ddggdksEJ |ddggdksQJ |ddggdks]J t  tdt |ddggdg W d    n1 s|w   Y  |ddggdksJ |ddggdksJ |ddggdksJ d S )Nr   r   errorr   r1   r   )	r   r*   r   warningscatch_warningssimplefilterRuntimeWarningr=   r6   )r4   r5   r>   r#   r#   r$   !test_mnb_prior_unobserved_targets
  s"   

r   c                  C   s   t g dg dg dg dg} t g d}tdd}|| | t dd	g}tt |j| t g d
g dg}tt |j| t g dg}t ddgg}|t | }t|	|| d S )N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   rv   alphag      ?rs   )r   g?皙?r   r   r   )UUUUUU?UUUUUU?r   r   r   r   g@fg;u?gy?)
r   r*   r   r3   r   r   r   r   rE   r7   )r4   rq   r>   r   feature_probX_testunnorm_predict_probar7   r#   r#   r$   test_bnb'  s$   
r   c                  C   s   t g dg dg dg dg dg} t g d}tdd}|| | t |jd }t t |jd | jd	 d	fj	}t
|j||  d S )
N)r   r   r   r   r   r   r   )r   r   r   )r   r   r   r   r   rv   r   r[   r   )r   r*   r   r3   r9   r   tiler   rP   Tr   r   )r4   rq   r>   numdenomr#   r#   r$   test_bnb_feature_log_probV  s   (
$r   c                  C   s~  t g dg dg dg dg} t g d}t g dg dg}t |j}t |j}tdD ]}t ||  ||< || ||   ||< q3td	d
}t	d}t
jt|d ||  | W d    n1 sow   Y  || | t g dg dg}t|j| t ddg}	t|j|	 t g d}
t|j|
 t|j| td	dd}|| | t|j| d S )Nr   r   r   r   r   )qq?qq?r   r   r   r   )UUUUUU?r   UUUUUU?r   r   r   r   rv   r   z8Negative values in data passed to ComplementNB (input X)r/   )r   r   r   r   r   r   r   r   )r   rj   r   r   r   r   T)r   norm)r   r*   zerosrP   r   r9   rE   r	   reescaper:   r;   r<   r3   r   r   r   feature_all_r   r   )r4   rq   thetaweightsnormed_weightsr   r>   r`   feature_countclass_countfeature_allr#   r#   r$   test_cnbm  s<   

r  c                 C   s  t  }t| \}}||||}t|| tddgddgg}tddg}t ddd}||| t|jtddg td	d
gg}tdg}t	d}	t
jt|	d || W d    n1 sjw   Y  t
jt|	d ||| W d    n1 sw   Y  tddgg}
tddgg}| }t||
||  t|j|jd ksJ td	d	gd	dgd	d	gddgg}tg d}t ddd}||| t|td	d	ggtdg t|jtddg dD ]N}td	d	gd	dgd	d	gddgg}tg d}tg d| }t ddd}|j|||d t|td	d	ggtdg t|jtddg qd S )Nr   rj   r   r&   F)r   r   r   r'   r   r   z9Negative values in data passed to CategoricalNB (input X)r/   r   qq?r   )rv   rc   r&   g-C6?)r   r   r   皙?rG   )r   r-   r3   r6   r   r   r*   n_categories_r   r   r:   r;   r<   rE   r   r7   r   r   rP   )r   r>   r+   r,   r?   X3y3r4   r5   	error_msgX3_testbayes_numeratorbayes_denominatorfactorrH   r#   r#   r$   test_categoricalnb  sP   

"$"$r  zDmin_categories, exp_X1_count, exp_X2_count, new_X, exp_n_categories_r   )r   r   r   r   rj   )r   r   r   r   c                 C   s   t ddgddgddgddgg}t g d}t dg}tdd| d}||| |j\}	}
t|	| t|
| ||}t|| t|j| d S )Nr   r   r   Fr   r   min_categories)r   r*   r   r3   r   r   r6   r  )r  exp_X1_countexp_X2_countnew_Xexp_n_categories_X_n_categoriesy_n_categoriesexpected_predictionr>   X1_countX2_countpredictionsr#   r#   r$   &test_categoricalnb_with_min_categories  s   ""




r  zmin_categories, error_msgz"'min_categories' should have shapec                 C   s~   t ddgddgddgddgg}t g d}tdd| d}tjt|d ||| W d    d S 1 s8w   Y  d S )Nr   r   r   Fr  r/   )r   r*   r   r:   r;   r<   r3   )r  r  r4   r5   r>   r#   r#   r$   (test_categoricalnb_min_categories_errors  s   ""r  c                 C   s  t ddgddgg}t ddg}tddd}d}tjt|d |j||ddgd W d    n1 s6w   Y  tjt|d ||| W d    n1 sSw   Y  t ddgddgg}t|	|| t
ddd}tjt|d |j||ddgd W d    n1 sw   Y  tjt|d ||| W d    n1 sw   Y  t d	d
gddgg}t|	|| tddd}tjt|d ||| W d    n1 sw   Y  t ddgddgg}t|	|| | |}tddd}tjt|d ||| W d    n	1 sw   Y  t ddgddgg}t|	|| t
ddd}tjt|d ||| W d    n	1 sRw   Y  t d	d
gddgg}t|	|| d S )Nr   r   rn   Fr   force_alphazFalpha too small will result in numeric errors, setting alpha = 1.0e-10r/   r1   r   r   rv   )r   r*   r   r:   warnsUserWarningr=   r3   r   r7   r   r   )r   r4   r5   nbr`   probr#   r#   r$   
test_alpha*  sP   r%  c            	      C   s  t ddgddgg} t ddg}t ddg}t|dd}|j| |ddgd t ddgdd	gg}t|jt | t d
dgddgg}t|| | t ddg}t|dd}d}tj	t
|d || | W d    n1 sww   Y  d}t |d dg}t|dd}|j| |ddgd t| |dgdd t g d}t|dd}d}tj	t
|d || | W d    d S 1 sw   Y  d S )Nr   r   r   Fr  r1   r   r   g333333?grq?r  gS?gևX?rv   rd   z+All values in alpha must be greater than 0.r/   r      )decimal)rv   r[   g      @z7When alpha is an array, it should contains `n_features`)r   r*   r   r=   r   r   r9   r7   r:   r;   r<   r3   _check_alpha)	r4   r5   r   r#  r   r$  m_nbexpected_msg	ALPHA_MINr#   r#   r$   test_alpha_vectorU  s4   "r,  c                  C   sB  t dd\} }t|dk|dk}| | || }}ttdd| |dd}| dks-J ttdd||dd}| d	ks@J ttdd| d
k|dd}| dksUJ ttdd|d
k|dd}| dksjJ tt | |dd}| dks{J ttdd| |dd}| dksJ tt ||dd}| dksJ d S )NT)
return_X_yr   r.   r   r   )cvgQ?gGz?rj   g(\?gq=
ףp?gp=
ף?r  )var_smoothingg{Gz?)r   r   
logical_orr   r   r|   r   r
   )r4   r5   
binary_3v8X_3v8y_3v8scoresr#   r#   r$   test_check_accuracy_on_digits}  s"   r5  c                  C   sT  d} t ddd}| dksJ tddg}t |dd}|jd |_t| | d|  }t ddd}tjt	|d	 | | ksDJ W d
   n1 sNw   Y  t ddd}tjt	|d	 | | ksiJ W d
   n1 ssw   Y  t |dd}|jd |_tjt	|d	 t| t| dg W d
   d
S 1 sw   Y  d
S )zThe provided value for alpha must only be
    used if alpha < _ALPHA_MIN and force_alpha is True.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/10772
    r   r   Tr  rn   rv   zCalpha too small will result in numeric errors, setting alpha = %.1eFr/   N)
r   r(  r   r*   rP   n_features_in_r   r:   r!  r"  )
_ALPHA_MINbalphasr`   r#   r#   r$   test_check_alpha  s0   "r:  	Estimatorc                 C   sT   t |\}}|  ||}||}t|dd}|t|j }t||| d S )Nr   r   )	r-   r3   predict_joint_log_probar   r   
atleast_2dr   r   r8   )r;  r   r+   r,   estjll
log_prob_xlog_prob_x_yr#   r#   r$   test_predict_joint_proba  s   
rB  )Er   r   numpyr   r:   scipy.specialr   sklearn.datasetsr   r   sklearn.model_selectionr   r   sklearn.naive_bayesr   r   r	   r
   r   sklearn.utils._testingr   r   r   r   sklearn.utils.fixesr   DISCRETE_NAIVE_BAYES_CLASSESALL_NAIVE_BAYES_CLASSESr*   r4   r5   r%   r-   rB   rF   rY   ra   rf   rr   ru   rw   rx   r   r   r   markparametrizer   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r%  r,  r5  r:  rB  r#   r#   r#   r$   <module>   s    
.	
'	
		
	
1
!



27/G7	


	
*(!%