毕业论文阶段性汇报 2008-3-27
结合构建的简单贝叶斯分类器谈谈认识
贝叶斯网络原理
它是一个有向无环图,由代表变量结点、连接这些结点的有向边构成。
变量是问题的抽象,用来代表感兴趣事物的状态或属性等,具有一定的物理意义。有向边表示变量之间的依赖或因果关系的方向性,结点之间若无连接边表示结点之间是条件独立的,其对应问题领域的定性描述。条件概率表(CPT)列出了每个结点相对于其父结点所有可能的条件概率,其对应问题领域的定量描述。
贝叶斯网络可以将具体问题中复杂的变量关系在一个网络结构表示,通过网络模型反映问题领域中变量的依赖关系。
贝叶斯网络分类器:
在贝叶斯网络中将其中代表类别变量的结点作为根结点,其余所有的变量结点都作为该类别变量结点的子结点,则贝叶斯网络就变成了贝叶斯网络分类器。
构造分类器需要根据给定训练样本数据集(训练集)作为输入,通过对训练集进行训练,归纳出分类器,利用分类器对没有分类的数据进行分类。
―――――――――――――――――――――――――――――――――――――――
―――――――
贝叶斯网络的构建:
构建贝叶斯网络包括以下三个步骤:
(1)变量的定义;
推荐镜片、年龄、视力、散光、流泪量
(2)定义网络结构;
N = 5;
dag = zeros(N,N); %邻接矩阵
B1 = 1;B2 = 2;B3 = 3;B4 = 4;A = 5;
dag(A,[B1 B2 B3 B4]) = 1;
ns = [3 2 2 2 3];
% ns(i) is the number of values node i can take on,
% or the length of node i if i is a continuous-valued vector.
bnet = mk_bnet(dag, ns);
%初始化条件概率分布
bnet.CPD{B1} = tabular_CPD(bnet, B1, [0.3 0.3 0.3 0.3 0.3 0.3 0.4 0.4 0.4]);
bnet.CPD{B2} = tabular_CPD(bnet, B2, [0.5 0.5 0.5 0.5 0.5 0.5]);
bnet.CPD{B3} = tabular_CPD(bnet, B3, [0.5 0.5 0.5 0.5 0.5 0.5]);
bnet.CPD{B4} = tabular_CPD(bnet, B4, [0.5 0.5 0.5 0.5 0.5 0.5]);
bnet.CPD{A} = tabular_CPD(bnet, A, [0.3 0.3 0.4]);
我们所关注的是更新后的而并非是初始值。
(3)参数学习。
贝叶斯网络的参数学习实质上是在已知网络结构的条件下,根据训练实例来学习每个节点的概率分布表。
%evidence(1,:)年龄:1-青年,2-中年,3-老年
%evidence(2,:)视力:1-近视,2-远视
%evidence(3,:)散光:1-否,2-是
%evidence(4,:)流泪量:1-正常,2-少
L=24;
evidence=ones(N,L);
。。。。。。。。。。。。%输入训练数据集
bnet = learn_params(bnet, evidence);
―――――――――――――――――――――――――――――――――――――――
推论(分类)
engine = jtree_inf_engine(bnet);%建立推论引擎
ev = cell(1,N);
ev{B1} = 3;
ev{B2} = 2;
ev{B3} = 2;
ev{B4} = 1;
engine = enter_evidence(engine, ev);
mA = marginal_nodes(engine, A);%A的后验概率返回
subplot
bar(mA.T)
―――――――
输出结果
测试数据
序号 | 年龄 | 视力 | 散光 | 流泪量 | 推荐镜片 |
1 | 青年1 | 近视1 | 否1 | 少2 | (none1) |
2 | 青年1 | 远视2 | 是2 | 正常1 | (hard3) |
3 | 中年2 | 近视1 | 是 2 | 少2 | (none1) |
4 | 老年3 | 远视2 | 否1 | 正常1 | (soft2) |
下一步计划
根据研究目标构建网络模型
分模块进行数据处理
---------------------------------------------------------
源代码
clear all;
clc;
%BNetTest 基于贝叶斯网络的隐形眼镜诊断
%初始贝叶斯网络结构、参数
N = 5;
dag = zeros(N,N);
B1 = 1;B2 = 2;B3 = 3;B4 = 4;A = 5;
dag(A,[B1 B2 B3 B4]) = 1;
ns = [3 2 2 2 3]; %
bnet = mk_bnet(dag, ns);
%初始化条件概率分布
bnet.CPD{B1} = tabular_CPD(bnet, B1, [0.3 0.3 0.3 0.3 0.3 0.3 0.4 0.4 0.4]);
bnet.CPD{B2} = tabular_CPD(bnet, B2, [0.5 0.5 0.5 0.5 0.5 0.5]);
bnet.CPD{B3} = tabular_CPD(bnet, B3, [0.5 0.5 0.5 0.5 0.5 0.5]);
bnet.CPD{B4} = tabular_CPD(bnet, B4, [0.5 0.5 0.5 0.5 0.5 0.5]);
bnet.CPD{A} = tabular_CPD(bnet, A, [0.3 0.3 0.4]);
%参数学习
%engine = jtree_inf_engine(bnet);
%evidence(1,:)年龄:1-青年,2-中年,3-老年
%evidence(2,:)视力:1-近视,2-远视
%evidence(3,:)散光:1-否,2-是
%evidence(4,:)流泪量:1-正常,2-少
L=24;
evidence=ones(N,L);
evidence(:,1)=[1 1 1 2 1]';
evidence(:,2)=[1 1 1 1 2]';
evidence(:,3)=[1 1 2 2 1]';
evidence(:,4)=[1 1 2 1 3]';
evidence(:,5)=[1 2 1 2 1]';
evidence(:,6)=[1 2 1 1 2]';
evidence(:,7)=[1 2 2 2 1]';
evidence(:,8)=[1 2 2 1 3]';
evidence(:,9)=[2 1 1 2 1]';
evidence(:,10)=[2 1 1 1 2]';
evidence(:,11)=[2 1 2 2 1]';
evidence(:,12)=[2 1 2 1 3]';
evidence(:,13)=[2 2 1 2 1]';
evidence(:,14)=[2 2 1 1 2]';
evidence(:,15)=[2 2 2 2 1]';
evidence(:,16)=[2 2 2 1 1]';
evidence(:,17)=[3 1 1 2 1]';
evidence(:,18)=[3 1 1 1 1]';
evidence(:,19)=[3 1 2 2 1]';
evidence(:,20)=[3 1 2 1 3]';
evidence(:,21)=[3 2 1 2 1]';
evidence(:,22)=[3 2 1 1 2]';
evidence(:,23)=[3 2 2 2 1]';
evidence(:,24)=[3 2 2 1 1]';
%engine = learn_params_em(engine, evidence);
bnet = learn_params(bnet, evidence);
engine = jtree_inf_engine(bnet);
ev = cell(1,N);
ev{B1} = 1;
ev{B2} = 1;
ev{B3} = 1;
ev{B4} = 2;
engine = enter_evidence(engine, ev);
mA = marginal_nodes(engine, A);
%fprintf('P(E|c)=%5.3f, P(B|c)=%5.3f/n', mE.T(1), mB.T(1))
subplot(2,2,1)
bar(mA.T)
%subplot(2,2,2)
%bar(mB1.T)
%subplot(2,2,3)
%bar(mB2.T)
%subplot(2,2,4)
%bar(mB3.T)
ev{B1} = 1;
ev{B2} = 2;
ev{B3} = 2;
ev{B4} = 1;
engine = enter_evidence(engine, ev);
mA = marginal_nodes(engine, A);
%fprintf('P(E|c)=%5.3f, P(B|c)=%5.3f/n', mE.T(1), mB.T(1))
subplot(2,2,2)
bar(mA.T)
ev{B1} = 2;
ev{B2} = 1;
ev{B3} = 2;
ev{B4} = 2;
engine = enter_evidence(engine, ev);
mA = marginal_nodes(engine, A);
%fprintf('P(E|c)=%5.3f, P(B|c)=%5.3f/n', mE.T(1), mB.T(1))
subplot(2,2,3)
bar(mA.T)
ev{B1} = 3;
ev{B2} = 2;
ev{B3} = 1;
ev{B4} = 1;
engine = enter_evidence(engine, ev);
mA = marginal_nodes(engine, A);
%fprintf('P(E|c)=%5.3f, P(B|c)=%5.3f/n', mE.T(1), mB.T(1))
subplot(2,2,4)
bar(mA.T)