首先复习一下贝页斯公式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