日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

贝叶斯网学习笔记(一)

發(fā)布時間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 贝叶斯网学习笔记(一) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、貝葉斯網(wǎng)絡(luò)基礎(chǔ)

首先復(fù)習(xí)一下貝葉斯公式

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

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

按照公式,則有:P(A|) = P(|A)*P(A) / P()?= (7/10)*(1/2) / (8/20) = 0.875

1.1、樸素貝葉斯理論

樸素貝葉斯的思想基礎(chǔ)是這樣的:對于給出的待分類項(xiàng),求解在此項(xiàng)出現(xiàn)的條件下各個類別出現(xiàn)的概率,哪個最大,就認(rèn)為此待分類項(xiàng)屬于哪個類別。?

1.2、樸素貝葉斯理論的局限性

樸素貝葉斯理論假設(shè)各個特征屬性條件獨(dú)立,但是實(shí)際情況中這比較難滿足,問題隨之也來了,由于特征屬性間存在依賴關(guān)系(如頭像是否真實(shí)與好友密度之間),使得樸素貝葉斯分類不適用了。既然這樣,需要尋找另外的解決方案。也就是貝葉斯網(wǎng)絡(luò)

1.3、貝葉斯網(wǎng)絡(luò)

一個貝葉斯網(wǎng)絡(luò)定義包括一個有向無環(huán)圖(Directed AcyclicGraph )和一個條件概率表集合。

DAG中每一個節(jié)點(diǎn)表示一個隨機(jī)變量,可以是可直接觀測變量或隱藏變量,而有向邊表示隨機(jī)變量間的條件依賴;條件概率表中的每一個元素對應(yīng)DAG中唯一的節(jié)點(diǎn),存儲此節(jié)點(diǎn)對于其所有直接前驅(qū)節(jié)點(diǎn)的聯(lián)合條件概率。

2、貝葉斯網(wǎng)絡(luò)MATLAB編程實(shí)現(xiàn)

2.1、環(huán)境搭建

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

注意MATLAB中字體需要設(shè)置為中文字體,才能在編輯器和命令窗口支持中文,否則漢字會顯示為小方框

2.2、習(xí)題:是竊賊還是地震

福爾摩斯先生在他的辦公室工作時接到了他鄰居華生的電話。華生告訴他:他的家里可能進(jìn)了竊賊,因?yàn)樗业木忢懥?/span>

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

條件如下

題目分析:

簡單講,在路上的holmes需要判斷是盜賊還是地震導(dǎo)致警鈴?如果是前者,他需要回去抓賊,若是后者,則要逃離地震區(qū)。

所以圖中雖然有5個節(jié)點(diǎn),地震并不100%導(dǎo)致警鈴,警鈴也不100%導(dǎo)致華生的信號。

但是我們在得到信號,聽到警鈴的情況下,可以通過計(jì)算盜賊導(dǎo)致警鈴的概率p1,和地震導(dǎo)致警鈴的概率pp1來進(jìn)行決策,也可以計(jì)算在地震發(fā)生條件下,盜賊導(dǎo)致警鈴的概率p2。

如果p2p1小,說明新添加的條件E才是導(dǎo)致A的主要原因。

2.3、具體實(shí)現(xiàn):

%1、建立貝葉斯網(wǎng)絡(luò)結(jié)構(gòu) N = 3; %三個節(jié)點(diǎn),分別是B、E、A dag = zeros(N,N); B = 1; E = 2; A = 3; %節(jié)點(diǎn)之間的連接關(guān)系 dag(B,A) = 1; dag(E,A) = 1; discrete_nodes = 1:N; %離散節(jié)點(diǎn) node_sizes = 2*ones(1,N);%節(jié)點(diǎn)狀態(tài)數(shù) 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]); %2、畫出建好的貝葉斯結(jié)構(gòu)draw_graph(dag);%3、使用聯(lián)合樹引擎對貝葉斯網(wǎng)絡(luò)進(jìn)行推斷 engine = jtree_inf_engine(bnet); %4、求解邊緣分布假設(shè), %我們要計(jì)算盜竊導(dǎo)致響鈴的概率 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 %現(xiàn)在我們添加地震的證據(jù)觀察它有什么不同 evidence{E} = 2; [engine, loglik] = enter_evidence(engine, evidence); marg = marginal_nodes(engine, B); p2 = marg.T(2);%算出p2=0.1089 %結(jié)論是地震更能解釋響鈴這個主要事實(shí) %聯(lián)合概率分布 evidence = cell(1,N); [engine, ll] = enter_evidence(engine, evidence); m = marginal_nodes(engine, [B E A]);

1.???? 建好的貝葉斯網(wǎng)絡(luò)

接下來添加RW節(jié)點(diǎn)

2.4、修改上述代碼

%1、建立貝葉斯網(wǎng)絡(luò)結(jié)構(gòu) N = 5; %三個節(jié)點(diǎn),分別是B、E、A、R、W %分別代表盜賊、地震、警鈴、廣播、華生致電holmes; dag = zeros(N,N); B = 1; E = 2; A = 3; R = 4; W=5; %節(jié)點(diǎn)之間的連接關(guān)系 dag(B,A) = 1; dag(E,A) = 1; dag(E,R) = 1; dag(A,W) = 1; discrete_nodes = 1:N; %離散節(jié)點(diǎn) node_sizes = 2*ones(1,N);%節(jié)點(diǎn)狀態(tài)數(shù) 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]); %概率表輸入順序:本節(jié)點(diǎn)狀態(tài)不變,條件變化…… bnet.CPD{W} = tabular_CPD(bnet,W,[0.99 0.35 0.01 0.65]); %2、畫出建好的貝葉斯結(jié)構(gòu) draw_graph(dag); %3、使用聯(lián)合樹引擎對貝葉斯網(wǎng)絡(luò)進(jìn)行推斷 engine = jtree_inf_engine(bnet); %4、求解邊緣分布假設(shè), %我們要計(jì)算盜竊導(dǎo)致響鈴的概率 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 %現(xiàn)在我們添加地震的證據(jù)觀察它有什么不同 evidence{E} = 2; [engine, loglik] = enter_evidence(engine, evidence); marg = marginal_nodes(engine, B); p2 = marg.T(2);%算出p2=0.1089 %結(jié)論是地震更能解釋響鈴這個主要事實(shí) %聯(lián)合概率分布 evidence = cell(1,N); [engine, ll] = enter_evidence(engine, evidence); m = marginal_nodes(engine, [B E A]);

運(yùn)行結(jié)果也可看出R、W節(jié)點(diǎn)對決策無影響

3、BNT參數(shù)、結(jié)構(gòu)學(xué)習(xí)

Bayesian 網(wǎng)絡(luò)學(xué)習(xí)指的是通過分析數(shù)據(jù)兒獲得Bayesian網(wǎng)的過程,它包括以下兩種情況

①參數(shù)學(xué)習(xí):已知網(wǎng)絡(luò)結(jié)構(gòu),確定網(wǎng)絡(luò)參數(shù)。

②結(jié)構(gòu)學(xué)習(xí):既要確定網(wǎng)絡(luò)結(jié)構(gòu),又要確定網(wǎng)絡(luò)參數(shù)。

我們可以一個貝葉斯網(wǎng)絡(luò)看作一個黑箱,那參數(shù)學(xué)習(xí),結(jié)構(gòu)學(xué)習(xí)就是創(chuàng)造一個白箱{可能是我造的名詞}盡可能模擬這個黑箱!

在前面的基礎(chǔ)之上,我們可以輕松畫出貝葉斯網(wǎng)絡(luò)bnet{!當(dāng)然,其每個節(jié)點(diǎn)的CPT都是題目給出的}。經(jīng)過bnet處理之后的樣本數(shù)據(jù)會輸出得到訓(xùn)練數(shù)據(jù)data

在①情況下,構(gòu)建一個和bnet節(jié)點(diǎn)個數(shù),箭頭指向相同的bnet1,接著借助BNT中的工具,將databnet1作為參數(shù),就可以學(xué)習(xí)得到新的貝葉斯網(wǎng)絡(luò)bnet2

在②情況下,借助BNT中的工具,將data和其他數(shù)據(jù){!具體參數(shù)見代碼}作為參數(shù),便可學(xué)習(xí)得到新的貝葉斯網(wǎng)絡(luò)bnet3

接下來使用如下語句便可以方便的輸出一個貝葉斯網(wǎng)絡(luò)中各個節(jié)點(diǎn)的CPT{!第一節(jié)輸出CPT的方法容易理解但有些繁瑣}

%輸出bnet的CPT CPT = cell(1,N); for i=1:Ns=struct(bnet.CPD{i});CPT{i}=s.CPT; end dispcpt(CPT{1}) dispcpt(CPT{2}) dispcpt(CPT{3}) dispcpt(CPT{4}) dispcpt(CPT{5})

詳見代碼

%這里使用的例子依然是“福爾摩斯模型”。 %首先我先如上面實(shí)驗(yàn)?zāi)菢咏⒑秘惾~斯網(wǎng)bnet,并手動構(gòu)造條件概率表CPT。 %然后使用BNT里的函數(shù)sample_bnet(bnet)來產(chǎn)生nsamples個數(shù)據(jù)樣本, %nsamples分別取值20,200,2000。 %然后,再重新建立一個不知道條件概率表的貝葉斯網(wǎng)bnet2(結(jié)構(gòu)和bnet相同), %并把得到的樣本作為訓(xùn)練集代入learn_params()函數(shù)進(jìn)行學(xué)習(xí), %把學(xué)習(xí)到的條件概率表CPT2與手動構(gòu)造的CPT進(jìn)行了比較。參數(shù)學(xué)習(xí)部分代碼:clc; clear; %1、構(gòu)造樣本數(shù)據(jù)data nsamples = 2000; samples = cell(N, nsamples); for i = 1:nsamplessamples(:,i) = sample_bnet(bnet); end data = cell2num(samples);%2、手動構(gòu)造和bnet結(jié)構(gòu)相同的bnet1 bnet1 = mk_bnet(dag,node_sizes,'discrete',discrete_nodes); seed = 0; rand('state',seed); bnet1.CPD{B} = tabular_CPD(bnet2,B); bnet1.CPD{E} = tabular_CPD(bnet2,E); bnet1.CPD{W} = tabular_CPD(bnet2,W); bnet1.CPD{R} = tabular_CPD(bnet2,R); bnet1.CPD{A} = tabular_CPD(bnet2,A); %參數(shù)學(xué)習(xí)得到新的貝葉斯網(wǎng)絡(luò)bnet2 bnet2 = learn_params(bnet1,data);%3、結(jié)構(gòu)學(xué)習(xí) order=[1 2 3 4 5]; ns=[2 2 2 2 2]; max_fan_in=2; %結(jié)構(gòu)學(xué)習(xí)函數(shù) dag2 = learn_struct_K2(data ,ns, order,'max_fan_in', max_fan_in); figure draw_graph(dag2); bnet3=mk_bnet(dag2,ns,'discrete',order);

利用輸出語句CPT的語句可以得到

原貝葉斯網(wǎng)絡(luò)bnetCPT

1 : 0.9000 2 : 0.1000 1 : 0.9900 2 : 0.0100 1 1 : 0.9900 0.0100 2 1 : 0.1000 0.9000 1 2 : 0.1000 0.9000 2 2 : 0.0100 0.9900 1 : 0.9990 0.0010 2 : 0.0100 0.9900 1 : 0.9900 0.0100 2 : 0.3500 0.6500

新貝葉斯網(wǎng)絡(luò)bnet2CPT

1 : 0.9030 2 : 0.0970 1 : 0.9890 2 : 0.0110 1 1 : 0.9888 0.0112 2 1 : 0.0990 0.9010 1 2 : 0.1500 0.8500 2 2 : 0.0000 1.0000 1 : 0.9995 0.0005 2 : 0.0000 1.0000 1 : 0.9877 0.0123 2 : 0.3302 0.6698

和(http://my.oschina.net/SnifferApache/blog/343756#OSC_h2_7)所示的條件概率表相比,相差無幾

新貝葉斯網(wǎng)絡(luò)bnet3CPT

Referenceto non-existent field 'CPT'.

shit,只能用第一節(jié)中的舊方法了……

engine2 = jtree_inf_engine(bnet3); %新證據(jù) evidence2 = cell(1,N); [engine2, loglike] = enter_evidence(engine2, evidence2);%計(jì)算節(jié)點(diǎn)B的CPT marg2 = marginal_nodes(engine2,B); marg2.T %計(jì)算節(jié)點(diǎn)E的CPT marg2 = marginal_nodes(engine2,E); marg2.T %計(jì)算節(jié)點(diǎn)W的CPT marg2 = marginal_nodes(engine2,[W A]); marg2.T %計(jì)算節(jié)點(diǎn)R的CPT marg2 = marginal_nodes(engine2,[R E]); marg2.T %計(jì)算節(jié)點(diǎn)A的CPT marg2 = marginal_nodes(engine2,[A B E]); marg2.T

輸出如下

Error usingjtree_inf_engine/enter_evidence (line 55)

must define CPD 1

事實(shí)證明結(jié)構(gòu)學(xué)習(xí)得到的bnet3不包含CPT字段,導(dǎo)致無法計(jì)算CPT,此處挖坑待高人解答吧。

{!補(bǔ)充:BNT中參數(shù)學(xué)習(xí)函數(shù):

?最大似然性估計(jì)learn_params() ;

?貝葉斯方法bayes_update_params() 。

結(jié)構(gòu)學(xué)習(xí)函數(shù):

?K2算法learn_struct_K2() ;

?貪婪搜索GS(GreedySearch) 算法learn_struct_gs()

?爬山HC ( HillClimbing) 算法learn_struct_hc() 。

BNT提供的多種推理引擎:

?聯(lián)合樹推理引擎jtree_inf_engine();

?全局聯(lián)合樹推理引擎global_joint_inf_engine();

?.信念傳播推理引擎belprop_inf_engine();

?變量消元推理引擎var_elim_inf_engine()

}

4、兩道人工智能練習(xí)題

4.1、試采用matlab的貝葉斯工具箱BNT完成以下過勞死問題的建模。要求代碼中使用BNT工具箱中的貝葉斯結(jié)構(gòu)、參數(shù)學(xué)習(xí)命令。給出網(wǎng)絡(luò)學(xué)習(xí)代碼及運(yùn)行結(jié)果。

僅供參考

clear; clc N=5; %構(gòu)造網(wǎng)絡(luò)結(jié)構(gòu) dag=zeros(N,N); C=1;U=2;W=3;B=4;D=5; dag(C,U)=1; dag(U,[W,B])=1; dag([W,B],D)=1; discrete_nodes=1:N; node_sizes=2*ones(1,N); bnet=mk_bnet(dag,node_sizes,'names',{'country','university','workhard','badbody','die'},'discrete',discrete_nodes); %構(gòu)造概率表 bnet.CPD{C}= tabular_CPD(bnet,C,[0.5,0.5]); bnet.CPD{U}= tabular_CPD(bnet,U,[0.99,0.05,0.01,0.95]); bnet.CPD{W}= tabular_CPD(bnet,W,[0.95,0.10,0.05,0.90]); bnet.CPD{B}= tabular_CPD(bnet,B,[0.99,0.70,0.01,0.30]); bnet.CPD{D}= tabular_CPD(bnet,D,[1.00,0.95,0.70,0.665,0.00,0.05,0.30,0.335]); figure draw_graph(dag);%輸出bnet的CPT CPT = cell(1,N); for i=1:Ns=struct(bnet.CPD{i});CPT{i}=s.CPT; end dispcpt(CPT{1}) dispcpt(CPT{2}) dispcpt(CPT{3}) dispcpt(CPT{4}) dispcpt(CPT{5}) %輸出結(jié)束engine=jtree_inf_engine(bnet); evidence=cell(1,N); engine=enter_evidence(engine,evidence); %計(jì)算節(jié)點(diǎn)C的CPT marg=marginal_nodes(engine,C); marg.T %計(jì)算節(jié)點(diǎn)D的CPT evidence{W}=2; evidence{B}=2; [engine,loglik]=enter_evidence(engine,evidence); marg1=marginal_nodes(engine,[W B D]); marg1.T(2)%構(gòu)造樣本數(shù)據(jù) nsamples=2000; samples=cell(N,nsamples); for i=1:nsamplessamples(:,i)=sample_bnet(bnet); end data=cell2num(samples); bnet1=mk_bnet(dag,node_sizes,'discrete',discrete_nodes); %手動構(gòu)造條件概率表CPT seed=0; rand('state',seed); bnet1.CPD{C}=tabular_CPD(bnet1,C); bnet1.CPD{U}=tabular_CPD(bnet1,U); bnet1.CPD{W}=tabular_CPD(bnet1,W); bnet1.CPD{B}=tabular_CPD(bnet1,B); bnet1.CPD{D}=tabular_CPD(bnet1,D); %進(jìn)行參數(shù)學(xué)習(xí) bnet2=learn_params(bnet1,data); %驗(yàn)證學(xué)習(xí)結(jié)果 engine2=jtree_inf_engine(bnet2); evidence2=cell(1,N); engine2=enter_evidence(engine2,evidence2); %計(jì)算節(jié)點(diǎn)C的CPT marg=marginal_nodes(engine2,C); marg.T %計(jì)算節(jié)點(diǎn)D的CPT evidence2{W}=2; evidence2{B}=2; [engine2,ll]=enter_evidence(engine2,evidence2); m=marginal_nodes(engine2,[W B D]); m.T(2) %結(jié)構(gòu)學(xué)習(xí) order=[1 2 3 4 5]; ns=[2 2 2 2 2]; max_fan_in=2; %結(jié)構(gòu)學(xué)習(xí)函數(shù) dag2 = learn_struct_K2(data ,ns, order,'max_fan_in', max_fan_in); figure draw_graph(dag2); bnet3=mk_bnet(dag2,ns,'discrete',order);

4.2、試采用核函數(shù)方法對下列數(shù)據(jù)進(jìn)行非線性分類。給出matlab具體代碼,及采用訓(xùn)練樣本進(jìn)行測試得到的準(zhǔn)確率結(jié)果。? ?

???????x=[0 1 0 1 2 -1];

???????y=[0 0 1 1 2 -1];

???????z=[-1 1 1 -1 1 1;

??????其中,(x,y)代表二維的數(shù)據(jù)點(diǎn),z 表示相應(yīng)點(diǎn)的類型屬性。

僅供參考

clc; clear; %手工錄入+1類和-1類的數(shù)據(jù) sp = [1,0; 0,1; 2,2; -1,-1] %positive sn = [0,0; 1,1;]%negative data = [sp;sn] datalabel=[1 1 1 1 0 0]; %分類 %groups為logical類型 groups = ismember(datalabel,1); %交叉標(biāo)記data為train和test兩部分 [train,test]=crossvalind('holdOut',groups); %核函數(shù) mlp,預(yù)測準(zhǔn)確率為0.3 svmStruct=svmtrain(data(train,:),groups(train),'kernel_function','mlp','showplot',true); %預(yù)測準(zhǔn)確率為0 %svmStruct2=svmtrain(data,groups,'kernel_function','mlp','showplot',true); %加入?yún)?shù)[0.5 -0.5]之后,預(yù)測準(zhǔn)確率為0.6 svmStruct3 = svmtrain(data,groups,'kernel_function','mlp','mlp_params',[0.5 -0.5],'showplot',true);title(sprintf('核函數(shù)')) cp=classperf(groups);%用來評價分類器 classes = svmclassify(svmStruct3,data(test,:),'showplot',true); classperf(cp,classes,test); cp.CorrectRate

5、參考資料

[1]貝葉斯網(wǎng)絡(luò)-使用MATLAB工具集,http://www.cnblogs.com/xjx-user/archive/2013/04/14/3020273.html

6、貝葉斯網(wǎng)絡(luò)簡述

* Bayes Net最初的目的是給一個專家系統(tǒng)增加概率。

6.1網(wǎng)絡(luò)構(gòu)造

在實(shí)際中,變量之間可能存在依賴關(guān)系。貝葉斯網(wǎng)絡(luò)提供一種因果關(guān)系的圖形模型,訓(xùn)練后的貝葉斯網(wǎng)絡(luò)可以用于分類。

Bayes Net由兩部分組成,有向無環(huán)圖(DAG,directed acyclic graph)和條件概率表(CPT,conditionalprobabilitydistribution tabular)。

Dag中每個節(jié)點(diǎn)表示一個隨機(jī)變量,變量可以是離散的也可以連續(xù),每條邊表示一個概率依賴。如A---B有一條邊,則ABparentsBA的后代。給定parents,每個變量條件獨(dú)立于圖中它的非后代。

對每個變量,Bayes Net提供一個條件概率表(CPT)。

6.2訓(xùn)練網(wǎng)絡(luò)

Bayes Net訓(xùn)練包括兩部分,網(wǎng)絡(luò)拓?fù)浜途W(wǎng)絡(luò)參數(shù)。

網(wǎng)絡(luò)拓?fù)淇梢匀斯?gòu)造,或數(shù)據(jù)導(dǎo)出。

網(wǎng)絡(luò)變量可以使可觀測的或隱藏的。(可觀測意思是可以直接給出變量值)

如果網(wǎng)絡(luò)拓?fù)湟恢?#xff0c;變量可觀測,則訓(xùn)練網(wǎng)絡(luò)參數(shù)就是計(jì)算CPT表目。與樸素貝葉斯分類的概率計(jì)算類似。

## How to use the Bayes Network Toolbox

定義一個Bayes網(wǎng)絡(luò),要確定兩點(diǎn),網(wǎng)絡(luò)結(jié)構(gòu)和參數(shù)。

教程地址:http://www.cs.ubc.ca/~murphyk/Software/BNT/usage.html#inference

1.構(gòu)造Bayes Net

Bayes Net是一個有向非循環(huán)圖(directed acyclicgraph-dag),我們用鄰接矩陣來表示一個dag。

* 對節(jié)點(diǎn)標(biāo)記順序,父節(jié)點(diǎn)序號在子節(jié)點(diǎn)之前。

* 如果節(jié)點(diǎn)的取值是離散的,那么節(jié)點(diǎn)的大小就是總共可以取值的數(shù)目

???????discrete_nodes=1:N; %標(biāo)注那些節(jié)點(diǎn)是離散的,這里就是1:N的都是離散的

???????node_sizes=2*ones(1,N); %node_sizes(i) 是節(jié)點(diǎn) i 可以取得值的數(shù)目,在這個例子中,每個節(jié)點(diǎn)都只有兩個取值

* 構(gòu)造BN可以用如下命令:

??????? bnet=mk_bnet(dag,node_sizes)

* 如果可以確定哪個變量(節(jié)點(diǎn))是可以觀察到的,使用下面的代碼。如果沒有,可以空缺

??????? onodes=[];

???????bnet=mk_bnet(dag,node_sizes,'discrete',discrete_nodes,onodes);

* 可選參數(shù)

??????? 'names' 一個cell向量,對于每個節(jié)點(diǎn)的名字

???????bnet=mk_bnet(dag,node_sizes,'names',{'A','B','C'},'discrete',1:3);

2. 網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)學(xué)習(xí)

1. 中,我們假設(shè)已知網(wǎng)絡(luò)的拓?fù)浣Y(jié)構(gòu),因此可以直接構(gòu)造網(wǎng)絡(luò)。但如果我們不知道網(wǎng)絡(luò)的拓?fù)?#xff0c;那么就需要對拓?fù)浣Y(jié)構(gòu)進(jìn)行學(xué)習(xí)。

* 在網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)學(xué)習(xí)中,有兩個主要的路線

1. 基于約束條件的學(xué)習(xí):將網(wǎng)絡(luò)全連接,然后去掉條件獨(dú)立的邊

2. 搜索打分學(xué)習(xí):在可能的DAGs空間中搜索,對每個進(jìn)行打分

* 但是要注意,可能的DAG非常之多,是隨節(jié)點(diǎn)數(shù)目指數(shù)級增長的。

* 如果節(jié)點(diǎn)數(shù)比較小(小于等于6個)可以用暴力搜索,因?yàn)?/span>6個節(jié)點(diǎn)的DAG共有3781503個(7個節(jié)點(diǎn)的話就是10^9數(shù)量級個)。

???????dags=mk_all_dags(N);

???????score=score_dags(data,ns,dags);

??????? % data(i,m)是節(jié)點(diǎn)i在第mcase中的取值ns(i)是節(jié)點(diǎn)i的大小

K2 algorithm

如果我們知道所有節(jié)點(diǎn)的順序,那么就可以獨(dú)立的給每個節(jié)點(diǎn)選擇它們的父節(jié)點(diǎn)

K2是一種貪婪搜索算法。一開始每個節(jié)點(diǎn)都沒有父節(jié)點(diǎn),然后逐漸添加父節(jié)點(diǎn),每個新添加的都是使得當(dāng)前分?jǐn)?shù)最大增加的。

???????dag=learn_struct_K2(data,node_sizes,order)

??????? 其中 order 是節(jié)點(diǎn)的順序信息,父節(jié)點(diǎn)要在子節(jié)點(diǎn)前

3.Bayes Net的參數(shù)

參數(shù)用CPDobjects(CPD=Conditional Probability Distribution)表示。CPD表示給定父節(jié)點(diǎn)時,該節(jié)點(diǎn)的概率分布。當(dāng)所有節(jié)點(diǎn)的取值都是離散的時候,CPD可以用一個table來表示。即為CPTs (Tabular CPDs)

* Tabular CPDs(扁平化的CPD)成為CPTs

CPT是一個多維向量,比如節(jié)點(diǎn)A有兩個父節(jié)點(diǎn)C,D,那么ACPT就是4個維度,第三個維度為A的取值可能,第四個維度是每種取值的概率。

* 工具箱中默認(rèn)定義:false==1,true==2,在對參數(shù)賦值中應(yīng)該保持一致性。

如果已知CPD,構(gòu)造CPT的函數(shù)是

???????bnet.CPD{A}=tabular_CPD(bnet,A,[a1,a2,a3,a4...]);

4.CPD

CPD的定義是:P(X(i)|X(Pa(i)))X(Pa(i))是節(jié)點(diǎn)i的父節(jié)點(diǎn),CPDnodei的父節(jié)點(diǎn)發(fā)生的情況下i發(fā)生的概率。

學(xué)習(xí)CPD

已有12個參數(shù)的BN,網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)dag

如果我們不指定CPT,那么算法會構(gòu)造隨機(jī)參數(shù),每一列CPT會從均勻分布中提取。

???????

bnet=mk_bnet(dag,node_sizes);seed=0;%為了保證實(shí)驗(yàn)的可重復(fù)性rand('state',seed);for i=1:12bnet.CPD{i}=tabular_CPD(bnet,i);endbnet2=learn_params(bnet,data);%參數(shù)學(xué)習(xí)完畢f(xié)or i=1:12s=struct(bnet2.CPD{i});%展示參數(shù)CPT3{i}=s.CPT;enddispcpt(CPT3{1})%展示第一個node的參數(shù)

5.Inference推理

BNT 有許多不同的Inference"engines"。比如聯(lián)合樹引擎(junctiontree engine)。可以通過如下方式使用:

??????? engine =jtree_inf_engine(bnet);

舉個例子,在之后的討論中也將沿用這個例子

??? 腦卒中數(shù)據(jù)挖掘中,頸部血管篩查的結(jié)果,總結(jié)出7個節(jié)點(diǎn)。按照順序(父節(jié)點(diǎn)在子節(jié)點(diǎn)之前)列如下:內(nèi)膜增厚(TMT),斑塊數(shù)目,斑塊形態(tài),斑塊表面,潰瘍,回聲,是否腦卒中(dfStroke)。

?? ?我們已經(jīng)構(gòu)造出網(wǎng)絡(luò)拓?fù)?#xff0c;bnet,并且學(xué)習(xí)了參數(shù)。下面使用它進(jìn)行推斷

假設(shè)我們知道斑塊數(shù)量,斑塊形形態(tài)以及是否潰瘍?nèi)齻€證據(jù),我們想知道被檢查者患有腦卒中的概率(也是計(jì)算邊緣分布),將使用到BayesNet中的Inference。

代碼如下:

engine=jtree_inf_engine(bnet2);%使用聯(lián)合樹搜索引擎 evidence=cell(1,7);%由于有7個可觀測節(jié)點(diǎn)(包含是否腦卒中節(jié)點(diǎn)) evidence{2}=2; evidence{3}=1; evidence{4}=2;%分別給出觀測結(jié)果.為賦值的evidence是隱藏的,即evidence{i}=[] [engine,loglik]=enter_evidence(engine,evidence);%The first return argument contains the modified engine, which incorporates theevidence. The second return argument contains the log-likelihood of theevidence marg=marginal_nodes(engine,7)%計(jì)算第7個節(jié)點(diǎn)(dfStroke)的邊緣分布

?

總結(jié)

以上是生活随笔為你收集整理的贝叶斯网学习笔记(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。