U
    2da(                     @   sL  d dl mZ d dl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mZ d dlmZ d d	lmZ d d
lmZ e 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d d!d" Z!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+d, Z'dS )-    )logN)assert_array_almost_equal)assert_almost_equal)assert_array_less)check_random_state)BayesianRidgeARDRegression)Ridge)datasets)fast_logdetc                  C   s@   t jt j } }tdd}|| | |jj|jd fks<tdS )zCheck scores attribute shapeTcompute_score   N)	diabetesdatatargetr   fitscores_shapeZn_iter_AssertionErrorXyclf r   I/tmp/pip-unpacked-wheel-zrfo1fqw/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n_iterZfit_interceptr   	   decimalN)r   r   r   r   npZfinfofloat64epsvarr   ZeyedotTZ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    
(&	r4   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 ddddd	ddgj}td
d| |}t|j|j d| |}t|j	|j	 t
|j|j d S )Nr               r      
   r   Tr   alphar(   arrayr-   r   r   r	   r1   r0   r   coef_r   Z
intercept_)r   r   br_modelrr_modelr   r   r   test_bayesian_ridge_parameterU   s    4rB   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 ddddd	ddgj}t dddddddgj}td
dj| ||d}t|j|j dj| ||d}t|j	|j	 t
|j|j d S )Nr   r5   r6   r7   r8   r   r9   r:   r   Tr   )Zsample_weightr;   r=   )r   r   wr@   rA   r   r   r   test_bayesian_sample_weightsb   s    4  rD   c                  C   st   t dgdgdgdgdgg} t dddddg}tdd}|| | dgdgd	gg}t||ddd	gd d S )
Nr   r   r9      r:   Tr   r5   r6   )r(   r>   r   r   r   predictr   Yr   testr   r   r   test_toy_bayesian_ridge_objectr   s    
rJ   c                  C   sX   t t dddd} t dddddg}tddd}|| || |}t|d d S )	Nr   r6   r7           r         gMbP?)Z
alpha_initZlambda_init)r(   ZvanderZlinspacer>   r   r   r2   r   )r   r   regZr2r   r   r   test_bayesian_initial_params~   s
    rN   c            	      C   s   d} d}t d}| }|| |f}tj| |t|jd}tj| |t|jd}t t fD ] }|	||
|}t|| qbd S )Nr6   r7   *   dtype)r   randrandom_sampler(   fullr>   rQ   r   r   r   rF   r   )	r/   
n_featuresrandom_stateconstant_valuer   r   expectedr   Zy_predr   r   r   6test_prediction_bayesian_ridge_ard_with_constant_input   s    rY   c            
      C   s|   d} d}t d}| }|| |f}tj| |t|jd}d}t t fD ](}|	||j
|dd\}}	t|	| qNd S )Nr:   r7   rO   rP   {Gz?TZ
return_std)r   rR   rS   r(   rT   r>   rQ   r   r   r   rF   r   )
r/   rU   rV   rW   r   r   Zexpected_upper_boundaryr   _y_stdr   r   r   /test_std_bayesian_ridge_ard_with_constant_input   s    r^   c                  C   s\   t ddgddgg} t ddg}tdd}|| | |jjdksJt|j| dd d S )Nr   r   )r$   )r   r   Tr[   )r(   r>   r   r   sigma_r   r   rF   r   r   r   r   test_update_of_sigma_in_ard   s    
r`   c                  C   sh   t dgdgdgg} t dddg}tdd}|| | dgdgdgg}t||dddgd d S )Nr   r   r5   Tr   r6   )r(   r>   r   r   r   rF   rG   r   r   r   test_toy_ard_object   s    
ra   zn_samples, n_features))r:   d   )rb   r:   c                 C   sZ   t j| jdd}|d d df }t }||| t d|jd  }|dk sVtd S )N)   r5   )sizer   g|=)	r(   randomRandomStatenormalr   r   absr?   r   )global_random_seedr/   rU   r   r   Z	regressorZabs_coef_errorr   r   r   !test_ard_accuracy_on_easy_problem   s    rj   c                     s    fddfdd} d}d}d}t dd	dd
d	gd t j||f}t j||f}tdddgD ]v\}}| ||}t }	|	|| |	j|dd\}
}t|||d t }||| |j|dd\}}t|||d qld S )Nc                    s   t |   S )N)r(   r,   )r   )brC   r   r   f   s    ztest_return_std.<locals>.fc                    s    | t j| jd |  S )Nr   )r(   re   randnr   )r   
noise_mult)rl   r   r   f_noise   s    z test_return_std.<locals>.f_noiser7   2   r:   r   rK   rL   r   r   rZ   Tr[   r&   )	r(   r>   re   	enumerater   r   rF   r   r   )ro   dZn_trainZn_testr   ZX_testr'   rn   r   m1Zy_mean1Zy_std1m2Zy_mean2Zy_std2r   )rk   rl   rC   r   test_return_std   s&    
ru   c                 C   s|   t j| }d }}|||}d}t d|d }t dg| }t }|||||}	|||||}
t j	
|	|
 d S )Nr:   r   T)r(   re   rf   rm   Zaranger>   r   Z_update_sigmaZ_update_sigma_woodburytestingassert_allclose)ri   rngr/   rU   r   r<   ZlmbdaZkeep_lambdarM   sigmaZsigma_woodburyr   r   r   test_update_sigma   s    rz   rQ   	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 ddddd
ddgj}| }||| ddg}|D ]}t||j|jksptqp|j|dd\}}|j|jkst|j|jkstd S )Nr   r5   r6   r7   r8   r   r9   r:   rP   r   r?   r_   Tr[   )r(   r>   r-   r   getattrrQ   r   rF   )	rQ   r{   r   r   model
attributes	attributeZy_meanr]   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 ddddd	ddgj}|  }||t j|j}||t j|j}t jj	||d
d d S )Nr   r5   r6   r7   r8   r   r9   r:   r   g-C6?)Zrtol)
r(   r>   r-   r   Zastypefloat32r?   r)   rv   rw   )r{   r   r   r}   Zcoef_32Zcoef_64r   r   r   test_dtype_correctness  s    4r   )(mathr   Znumpyr(   ZpytestZsklearn.utils._testingr   r   r   Zsklearn.utilsr   Zsklearn.linear_modelr   r   r	   Zsklearnr
   Zsklearn.utils.extmathr   Zload_diabetesr   r   r4   rB   rD   rJ   rN   rY   r^   r`   ra   markZparametrizerj   ru   rz   r   r)   r   r   r   r   r   r   <module>   s<   
3
 