【机器学习基础】数学推导+纯Python实现机器学习算法12:贝叶斯网络
Python機(jī)器學(xué)習(xí)算法實(shí)現(xiàn)
Author:louwill
? ? ?
???? 在上一講中,我們講到了經(jīng)典的樸素貝葉斯算法。樸素貝葉斯的一大特點(diǎn)就是特征的條件獨(dú)立假設(shè),但在現(xiàn)實(shí)情況下,條件獨(dú)立這個(gè)假設(shè)通常過于嚴(yán)格,在實(shí)際中很難成立。特征之間的相關(guān)性限制了樸素貝葉斯的性能,所以本節(jié)筆者將繼續(xù)介紹一種放寬了條件獨(dú)立假設(shè)的貝葉斯算法——貝葉斯網(wǎng)絡(luò)(Bayesian Network)。
貝葉斯網(wǎng)絡(luò)的直觀例子
???? 先以一個(gè)例子進(jìn)行引入。假設(shè)我們需要通過頭像真實(shí)性、粉絲數(shù)量和動(dòng)態(tài)更新頻率來判斷一個(gè)微博賬號(hào)是否為真實(shí)賬號(hào)。各特征屬性之間的關(guān)系如下圖所示:
???? 上圖是一個(gè)有向無環(huán)圖(DAG),每個(gè)節(jié)點(diǎn)表示一個(gè)特征或者隨機(jī)變量,特征之間的關(guān)系則是用箭頭連線來表示,比如說動(dòng)態(tài)的更新頻率、粉絲數(shù)量和頭像真實(shí)性都會(huì)對(duì)一個(gè)微博賬號(hào)的真實(shí)性有影響,而頭像真實(shí)性又對(duì)粉絲數(shù)量有一定影響。但僅有各特征之間的關(guān)系還不足以進(jìn)行貝葉斯分析。除此之外,貝葉斯網(wǎng)絡(luò)中每個(gè)節(jié)點(diǎn)還有一個(gè)與之對(duì)應(yīng)的概率表。
???? 假設(shè)賬號(hào)是否真實(shí)和頭像是否真實(shí)有如下概率表:
???? 第一張概率表表示的是賬號(hào)是否真實(shí),因?yàn)樵摴?jié)點(diǎn)沒有父節(jié)點(diǎn),可以直接用先驗(yàn)概率來表示,表示賬號(hào)真實(shí)與否的概率。第二張概率表表示的是賬號(hào)真實(shí)性對(duì)于頭像真實(shí)性的條件概率。比如說在頭像為真實(shí)頭像的條件下,賬號(hào)為真的概率為0.88。在有了DAG和概率表之后,我們便可以利用貝葉斯公式進(jìn)行定量的因果關(guān)系推斷。假設(shè)我們已知某微博賬號(hào)使用了虛假頭像,那么其賬號(hào)為虛假賬號(hào)的概率可以推斷為:
???? 利用貝葉斯公式,我們可知在虛假頭像的情況下其賬號(hào)為虛假賬號(hào)的概率為0.345。
貝葉斯網(wǎng)絡(luò)
???? 上面的例子可以讓大家直觀的感受到貝葉斯網(wǎng)絡(luò)的作用。一個(gè)貝葉斯網(wǎng)絡(luò)通常由有向無環(huán)圖(DAG)和節(jié)點(diǎn)對(duì)應(yīng)的概率表組成。其中DAG由節(jié)點(diǎn)(node)和有向邊(edge)組成,節(jié)點(diǎn)表示特征屬性或隨機(jī)變量,有向邊表示各變量之間的依賴關(guān)系。貝葉斯網(wǎng)絡(luò)的一個(gè)重要性質(zhì)是:當(dāng)一個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn)概率分布確定之后,該節(jié)點(diǎn)條件獨(dú)立于其所有的非直接父節(jié)點(diǎn)。這個(gè)性質(zhì)方便于我們計(jì)算變量之間的聯(lián)合概率分布。
???? 一般來說,多變量非獨(dú)立隨機(jī)變量的聯(lián)合概率分布計(jì)算公式如下:
???? 當(dāng)有了上述性質(zhì)之后,該式子就可以簡化為:
???? 基于先驗(yàn)概率、條件概率分布和貝葉斯公式,我們便可以基于貝葉斯網(wǎng)絡(luò)進(jìn)行概率推斷。
基于pgmpy的貝葉斯網(wǎng)絡(luò)實(shí)現(xiàn)
???? 本節(jié)我們基于pgmpy來構(gòu)造貝葉斯網(wǎng)絡(luò)和進(jìn)行建模訓(xùn)練。pgmpy是一款基于Python的概率圖模型包,主要包括貝葉斯網(wǎng)絡(luò)和馬爾可夫蒙特卡洛等常見概率圖模型的實(shí)現(xiàn)以及推斷方法。本節(jié)使用pgmpy包來實(shí)現(xiàn)簡單的貝葉斯網(wǎng)絡(luò)。
???? 我們以學(xué)生獲得推薦信質(zhì)量這樣一個(gè)例子來進(jìn)行貝葉斯網(wǎng)絡(luò)的構(gòu)造。具體有向圖和概率表如下圖所示:
???? 考試難度、個(gè)人聰明與否都會(huì)影響到個(gè)人成績,另外個(gè)人聰明與否也會(huì)影響到SAT分?jǐn)?shù),而個(gè)人成績好壞會(huì)直接影響到推薦信的質(zhì)量。下面我們直接來用pgmpy實(shí)現(xiàn)上述貝葉斯網(wǎng)絡(luò)。
導(dǎo)入相關(guān)模塊:
from pgmpy.factors.discrete import TabularCPD from pgmpy.models import BayesianModel構(gòu)建模型框架,指定各變量之間的依賴關(guān)系:
student_model = BayesianModel([('D', 'G'),('I', 'G'),('G', 'L'),('I', 'S')])構(gòu)建各個(gè)節(jié)點(diǎn)和傳入概率表并指定相關(guān)參數(shù):
grade_cpd = TabularCPD(variable='G', # 節(jié)點(diǎn)名稱variable_card=3, # 節(jié)點(diǎn)取值個(gè)數(shù)values=[[0.3, 0.05, 0.9, 0.5], # 該節(jié)點(diǎn)的概率表[0.4, 0.25, 0.08, 0.3],[0.3, 0.7, 0.02, 0.2]],evidence=['I', 'D'], # 該節(jié)點(diǎn)的依賴節(jié)點(diǎn)evidence_card=[2, 2] # 依賴節(jié)點(diǎn)的取值個(gè)數(shù) )difficulty_cpd = TabularCPD(variable='D',variable_card=2,values=[[0.6, 0.4]] )intel_cpd = TabularCPD(variable='I',variable_card=2,values=[[0.7, 0.3]] )letter_cpd = TabularCPD(variable='L',variable_card=2,values=[[0.1, 0.4, 0.99],[0.9, 0.6, 0.01]],evidence=['G'],evidence_card=[3] )sat_cpd = TabularCPD(variable='S',variable_card=2,values=[[0.95, 0.2],[0.05, 0.8]],evidence=['I'],evidence_card=[2] )將包含概率表的各節(jié)點(diǎn)添加到模型中:
student_model.add_cpds(grade_cpd, difficulty_cpd,intel_cpd,letter_cpd,sat_cpd )獲取模型的條件概率分布:
student_model.get_cpds()獲取模型各節(jié)點(diǎn)之間的依賴關(guān)系:
student_model.get_independencies()進(jìn)行貝葉斯推斷:
from pgmpy.inference import VariableElimination student_infer = VariableElimination(student_model)prob_G = student_infer.query(variables=['G'],evidence={'I': 1, 'D': 0}) print(prob_G)???? 可見當(dāng)聰明的學(xué)生碰上較簡單的考試時(shí),獲得第一等成績的概率高達(dá)0.9。
???? 除了以上構(gòu)造貝葉斯網(wǎng)絡(luò)的方法之外,我們還可以基于pgmpy進(jìn)行數(shù)據(jù)訓(xùn)練。首先生成模擬數(shù)據(jù)并以上述的學(xué)生推薦信的模型變量進(jìn)行命名:
# 生成數(shù)據(jù) import numpy as np import pandas as pdraw_data = np.random.randint(low=0, high=2, size=(1000, 5)) data = pd.DataFrame(raw_data, columns=['D', 'I', 'G', 'L', 'S']) data.head()然后基于數(shù)據(jù)進(jìn)行模型訓(xùn)練:
# 定義模型 from pgmpy.models import BayesianModel from pgmpy.estimators import MaximumLikelihoodEstimator, BayesianEstimatormodel = BayesianModel([('D', 'G'), ('I', 'G'), ('I', 'S'), ('G', 'L')])# 基于極大似然估計(jì)進(jìn)行模型訓(xùn)練 model.fit(data, estimator=MaximumLikelihoodEstimator) for cpd in model.get_cpds():# 打印條件概率分布print("CPD of {variable}:".format(variable=cpd.variable))print(cpd)???? 以上便是基于pgmpy的貝葉斯網(wǎng)絡(luò)的簡單實(shí)現(xiàn)。關(guān)于pgmpy的更多內(nèi)容,可參考項(xiàng)目地址:
https://github.com/pgmpy/pgmpy
???? 更多內(nèi)容可參考筆者GitHub地址:
https://github.com/luwill/machine-learning-code-writing
參考資料:
pgmpy: Probabilistic Graphical Models using Python
數(shù)據(jù)挖掘?qū)д?/p>
往期精彩:
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法10:線性不可分支持向量機(jī)
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法8-9:線性可分支持向量機(jī)和線性支持向量機(jī)
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法6:感知機(jī)
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法5:決策樹之CART算法
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法4:決策樹之ID3算法
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法3:k近鄰
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法2:邏輯回歸
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法1:線性回歸
往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機(jī)器學(xué)習(xí)在線手冊(cè)深度學(xué)習(xí)筆記專輯《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機(jī)器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專輯獲取一折本站知識(shí)星球優(yōu)惠券,復(fù)制鏈接直接打開:https://t.zsxq.com/yFQV7am本站qq群1003271085。加入微信群請(qǐng)掃碼進(jìn)群:總結(jié)
以上是生活随笔為你收集整理的【机器学习基础】数学推导+纯Python实现机器学习算法12:贝叶斯网络的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【机器学习基础】数学推导+纯Python
- 下一篇: 【机器学习基础】数学推导+纯Python