首先了解一些背景知識: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: