结合构建的简单贝叶斯分类器谈谈认识

来源:互联网 发布:自学淘宝美工教程视频 编辑:程序博客网 时间:2024/05/18 00:24

毕业论文阶段性汇报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)