【人工智能】贝叶斯网络之MATLAB实验

1、贝叶斯网络基础

首先复习一下贝页斯公式

165208_4njv_576429.png

例题:分别有 A、B 两个容器,在容器 A 里分别有 7 个红球和 3 个白球,在容器 B 里有 1 个红球和 9 个白球,现已知从这两个容器里任意抽出了一个球,且是红球,问这个红球是来自容器 A 的概率是多少?

则有: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.875

1.1、朴素贝叶斯理论

朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。 

 

230357_dOnv_576429.png

230357_IJZ7_576429.png

1.2、朴素贝叶斯理论的局限性

朴素贝叶斯理论假设各个特征属性条件独立,但是实际情况中这比较难满足,问题随之也来了,由于特征属性间存在依赖关系(如头像是否真实与好友密度之间),使得朴素贝叶斯分类不适用了。既然这样,需要寻找另外的解决方案。

也就是贝叶斯网络

1.3、贝叶斯网络

一个贝叶斯网络定义包括一个有向无环图(Directed Acyclic Graph )和一个条件概率表集合。

DAG中每一个节点表示一个随机变量,可以是可直接观测变量或隐藏变量,而有向边表示随机变量间的条件依赖;条件概率表中的每一个元素对应DAG中唯一的节点,存储此节点对于其所有直接前驱节点的联合条件概率。

2、贝叶斯网络MATLAB编程实现

2.1、环境搭建

安装MATLAB,添加FULLBNT工具箱具体参考这里(http://blog.sina.com.cn/s/blog_6c7b434d01013ufz.html

注意MATLAB中字体需要设置为中文字体,才能在编辑器和命令窗口支持中文,否则汉字会显示为小方框

 

2.2、习题:是窃贼还是地震

 

福尔摩斯先生在他的办公室工作时接到了他邻居华生的电话。华生告诉他:他的家里可能进了窃贼,因为他家的警铃响了

被告知有窃贼闯入,福尔摩斯迅速开车回家。在路上,他听广播得知他家那里发生了地震。地震也有可能引起警报。这样,请问福尔摩斯先生应该回家抓贼还是迅速撤离该地区以躲避地震?

条件如下

224103_8cbu_576429.png

题目分析:

简单讲,在路上的holmes需要判断是盗贼还是地震导致警铃?如果是前者,他需要回去抓贼,若是后者,则要逃离地震区。

所以图中虽然有5个节点,地震并不100%导致警铃,警铃也不100%导致华生的信号。

但是我们在得到信号,听到警铃的情况下,可以通过计算盗贼导致警铃的概率p1,和地震导致警铃的概率pp1来进行决策,也可以计算在地震发生条件下,盗贼导致警铃的概率p2。

如果p2比p1小,说明新添加的条件E才是导致A的主要原因。

2.3、具体实现如下

%1、建立贝叶斯网络结构
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]);
%2、画出建好的贝叶斯结构
draw_graph(dag);
%3、使用联合树引擎对贝叶斯网络进行推断
engine = jtree_inf_engine(bnet);
%4、求解边缘分布假设,
%我们要计算盗窃导致响铃的概率
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]);

建好的贝叶斯网络

225249_EKFk_576429.png

接下来添加R和W节点

2.4、修改上述代码

%1、建立贝叶斯网络结构
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]);
%2、画出建好的贝叶斯结构
draw_graph(dag);
%3、使用联合树引擎对贝叶斯网络进行推断
engine = jtree_inf_engine(bnet);
%4、求解边缘分布假设,
%我们要计算盗窃导致响铃的概率
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]);

建好的贝叶斯网络

225610_PvJ0_576429.png

运行结果也可看出R、W节点对决策无影响

2.5、关于【参数学习】的内容请参考下一篇:

【人工智能】贝叶斯网络之参数学习

3、参考资料

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

转载于:https://my.oschina.net/SnifferApache/blog/343756

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值