1、貝葉斯定理
P(A|B)是已知B發生後A的條件概率,也由於得自B的取值而被稱作A的後驗概率。
P(B|A)是已知A發生後B的條件概率,也由於得自A的取值而被稱作B的後驗概率。
P(A)是A的先驗概率或邊緣概率。之所以稱爲”先驗”是因爲它不考慮任何B方面的因素。
P(B)是B的先驗概率或邊緣概率。
貝葉斯定理可表述爲:後驗概率 = (相似度 * 先驗概率) / 標準化常量
也就是說,後驗概率與先驗概率和相似度的乘積成正比。
比例P(B|A)/P(B)也有時被稱作標準相似度,貝葉斯定理可表述爲:後驗概率 = 標準相似度 * 先驗概率
假設{Ai}是事件集合裏的部分集合,對於任意的Ai,貝葉斯定理可用下式表示:
2、貝葉斯網絡
貝葉斯網絡,由一個有向無環圖(DAG)和條件概率表(CPT)組成。
貝葉斯網絡通過一個有向無環圖來表示一組隨機變量跟它們的條件依賴關係。它通過條件概率分佈來參數化。每一個結點都通過P(node|Pa(node))來參數化,Pa(node)表示網絡中的父節點。如圖是一個簡單的貝葉斯網絡,其對應的全概率公式爲:
P(a,b,c)=P(c∣a,b)P(b∣a)P(a)
較複雜的貝葉斯網絡,其對應的全概率公式爲:
P(x1,x2,x3,x4,x5,x6,x7)=P(x1)P(x2)P(x3)P(x4∣x1,x2,x3)P(x5∣x1,x3)P(x6∣x4)P(x7∣x4,x5)
3、貝葉斯網絡Student模型
一個學生擁有成績、課程難度、智力、SAT得分、推薦信等變量。通過一張有向無環圖可以把這些變量的關係表示出來,可以想象成績由課程難度和智力決定,SAT成績由智力決定,而推薦信由成績決定。該模型對應的概率圖如下:
4、通過概率圖python類庫pgmpy構建Student模型
代碼如下:
from pgmpy.models import BayesianModel
from pgmpy.factors.discrete import TabularCPD
# 通過邊來定義貝葉斯模型
model = BayesianModel([('D', 'G'), ('I', 'G'), ('G', 'L'), ('I', 'S')])
# 定義條件概率分佈
cpd_d = TabularCPD(variable='D', variable_card=2, values=[[0.6, 0.4]])
cpd_i = TabularCPD(variable='I', variable_card=2, values=[[0.7, 0.3]])
# variable:變量
# variable_card:基數
# values:變量值
# evidence:
cpd_g = TabularCPD(variable='G', variable_card=3,
values=[[0.3, 0.05, 0.9, 0.5],
[0.4, 0.25, 0.08, 0.3],
[0.3, 0.7, 0.02, 0.2]],
evidence=['I', 'D'],
evidence_card=[2, 2])
cpd_l = TabularCPD(variable='L', variable_card=2,
values=[[0.1, 0.4, 0.99],
[0.9, 0.6, 0.01]],
evidence=['G'],
evidence_card=[3])
cpd_s = TabularCPD(variable='S', variable_card=2,
values=[[0.95, 0.2],
[0.05, 0.8]],
evidence=['I'],
evidence_card=[2])
# 將有向無環圖與條件概率分佈表關聯
model.add_cpds(cpd_d, cpd_i, cpd_g, cpd_l, cpd_s)
# 驗證模型:檢查網絡結構和CPD,並驗證CPD是否正確定義和總和爲1
model.check_model()
獲取上述代碼構建的概率圖模型:
In[1]:model.get_cpds()
Out[1]:
[<TabularCPD representing P(D:2) at 0x10286e198>,
<TabularCPD representing P(I:2) at 0x10286e160>,
<TabularCPD representing P(G:3 | I:2, D:2) at 0x100d69710>,
<TabularCPD representing P(L:2 | G:3) at 0x10286e1d0>,
<TabularCPD representing P(S:2 | I:2) at 0x1093f6358>]
獲取結點G的概率表:
In[2]:print(model.get_cpds('G'))
╒═════╤═════╤══════╤══════╤═════╕
│ I │ I_0 │ I_0 │ I_1 │ I_1 │
├─────┼─────┼──────┼──────┼─────┤
│ D │ D_0 │ D_1 │ D_0 │ D_1 │
├─────┼─────┼──────┼──────┼─────┤
│ G_0 │ 0.3 │ 0.05 │ 0.9 │ 0.5 │
├─────┼─────┼──────┼──────┼─────┤
│ G_1 │ 0.4 │ 0.25 │ 0.08 │ 0.3 │
├─────┼─────┼──────┼──────┼─────┤
│ G_2 │ 0.3 │ 0.7 │ 0.02 │ 0.2 │
╘═════╧═════╧══════╧══════╧═════╛
獲取結點G的基數:
In[3]: model.get_cardinality('G')
Out[3]: 3
獲取整個貝葉斯網絡的局部依賴:
In[4]: model.local_independencies(['D', 'I', 'S', 'G', 'L'])
Out[4]:
(D _|_ I, S)
(I _|_ D)
(S _|_ D, L, G | I)
(G _|_ S | I, D)
(L _|_ I, S, D | G)
通過貝葉斯網絡計算聯合分佈
條件概率公式如下:
Student模型中,全概率公式的表示:
通過本地依賴條件,可得:
由上面等式可得,聯合分佈產生於圖中所有的CPD,因此編碼圖中的聯合分佈有助於減少我們所要存儲的參數。
推導 Bayiesian Model
因此,我們可能想知道一個聰明的學生在艱難的課程中可能的成績,因爲他在SAT中打得很好。 因此,爲了從聯合分配計算這些值,我們必須減少給定的變量,即
在知道一個聰明的學生、他的一門比較難的課程及其SAT成績較高的情況。爲了從聯合分佈計算這些值,必須減少給定的變量
變量消除
如果我們只想計算G的概率,需要邊緣化其他所給的參數
由於並非所有的條件分佈都取決於所有的變量,我們可以推出內部的求和:
In[5]:from pgmpy.inference import VariableElimination
infer = VariableElimination(model)
print(infer.query(['G']) ['G'])
╒═════╤══════════╕
│ G │ phi(G) │
╞═════╪══════════╡
│ G_0 │ 0.3620 │
├─────┼──────────┤
│ G_1 │ 0.2884 │
├─────┼──────────┤
│ G_2 │ 0.3496 │
╘═════╧══════════╛
計算
在pgmpy中我們只需要省略額外參數即可計算出條件分佈概率
In[6]: print(infer.query(['G'], evidence={'D': 0, 'I': 1}) ['G'])
╒═════╤══════════╕
│ G │ phi(G) │
╞═════╪══════════╡
│ G_0 │ 0.9000 │
├─────┼──────────┤
│ G_1 │ 0.0800 │
├─────┼──────────┤
│ G_2 │ 0.0200 │
╘═════╧══════════╛
新數據節點值的預測跟計算條件概率非常相似,我們需要查詢預測變量的其他全部特徵。困難在於通過分佈概率去代替更多可能的變量狀態。
In[7]: infer.map_query('G')
Out[7]: {'G': 2}