生活随笔
收集整理的這篇文章主要介紹了
贝叶斯网络经典matlab源代码解析
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
感謝貝葉斯網(wǎng)學(xué)習(xí)筆記
問題是這樣描述的:
福爾摩斯先生在他的辦公室工作時接到了他鄰居華生的電話。華生告訴他:他的家里可能進了竊賊,
因為他家的警鈴響了被告知有竊賊闖入,福爾摩斯迅速開車回家。在路上,他聽廣播得知他家那里
發(fā)生了地震。地震也有可能引起警報。這樣,請問福爾摩斯先生應(yīng)該回家抓賊還是迅速撤離該地區(qū)
以躲避地震?
簡單講,在路上的holmes需要判斷是盜賊還是地震導(dǎo)致警鈴?如果是前者,他需要回去抓賊,若是后者,則要逃離地震區(qū)。
所以圖中雖然有5個節(jié)點,地震并不100%導(dǎo)致警鈴,警鈴也不100%導(dǎo)致華生的信號。
但是我們在得到信號,聽到警鈴的情況下,可以通過計算盜賊導(dǎo)致警鈴的概率p1,和地震導(dǎo)致警鈴的概率pp1來進行決策,也可以計算在地震發(fā)生條件下,盜賊導(dǎo)致警鈴的概率p2。
- P1表示在聽到警鈴的條件下,盜賊導(dǎo)致警鈴響的概率
- PP1表示在聽到警鈴的條件下,地震導(dǎo)致警鈴響的概率PP1
- P2,在地震發(fā)生的條件下,盜賊導(dǎo)致警鈴發(fā)生的概率。
如果p2比p1小,說明地震E才是導(dǎo)致A的主要原因。
反過來,如果P2和P1相同,說明地震這個新添加的條件,對警報沒有作用。
添加地震這個條件之后,還是盜賊的概率變小了,說明地震對警報是有影響的。
用用圖像描述如下:
圖片來源于realsa,表示感謝。
==注意:==節(jié)點的狀態(tài)是自己定義的,false = state 1 true = state 2,此處與jbb0523的理解剛好相反。
以下是源代碼分析
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%1、建立貝葉斯網(wǎng)絡(luò)結(jié)構(gòu)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
N
= 3; %三個節(jié)點,分別是B、E、A
dag
= zeros
(N
,N
);%建立一個N
*N的
0矩陣
B
= 1; E
= 2; A
= 3; %
%節(jié)點之間的連接關(guān)系
dag
(B
,A
) = 1;%存在B指向A的邊
dag
(E
,A
) = 1; %存在E指向A的邊
discrete_nodes
= 1:N
; %離散節(jié)點
node_sizes
= 2*ones
(1,N
);%節(jié)點狀態(tài)數(shù)node_sizes的內(nèi)容為
[2,2,2]
bnet
=mk_bnet
(dag
,node_sizes
,'names',{ 'BB','EE','AAA'},'discrete',discrete_nodes
);
%name后面的
{}里面給出了各個節(jié)點的別名
%
% false
= state
1 true
= state
2,此處與
[jbb0523
](https
://blog
.csdn
.net
/jbb0523
/article
/details
/79438092)的理解剛好相反
bnet
.CPD
{B
} = tabular_CPD
(bnet
,B
,[0.9 0.1]);%手動輸入的條件概率 入室盜竊發(fā)生的概率true
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]);
%利用tabular_CPD設(shè)置各個變量的邊緣概率,對于B和E,定義順序是
False True;
%對于T、L和B這類,順序是FF FT TF TT;
%對于D這類,順序是FFF FFT FTF FTT TFF TFT TTF TTT
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%2、畫出建好的貝葉斯結(jié)構(gòu)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
draw_graph
(dag
);%畫圖
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%3、使用聯(lián)合樹引擎對貝葉斯網(wǎng)絡(luò)進行推斷
engine
= jtree_inf_engine
(bnet
);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%4、求解邊緣分布假設(shè)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%我們要計算盜竊導(dǎo)致響鈴的概率
%P1
=P
(B
|A
)
evidence
= cell
(1,N
);%創(chuàng)建一個
1*n的空的矩陣
evidence
{A
} = 2; % %這里
1是false
,2是
True,等于讓A是
True.%C
{s
}使用這種
"{}"形式的返回的是cell中的內(nèi)容
[engine
, loglik
] = enter_evidence
(engine
, evidence
);
marg
= marginal_nodes
(engine
, B
); %P1
=P
(B
|A
)
p1
= marg
.T
(2);%算出p1
=0.8412 P1
%現(xiàn)在我們添加地震的證據(jù)觀察它有什么不同P2
=P
(B
|A
,E
)
evidence
{E
} = 2;% %這里
1是false
,2是
True,等于讓E是
True.
[engine
, loglik
] = enter_evidence
(engine
, evidence
);%loglik對數(shù)似然
marg
= marginal_nodes
(engine
, B
);
p2
= marg
.T
(2);%算出p2
=0.1089
%結(jié)論是地震更能解釋響鈴這個主要事實
%聯(lián)合概率分布
%P( B
=True|A
=True,E
=True)
evidence
= cell
(1,N
);
evidence
{A
} = 2;
evidence
{E
} = 2;
[engine
, ll
] = enter_evidence
(engine
, evidence
);%ll
m
= marginal_nodes
(engine
, [B E A
]);
[engine, ll] = enter_evidence(engine, evidence);里面是LL不是1,也有人選擇loglik,不過也有人直接把這兩個都去掉,但是結(jié)果是相同的,不知道是什么原因。
CPT表如何排列
m的結(jié)果如何輸出,m的結(jié)果如何解讀,是下一步的重點。
總結(jié)
以上是生活随笔為你收集整理的贝叶斯网络经典matlab源代码解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。