o
    ¢ÄiF+  ã                   @   sh  d dl mZ d dlZd dlZd dlmZ d dlmZm	Z	m
Z
 d dlmZ d dlmZmZmZmZmZ d dlmZ e ¡ Zdd	„ Zd
d„ Zdd„ Zej dddg¡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d!¡d"d#„ ƒZ$ej d$d%d&g¡d'd(„ ƒZ%d)d*„ Z&ej d+ej'ej(g¡ej d,e	eg¡d-d.„ ƒƒZ)ej d,e	eg¡d/d0„ ƒZ*dS )1é    )ÚlogN)Údatasets)ÚARDRegressionÚBayesianRidgeÚRidge)Úcheck_random_state)Ú_convert_containerÚassert_allcloseÚassert_almost_equalÚassert_array_almost_equalÚassert_array_less)Úfast_logdetc                  C   s@   t jt j} }tdd}| | |¡ |jj|jd fksJ ‚dS )zCheck scores attribute shapeT©Úcompute_scoreé   N)ÚdiabetesÚdataÚtargetr   ÚfitÚscores_ÚshapeZn_iter_©ÚXÚyÚclf© r   ú_/home/kim/smarthome/.venv/lib/python3.10/site-packages/sklearn/linear_model/tests/test_bayes.pyÚtest_bayesian_ridge_scores   s   
r   c               	   C   s  t jt j} }| jd }t tj¡j}dt |¡|  }d}d}d}d}d}	|t	|ƒ |	|  }
|
|t	|ƒ ||  7 }
d| t 
|¡ d| t | | j¡  }tj ||¡}|
dt|ƒt |j|¡ |t	dtj ƒ   7 }
t||||	dddd	}| | |¡ t|jd |
d
d dS )aÀ  Check value of score on toy example.

    Compute log marginal likelihood with equation (36) in Sparse Bayesian
    Learning and the Relevance Vector Machine (Tipping, 2001):

    - 0.5 * (log |Id/alpha + X.X^T/lambda| +
             y^T.(Id/alpha + X.X^T/lambda).y + n * log(2 * pi))
    + lambda_1 * log(lambda) - lambda_2 * lambda
    + alpha_1 * log(alpha) - alpha_2 * alpha

    and check equality with the score computed during training.
    r   ç      ð?çš™™™™™¹?g      à¿é   r   FT)Úalpha_1Úalpha_2Úlambda_1Úlambda_2Úmax_iterÚfit_interceptr   é	   ©ÚdecimalN)r   r   r   r   ÚnpZfinfoÚfloat64ÚepsÚvarr   ÚeyeÚdotÚTÚlinalgZsolver   Úpir   r   r
   r   )r   r   Ú	n_samplesr,   Úalpha_Úlambda_r!   r"   r#   r$   ÚscoreÚMZM_inv_dot_yr   r   r   r   Ú test_bayesian_ridge_score_values"   s6   
(&ÿù	r8   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g¡} t  g d	¢¡j}td
d | |¡}t|j|j d | |¡}t|j	|j	ƒ t
|j|jƒ d S )Nr   é   é   é   é   r    é   é
   ©r   r    r9   r    r   r:   r;   Tr   ©Úalpha©r*   Úarrayr0   r   r   r   r5   r4   r   Úcoef_r
   Z
intercept_)r   r   Úbr_modelÚrr_modelr   r   r   Útest_bayesian_ridge_parameterU   s   4rG   zn_samples, n_features)r>   é   )rH   r>   c                 C   sf   t j| ||d\}}tdd ||¡}tj |jt |¡ |j	t 
|j|¡  ¡}t|j|dd dS )zˆCheck the posterior covariance matrix sigma_

    Non-regression test for https://github.com/scikit-learn/scikit-learn/issues/31093
    )Úrandom_stateF)r&   gíµ ÷Æ°>©ZrtolN)r   Zmake_regressionr   r   r*   r1   Úinvr5   Úidentityr4   r/   r0   r	   Úsigma_)r3   Ú
n_featuresÚglobal_random_seedr   r   ÚregZcovariance_matrixr   r   r   Útest_bayesian_covariance_matrixb   s   
ÿ"ÿrQ   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g¡} t  g d	¢¡j}t  g d
¢¡j}tddj| ||d}t|j|j dj| ||d}t|j	|j	ƒ t
|j|jƒ d S )Nr   r9   r:   r;   r<   r    r=   r>   r?   )r:   r9   r9   r   r   r    r9   Tr   )Zsample_weightr@   rB   )r   r   ÚwrE   rF   r   r   r   Útest_bayesian_sample_weightsr   s   4ÿrS   c                  C   sl   t  dgdgdgdgdgg¡} t  g d¢¡}tdd}| | |¡ dgd	gd
gg}t| |¡g d¢dƒ d S )Nr   r    r=   é   r>   )r   r    r=   rT   r>   Tr   r9   r:   ©r   r9   r:   )r*   rC   r   r   r   Úpredict©r   ÚYr   Útestr   r   r   Útest_toy_bayesian_ridge_object‚   s   
rZ   c                  C   sR   t  t  ddd¡d¡} t  g d¢¡}tddd}| | |¡ | |¡}t|dƒ d S )Nr   r:   r;   )ç        r   r[   ç      ð¿r[   r   gü©ñÒMbP?)Z
alpha_initZlambda_init)r*   ZvanderZlinspacerC   r   r   r6   r
   )r   r   rP   Úr2r   r   r   Útest_bayesian_initial_paramsŽ   s
   r^   c            	      C   sˆ   d} d}t dƒ}| ¡ }| | |f¡}tj| |t |¡jd}tj| |t |¡jd}tƒ tƒ fD ]}| 	||¡ 
|¡}t||ƒ q1d S )Nr:   r;   é*   ©Údtype)r   ÚrandÚrandom_sampler*   ÚfullrC   ra   r   r   r   rV   r   )	r3   rN   rI   Úconstant_valuer   r   Úexpectedr   Zy_predr   r   r   Ú6test_prediction_bayesian_ridge_ard_with_constant_input›   s   þrg   c            
      C   s|   d} d}t dƒ}| ¡ }| | |f¡}tj| |t |¡jd}d}tƒ tƒ fD ]}| 	||¡j
|dd\}}	t|	|ƒ q'd S )Nr>   r;   r_   r`   ç{®Gáz„?T©Z
return_std)r   rb   rc   r*   rd   rC   ra   r   r   r   rV   r   )
r3   rN   rI   re   r   r   Zexpected_upper_boundaryr   Ú_Úy_stdr   r   r   Ú/test_std_bayesian_ridge_ard_with_constant_input«   s   þrl   c                  C   s\   t  ddgddgg¡} t  ddg¡}tdd}| | |¡ |jjdks%J ‚|j| dd d S )Nr   r   )r%   )r   r   Tri   )r*   rC   r   r   rM   r   rV   r   r   r   r   Útest_update_of_sigma_in_ard¼   s   
rm   c                  C   sd   t  dgdgdgg¡} t  g d¢¡}tdd}| | |¡ dgdgdgg}t| |¡g d¢dƒ d S )	Nr   r    r9   )r   r    r9   Tr   r:   rU   )r*   rC   r   r   r   rV   rW   r   r   r   Útest_toy_ard_objectÊ   s   
rn   ))r>   éd   )ro   r>   c                 C   sZ   t j | ¡jdd}|d d …df }tƒ }| ||¡ t  d|jd  ¡}|dk s+J ‚d S )N)éú   r9   )Úsizer   g»½×Ùß|Û=)r*   ÚrandomÚRandomStateÚnormalr   r   ÚabsrD   )rO   r3   rN   r   r   Z	regressorZabs_coef_errorr   r   r   Ú!test_ard_accuracy_on_easy_problemÖ   s   rv   Úconstructor_namerC   Z	dataframec                    sô   ‡ ‡fdd„‰‡fdd„}d}d}d}t  g d¢¡‰d	‰ t j ||f¡}t|| ƒ}t j ||f¡}t|| ƒ}tg d
¢ƒD ];\}}|||ƒ}	tƒ }
|
 ||	¡ |
j|dd\}}t|||d t	ƒ }| ||	¡ |j|dd\}}t|||d q<d S )Nc                    s   t  | ˆ¡ˆ  S )N)r*   r/   )r   )ÚbrR   r   r   Úfç   s   ztest_return_std.<locals>.fc                    s   ˆ | ƒt j | jd ¡|  S )Nr   )r*   rr   Úrandnr   )r   Ú
noise_mult)ry   r   r   Úf_noiseê   s   z test_return_std.<locals>.f_noiser;   é2   r>   )r   r[   r   r\   r[   r   )r   r   rh   Tri   r(   )
r*   rC   rr   r   Ú	enumerater   r   rV   r   r   )rw   r|   ÚdZn_trainZn_testr   ZX_testr)   r{   r   Úm1Zy_mean1Zy_std1Úm2Zy_mean2Zy_std2r   )rx   ry   rR   r   Útest_return_stdä   s,   


õr‚   c                 C   s|   t j | ¡}d }}| ||¡}d}t  d|d ¡}t  dg| ¡}tƒ }| ||||¡}	| ||||¡}
t j	 
|	|
¡ d S )Nr>   r   T)r*   rr   rs   rz   ZarangerC   r   Z_update_sigmaZ_update_sigma_woodburyÚtestingr	   )rO   Úrngr3   rN   r   rA   ZlmbdaZkeep_lambdarP   ÚsigmaZsigma_woodburyr   r   r   Útest_update_sigma  s   r†   ra   Ú	Estimatorc           	   	   C   s¸   t jddgddgddgddgddgddgddgg| d	}t  g d
¢¡j}|ƒ }| ||¡ ddg}|D ]}t||ƒj|jks@J ‚q3|j|dd\}}|j|jksRJ ‚|j|jksZJ ‚d S )Nr   r9   r:   r;   r<   r    r=   r>   r`   r?   rD   rM   Tri   )r*   rC   r0   r   Úgetattrra   rV   )	ra   r‡   r   r   ÚmodelÚ
attributesÚ	attributeZy_meanrk   r   r   r   Útest_dtype_match   s   8rŒ   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g¡}t  g d	¢¡j}| ƒ }| | t j¡|¡j}| | t j¡|¡j}t jj	||d
d d S )Nr   r9   r:   r;   r<   r    r=   r>   r?   g-Cëâ6?rJ   )
r*   rC   r0   r   ZastypeÚfloat32rD   r+   rƒ   r	   )r‡   r   r   r‰   Zcoef_32Zcoef_64r   r   r   Útest_dtype_correctness3  s   4rŽ   )+Úmathr   Únumpyr*   ZpytestZsklearnr   Zsklearn.linear_modelr   r   r   Zsklearn.utilsr   Zsklearn.utils._testingr   r	   r
   r   r   Zsklearn.utils.extmathr   Zload_diabetesr   r   r8   rG   ÚmarkZparametrizerQ   rS   rZ   r^   rg   rl   rm   rn   rv   r‚   r†   r   r+   rŒ   rŽ   r   r   r   r   Ú<module>   s>   
3


#