首先複習一下貝頁斯公式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
樸素貝葉斯的思想基礎是這樣的:對於給出的待分類項,求解在此項出現的條件下各個類別出現的機率,哪一個最大,就認爲此待分類項屬於哪一個類別。 工具
樸素貝葉斯理論假設各個特徵屬性條件獨立,可是實際狀況中這比較難知足,問題隨之也來了,因爲特徵屬性間存在依賴關係(如頭像是否真實與好友密度之間),使得樸素貝葉斯分類不適用了。既然這樣,須要尋找另外的解決方案。學習
也就是貝葉斯網絡字體
一個貝葉斯網絡定義包括一個有向無環圖(Directed Acyclic Graph )和一個條件機率表集合。人工智能
DAG中每個節點表示一個隨機變量,能夠是可直接觀測變量或隱藏變量,而有向邊表示隨機變量間的條件依賴;條件機率表中的每個元素對應DAG中惟一的節點,存儲此節點對於其全部直接前驅節點的聯合條件機率。
安裝MATLAB,添加FULLBNT工具箱具體參考這裏(http://blog.sina.com.cn/s/blog_6c7b434d01013ufz.html)
注意MATLAB中字體須要設置爲中文字體,才能在編輯器和命令窗口支持中文,不然漢字會顯示爲小方框
福爾摩斯先生在他的辦公室工做時接到了他鄰居華生的電話。華生告訴他:他的家裏可能進了竊賊,由於他家的警鈴響了
被告知有竊賊闖入,福爾摩斯迅速開車回家。在路上,他聽廣播得知他家那裏發生了地震。地震也有可能引發警報。這樣,請問福爾摩斯先生應該回家抓賊仍是迅速撤離該地區以躲避地震?
條件以下
題目分析:
簡單講,在路上的holmes須要判斷是盜賊仍是地震致使警鈴?若是是前者,他須要回去抓賊,如果後者,則要逃離地震區。
因此圖中雖然有5個節點,地震並不100%致使警鈴,警鈴也不100%致使華生的信號。
可是咱們在獲得信號,聽到警鈴的狀況下,能夠經過計算盜賊致使警鈴的機率p1,和地震致使警鈴的機率pp1來進行決策,也能夠計算在地震發生條件下,盜賊致使警鈴的機率p2。
若是p2比p1小,說明新添加的條件E纔是致使A的主要緣由。
%一、創建貝葉斯網絡結構 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節點
%一、創建貝葉斯網絡結構 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節點對決策無影響
1. Matlab BNS 使用:
(http://wenku.baidu.com/view/379405dcd15abe23482f4d1c)
2. matlab使用FULLBNT工具箱實現貝葉斯網絡(草地潮溼分析,本文代碼在其基礎上修改):
(http://blog.sina.com.cn/s/blog_6c7b434d01013ufz.html)
3. 是竊賊仍是地震原題:
5. 貝頁斯公式:http://baike.baidu.com/view/541856.htm