首先了解一些背景知识:from: https://www.r-bloggers.com/the-bayesian-approach-to-ridge-regression/php
In this post, we are going to be taking a computational approach to demonstrating the equivalence of the bayesian approach and ridge regression.app
From: 文本语言模型的参数估计-最大似然估计、MAP及贝叶斯估计ide
三类参数估计方法:最大似然估计MLE、最大后验几率估计MAP、贝叶斯估计。函数
关键:写出似然函数post
最大后验估计与最大似然估计类似,不一样点在于估计的函数中容许加入一个先验
,也就是说此时不是要求似然函数最大,而是要求由贝叶斯公式计算出的整个后验几率最大,即ui
注意这里P(X)与参数无关,所以等价于要使分子最大。与最大似然估计相比,如今须要多加上一个先验分布几率的对数。this
【在样本足够大时,结果逼近MLE】spa
【加了先验没什么神秘的,效果很相似l正则项】.net
贝叶斯估计是在MAP上作进一步拓展,此时不直接估计参数的值,而是容许参数服从必定几率分布。回顾一下贝叶斯公式code
如今不是要求后验几率最大,这样就须要求,即观察到的evidence的几率,由全几率公式展开可得
当新的数据被观察到时,后验几率能够自动随之调整。可是一般这个全几率的求法是贝叶斯估计比较有技巧性的地方。
那么如何用贝叶斯估计来作预测呢?若是咱们想求一个新值的几率,能够由
来计算。注意此时第二项因子在上的积分再也不等于1,这就是和MLE及MAP很大的不一样点。
咱们仍然以扔硬币的伯努利实验为例来讲明。和MAP中同样,咱们假设先验分布为Beta分布,
可是构造贝叶斯估计时,
注意这里用到了公式
当T为二维的情形能够对Beta分布来应用;T为多维的情形能够对狄利克雷分布应用
根据结果能够知道,根据贝叶斯估计,参数p服从一个新的Beta分布。回忆一下,咱们为p选取的先验分布是Beta分布,而后以p为参数的二项分布用贝叶斯估计获得的后验几率仍然服从Beta分布,由此咱们说二项分布和Beta分布是共轭分布。在几率语言模型中,一般选取共轭分布做为先验,能够带来计算上的方便性。最典型的就是LDA中每一个文档中词的Topic分布服从Multinomial分布,其先验选取共轭分布即Dirichlet分布;每一个Topic下词的分布服从Multinomial分布,其先验也一样选取共轭分布即Dirichlet分布。
根据Beta分布的指望和方差计算公式,咱们有
能够看出此时估计的p的指望和MLE ,MAP中获得的估计值都不一样,此时若是仍然是作20次实验,12次正面,8次反面,那么咱们根据贝叶斯估计获得的p知足参数为12+5和8+5的Beta分布,其均值和方差分别是17/30=0.567, 17*13/(31*30^2)=0.0079。能够看到此时求出的p的指望比MLE和MAP获得的估计值都小,更加接近0.5。
综上所述咱们能够可视化MLE,MAP和贝叶斯估计对参数的估计结果以下
我的理解是,从MLE到MAP再到贝叶斯估计,对参数的表示愈来愈精确【应该是表达愈来愈丰富,毕竟由一个值变为了一个分布,减小了推断过程当中信息的损失】,获得的参数估计结果也愈来愈接近0.5这个先验几率,愈来愈可以反映基于样本的真实参数状况。【通常都用贝叶斯估计】
连接:https://www.zhihu.com/question/22007264/answer/20014371
过去的线性归回,好比使用最小二乘,其实就是至关于最大似然的感受,容易overfitting。
采用了贝叶斯,假设了高斯分布,也就等价于Ridge Regression。
若是假设是拉普拉斯分布,就等价于LASSO。
Train:
>>> from sklearn import linear_model >>> X = [[0., 0.], [1., 1.], [2., 2.], [3., 3.]] >>> Y = [0., 1., 2., 3.] >>> reg = linear_model.BayesianRidge() >>> reg.fit(X, Y) BayesianRidge(alpha_1=1e-06, alpha_2=1e-06, compute_score=False, copy_X=True, fit_intercept=True, lambda_1=1e-06, lambda_2=1e-06, n_iter=300, normalize=False, tol=0.001, verbose=False)
Predict:
>>> reg.predict ([[1, 0.]]) array([ 0.50000013])
Demo: