一干毅、理論篇
總所周知宜猜,概率界分為兩大學派,一是頻率派硝逢,二是貝葉斯派姨拥。如果用一句話來陳述它們的核心區(qū)別,我傾向于這樣講渠鸽,“頻率派:概率是事件在長時間內發(fā)生的頻率叫乌;貝葉斯派:概率可以解釋為我們對一件事情發(fā)生的相信程度(信心)』崭浚”憨奸,通俗來講,前者需大量的事件凿试,看發(fā)生的次數排宰,后者針對某一件事似芝,我們對它發(fā)不發(fā)生有多大的信心茂腥。
這周在學習貝葉斯,正好還看了點吳軍的《數學之美》礁苗,前幾章大多涉及到貝葉斯桑逝、馬爾科夫鏈在翻譯、語音識別等方向的應用乓梨,深入淺出,看得真是不亦樂乎。
話不多說傲醉,上公式:
這就是大名鼎鼎的貝葉斯公式。
P(A):什么都不知道呻率,發(fā)生A的概率硬毕。通常稱為先驗概率。
P(A|X):在已知X發(fā)生的前提下礼仗,發(fā)生A的概率吐咳。我們已經有了X的證據了,再來推斷A發(fā)生的概率元践,通常稱為后驗概率韭脊。
有什么用呢?
先驗和后驗单旁,可以說就是貝葉斯的核心所在了沪羔。
舉個例子吧,通常來講象浑,一個班級學生的成績符合正態(tài)分布蔫饰,這個“正態(tài)分布”就是先驗:我什么數據、樣本愉豺、證據都沒有篓吁,我不清楚班上有多少人、不清楚哪怕其中一個人的成績蚪拦,得出的事件A杖剪。
正態(tài)分布有兩個參數,平均數u和標準差std外盯,我們知道一個班的成績符合正態(tài)分布摘盆,但是是一個怎樣的正態(tài)分布就不知道了。于是我們需要樣本---各個學生的成績饱苟,事件X孩擂,在有了X的情況下,我們獲得的事件A才有意義箱熬。這個明確參數的“正態(tài)分布”就是后驗:不僅知道它是正態(tài)分布类垦,而且知道它是怎樣的一個正態(tài)分布狈邑,得出事件P(A|X),在X的條件下A的情況蚤认。
這也符合我們日常的思考邏輯:在信息缺少的情況下米苹,先估摸著得到一個模子,然后不斷的從外界獲取信息砰琢,打磨之前的模子蘸嘶,信息獲得的越多越準,模子自然就越精美陪汽。
再舉個生動點的例子训唱,假如我們現在想對兩個參數為lambda1,lambda2的泊松分布進行估計(記住:我們的目的是估計lambda)挚冤,一開始我們什么都不知道况增,假設兩種情況(兩種先驗):一、lambda符合均勻分布训挡;二澳骤、lambda符合指數分布,下圖圖一(1)澜薄、圖一(2)是先驗概率的直觀圖为肮,顏色越深代表概率越大(越有可能發(fā)生),顯然平均分布在整個空間上每處的概率一致表悬,處處顏色相等弥锄,指數分布在靠近0的位置顏色要深些。
上面是先驗蟆沫,搞定了籽暇。為弄后驗,我們需要樣本饭庞,就自己生成些樣本罷:因為有兩個參數lambda1,lambda2戒悠,要成兩組樣本,第一組樣本A1由lambda1=1的泊松分布隨機生成舟山,第二組樣本A2由lambda2=3的泊松分布隨機生成绸狐。
有了A1,A2兩組樣本,我們就可以用他們來估計lambda1,lambda2了(事先我們是不知道A1,A2兩組樣本是符合lambda1=1,lambda2=3的泊松分布的累盗,在這里為了模擬寒矿,用它來生成模擬數據A1,A2的)。
從直觀圖可以看出若债,當樣本數N=1時符相,對原來的先驗空間產生影響,估計值處在真實值lambda1=1,lambda2=3的很大一篇范圍內,也就是說啊终,一個樣本不足以估計lambda镜豹。
N=5蓝牲,可以看出趟脂,估計值在(1,3)這個真實值點的估計范圍在縮小。
N=20,50就更小了昔期,這個時候可以估計真實值大概在(1,3)附近
N=100镇眷,有了100組樣本點咬最,可以說基本就敢斷定真實值就在(1,3)了
總結:
先驗為均勻分布或指數分布,但參數不可知永乌』笊辏可通過一系列的樣本,來不斷的估計參數值翅雏,得到后驗圈驼。
二、應用篇
import scipy.stats as stats
import numpy as np
from IPython.core.pylabtools import figsize
from matplotlib import pyplot as plt
from matplotlib.pyplot import jet
plt.rcParams['font.sans-serif']=['SimHei']#解約matplotlib畫圖望几,中文亂碼問題
N=100#樣本數
#為產生模擬數據的參數
lambda_1_true = 1
lambda_2_true = 3
#產生poisson分布的兩組樣本绩脆,參數分別是lambda_1_true,lambda_2_true
data = np.concatenate([
stats.poisson.rvs(lambda_1_true,size=(N,1)),
stats.poisson.rvs(lambda_2_true,size=(N,1))
],axis=1)
# print (data)
x = y = np.linspace(.01,5,100)
#pmf:概率質量函數橄抹,代表某個點符合poisson的概率大小
likelihood_x =np.array([stats.poisson.pmf(data[:,0],_x)
for _x inx]).prod(axis=1)
likelihood_y =np.array([stats.poisson.pmf(data[:,1],_y)
for _y iny]).prod(axis=1)
L =np.dot(likelihood_x[:,None],likelihood_y[None,:])
# print(likelihood_x)
# print(likelihood_y)
figsize(12.5,12)
#pdf:概率密度函數靴迫,在x,y上分別生成兩組均勻分布的概率密度
uni_x = stats.uniform.pdf(x,loc=0,scale=5)
uni_y = stats.uniform.pdf(y,loc=0,scale=5)
Mu = np.dot(uni_x[:,None],uni_y[None,:])
#pdf:概率密度函數楼誓,在x玉锌,y上分別生成兩組指數分布的概率密度
exp_x = stats.expon.pdf(x,loc=0,scale=3)
exp_y = stats.expon.pdf(y,loc=0,scale=10)
Me = np.dot(exp_x[:,None],exp_y[None,:])
#第一個圖:均分分布
plt.subplot(221)
im = plt.imshow(Mu, interpolation='none',origin='lower', vmax=1, vmin=-.15, extent=(0,5,0,5))
plt.scatter(lambda_2_true,lambda_1_true,c='k',s=50,edgecolors='none')
plt.xlim(0,5)
plt.ylim(0,5)
plt.title('(1)均勻分布,先驗概率直觀圖')
#第二個圖:參數為lambda的poisson分布疟羹,lambda為均勻分布
plt.subplot(223)
plt.contour(x, y, Mu*L)
im = plt.imshow(Mu*L, interpolation='none',origin='lower', extent=(0,5,0,5))
plt.scatter(lambda_2_true,lambda_1_true,c='k',s=50,edgecolors='none')
plt.xlim(0,5)
plt.ylim(0,5)
plt.title('(3)均勻分布主守,后驗概率直觀圖')
#第三個圖:指數分布
plt.subplot(222)
plt.contour(x, y, Me)
im = plt.imshow(Me, interpolation='none',origin='lower', extent=(0,5,0,5))
plt.scatter(lambda_2_true,lambda_1_true,c='k',s=50,edgecolors='none')
plt.xlim(0,5)
plt.ylim(0,5)
plt.title('(2)指數分布,先驗概率直觀圖')
#第三個圖:參數為lambda的poisson分布榄融,lambda為指數分布
plt.subplot(224)
plt.contour(x, y, Me*L)
im = plt.imshow(Me*L, interpolation='none',origin='lower', extent=(0,5,0,5))
plt.scatter(lambda_2_true,lambda_1_true,c='k',s=50,edgecolors='none')
plt.xlim(0,5)
plt.ylim(0,5)
plt.title('(4)指數分布参淫,后驗概率直觀圖')
plt.set_cmap('jet')
plt.show()
參考:《貝葉斯方法-概率編程與貝葉斯推斷》