【人工智能】貝葉斯網絡之MATLAB實驗

一、貝葉斯網絡基礎

首先複習一下貝頁斯公式html

例題:分別有 A、B 兩個容器,在容器 A 裏分別有 7 個紅球和 3 個白球,在容器 B 裏有 1 個紅球和 9 個白球,現已知從這兩個容器裏任意抽出了一個球,且是紅球,問這個紅球是來自容器 A 的機率是多少?node

則有:P(紅) = 8/20,P(A) = 1/2,P(紅|A) = 7/10,其中P(紅)表示總體上摸出紅球的機率,P(A)表示選中A容器的機率,P(紅|A)表示從A容器條件下摸出紅球的機率編程

按照公式,則有:網絡

P(A|紅) = P(紅|A)*P(A) / P(紅) 編輯器

= (7/10)*(1/2) / (8/20) = 0.875ide

1.一、樸素貝葉斯理論

樸素貝葉斯的思想基礎是這樣的:對於給出的待分類項,求解在此項出現的條件下各個類別出現的機率,哪一個最大,就認爲此待分類項屬於哪一個類別。 工具

 

1.二、樸素貝葉斯理論的侷限性

樸素貝葉斯理論假設各個特徵屬性條件獨立,可是實際狀況中這比較難知足,問題隨之也來了,因爲特徵屬性間存在依賴關係(如頭像是否真實與好友密度之間),使得樸素貝葉斯分類不適用了。既然這樣,須要尋找另外的解決方案。學習

也就是貝葉斯網絡字體

1.三、貝葉斯網絡

一個貝葉斯網絡定義包括一個有向無環圖(Directed Acyclic Graph )和一個條件機率表集合。人工智能

DAG中每個節點表示一個隨機變量,能夠是可直接觀測變量或隱藏變量,而有向邊表示隨機變量間的條件依賴;條件機率表中的每個元素對應DAG中惟一的節點,存儲此節點對於其全部直接前驅節點的聯合條件機率。

二、貝葉斯網絡MATLAB編程實現

2.一、環境搭建

安裝MATLAB,添加FULLBNT工具箱具體參考這裏(http://blog.sina.com.cn/s/blog_6c7b434d01013ufz.html

注意MATLAB中字體須要設置爲中文字體,才能在編輯器和命令窗口支持中文,不然漢字會顯示爲小方框

 

2.二、習題:是竊賊仍是地震

 

福爾摩斯先生在他的辦公室工做時接到了他鄰居華生的電話。華生告訴他:他的家裏可能進了竊賊,由於他家的警鈴響了

被告知有竊賊闖入,福爾摩斯迅速開車回家。在路上,他聽廣播得知他家那裏發生了地震。地震也有可能引發警報。這樣,請問福爾摩斯先生應該回家抓賊仍是迅速撤離該地區以躲避地震?

條件以下

題目分析:

簡單講,在路上的holmes須要判斷是盜賊仍是地震致使警鈴?若是是前者,他須要回去抓賊,如果後者,則要逃離地震區。

因此圖中雖然有5個節點,地震並不100%致使警鈴,警鈴也不100%致使華生的信號。

可是咱們在獲得信號,聽到警鈴的狀況下,能夠經過計算盜賊致使警鈴的機率p1,和地震致使警鈴的機率pp1來進行決策,也能夠計算在地震發生條件下,盜賊致使警鈴的機率p2。

若是p2比p1小,說明新添加的條件E纔是致使A的主要緣由。

2.三、具體實現以下

%一、創建貝葉斯網絡結構
N = 3; %三個節點,分別是B、E、A
dag = zeros(N,N);
B = 1; E = 2; A = 3; 
%節點之間的鏈接關係
dag(B,A) = 1;
dag(E,A) = 1; 
discrete_nodes = 1:N; %離散節點
node_sizes = 2*ones(1,N);%節點狀態數
bnet =mk_bnet(dag,node_sizes,'names',{ 
    'BB','EE','AAA'
    },'discrete',discrete_nodes);
bnet.CPD{B} = tabular_CPD(bnet,B,[0.9 0.1]);%手動輸入的條件機率
bnet.CPD{E} = tabular_CPD(bnet,E,[0.99 0.01]);
bnet.CPD{A} = tabular_CPD(bnet,A,[0.99 0.1 0.1 0.01 0.01 0.9 0.9 0.99]);
%二、畫出建好的貝葉斯結構
draw_graph(dag);
%三、使用聯合樹引擎對貝葉斯網絡進行推斷
engine = jtree_inf_engine(bnet);
%四、求解邊緣分佈假設,
%咱們要計算盜竊致使響鈴的機率
evidence = cell(1,N);
evidence{A} = 2;
[engine, loglik] = enter_evidence(engine, evidence);
marg = marginal_nodes(engine, B);
p1 = marg.T(2);%算出p1=0.8412
%如今咱們添加地震的證據觀察它有什麼不一樣
evidence{E} = 2;
[engine, loglik] = enter_evidence(engine, evidence);
marg = marginal_nodes(engine, B);
p2 = marg.T(2);%算出p2=0.1089
%結論是地震更能解釋響鈴這個主要事實

%聯合機率分佈
evidence = cell(1,N);
[engine, ll] = enter_evidence(engine, evidence);
m = marginal_nodes(engine, [B E A]);

建好的貝葉斯網絡

接下來添加R和W節點

2.四、修改上述代碼

%一、創建貝葉斯網絡結構
N = 5; %三個節點,分別是B、E、A、R、W
%分別表明盜賊、地震、警鈴、廣播、華生致電holmes;
dag = zeros(N,N);
B = 1; E = 2; A = 3; 
R = 4; W=5;
%節點之間的鏈接關係
dag(B,A) = 1;
dag(E,A) = 1; 
dag(E,R) = 1;
dag(A,W) = 1;
discrete_nodes = 1:N; %離散節點
node_sizes = 2*ones(1,N);%節點狀態數
bnet =mk_bnet(dag,node_sizes,'names',{ 
    ' BB','EE','AAA','RR','WWW'
    },'discrete',discrete_nodes);
bnet.CPD{B} = tabular_CPD(bnet,B,[0.9 0.1]);%手動輸入的條件機率
bnet.CPD{E} = tabular_CPD(bnet,E,[0.99 0.01]);
bnet.CPD{A} = tabular_CPD(bnet,A,[0.99 0.1 0.1 0.01 0.01 0.9 0.9 0.99]);
bnet.CPD{R} = tabular_CPD(bnet,R,[0.999 0.01 0.001 0.99]);
%機率表輸入順序:本節點狀態不變,條件變化……
bnet.CPD{W} = tabular_CPD(bnet,W,[0.99 0.35 0.01 0.65]);
%二、畫出建好的貝葉斯結構
draw_graph(dag);
%三、使用聯合樹引擎對貝葉斯網絡進行推斷
engine = jtree_inf_engine(bnet);
%四、求解邊緣分佈假設,
%咱們要計算盜竊致使響鈴的機率
evidence = cell(1,N);
evidence{A} = 2;
[engine, loglik] = enter_evidence(engine, evidence);
marg = marginal_nodes(engine, B);
p1 = marg.T(2);%算出p1=0.8412
%如今咱們添加地震的證據觀察它有什麼不一樣
evidence{E} = 2;
[engine, loglik] = enter_evidence(engine, evidence);
marg = marginal_nodes(engine, B);
p2 = marg.T(2);%算出p2=0.1089
%結論是地震更能解釋響鈴這個主要事實

%聯合機率分佈
evidence = cell(1,N);
[engine, ll] = enter_evidence(engine, evidence);
m = marginal_nodes(engine, [B E A]);

建好的貝葉斯網絡

運行結果也可看出R、W節點對決策無影響

2.五、關於【參數學習】的內容請參考下一篇:

【人工智能】貝葉斯網絡之參數學習

三、參考資料

1. Matlab BNS 使用:

http://wenku.baidu.com/view/379405dcd15abe23482f4d1c

2. matlab使用FULLBNT工具箱實現貝葉斯網絡(草地潮溼分析,本文代碼在其基礎上修改):

http://blog.sina.com.cn/s/blog_6c7b434d01013ufz.html

3. 是竊賊仍是地震原題:

http://wenku.baidu.com/link?url=dcjcmeIeweM3k9POWLauPYqjnCJvCSNQthCZefv71M8cOexAPeH0-pi44oy_g1KxTyC8nZSvbB0UYR2hRjN-OEz3oFn4o3UA1IDyFMmU92a

4.  從貝葉斯方法談到貝葉斯網絡

5. 貝頁斯公式:http://baike.baidu.com/view/541856.htm

相關文章
相關標籤/搜索