实验二 朴素贝叶斯分类
一、实验目的
通过实验,加深对统计判决与概率密度估计基本思想、方法的认识,了解影响Bayes分类器性能的因素,掌握基于Bayes决策理论的随机模式分类的原理和方法。
二、实验内容
设计Bayes决策理论的随机模式分类器,用matlab实现。
三、方法手段
Bayes分类器的基本思想是依据类的概率、概密,按照某种准则使分类结果从统计上讲是最佳的。换言之,根据类的概率、概密将模式空间划分成若干个子空间,在此基础上形成模式分类的判决规则。准则函数不同,所导出的判决规则就不同,分类结果也不同。使用哪种准则或方法应根据具体问题来确定。
四、Bayes算法
朴素贝叶斯分类或简单贝叶斯分类的工作过程如下:
(1)每个数据样本用一个n维特征向量X x1,x2,...xn 表示,分别描述对n个属性A1,A2,…An样本的n个度量。
(2)假定有m个类C1,C2,…Cm。给定一个未知的数据样本X(即没有类标号),分类法将预测X属于具有最高后验概率(条件X下)的类。即是说,朴素贝叶斯分类将未知的样本分配给类Ci,当且仅当
P CiX
P CjX ,1 j m,j i
(2.1)
这样,最大化P CiX 。其P CiX 最大的类Ci称为最大后验假定。根据贝叶斯定理
P XH P H
P X
P HX
,
P CiX
P Xi P Ci
P X
(2.2)
(3)由于P(X)对于所有类为常数,只需要P XCi P Ci 最大即可。如果类的先验概率未知,则通常假定这些类是等概率的,即P(C1)=P(C2)=…=P(Cm)。并据此只对P XCi 最大化。否则,最大化P XCi P Ci 。注意,类的先验概率可以用P Ci sis计算其中 si是类Ci中的训练样本数,而s是训练样本总数。
(4)给定具有许多属性的数据集,计算P XCi 的开销可能非常大。为降低计算
P XCi 的开销,可以做类条件独立的朴素假定。给定样本的类标号,假定属性值相互条件
独立,即在属性间,不存在依赖关系。这样,
n
P XCi
p x
k 1
k
i
(2.3)
概率P X1Ci ,P X2Ci ,…P Xni 可以由训练样本估值,其中
1)如果Ak是分类属性,则P Xki siksi,其中sik是在属性Ak上具有值xk的类Ci
的样本数,而si是Ci中的训练样本数。
2)如果Ak是连续值属性,则通常假定该属性服从高斯分布,因而,
xk C
i
2 C
2i
2
P Xki gxk, Ci, Ci
(2.4)
其中,给定类Ci的训练样本属性Ak的值,而 C, Cg xk, C, C 是属性Ak的高斯密度函数,
i
i
ii
分别为平均值和标准差。
(5)为对未知样本X分类,对每个类Ci,计算P XCi P Ci 。样本X被指派到类Ci,当且仅当
P Xi P Ci P Xj P Cj ,1 j m,j i
换言之,X被指派到其P XCi P Ci 最大的类Ci。
例 使用朴素贝叶斯分类预测类标号:
给定与判定树归纳相同的训练数据,我们希望使用朴素贝叶斯分类预测一个未知样本的类标号。训练数据在表7.1中。数据样本用属性age,income,student和credit_rating描述。类
标号属性buys_computer具有两个不同值(即(yes,no))。设C1对应于类buys_computer=“yes”,而C2对应于类buys_computer=“no”。我们希望分类的样本为
X age " 30",income "medium",student "yes",credit_rating "fair"
我们需要最大化P XCi P Ci ,i=1,2。每个类的先验概率P(Ci)可以根据训练样本计算:
P(buys_computer=”yes”)=9/14=0.643 P(buys_computer=”no”)=5/14=0.357
为计算P Xi ,i=1,2,我们计算下面的条件概率:
P(age=”<30”|buys_computer=”yes”) =2/9=0.222 P(age=”<30”|buys_computer=”no”) =3/5=0.222
P(income=”medium”|buys_computer=”yes”) =4/9=0.444 P(income=”medium”|buys_computer=”no”) =2/5=0.400 P(student=”yes”|buys_computer=”yes”) =6/9=0.667 P(student=”yes”|buys_computer=”no”) =1/5=0.200
P(credit_rating=”fair”|buys_computer=”yes”) =6/9=0.667 P(credit_rating=”fair”|buys_computer=”no”) =2/5=0.400
使用以上概率,我们得到:
P(X|buys_computer=”yes”)=0.222×0.444×0.667×0.667=0.044
P(X|buys_computer=”no”)=0.600×0.400×0.200×0.400=0.019
P(X|buys_computer=”yes”)P(buys_computer=”yes”)=0.044×0.643=0.028 P(X|buys_computer=”no”)P(buys_computer=”no”)=0.019×0.357=0.007
因此,对于样本X,朴素贝叶斯分类预测buys_computer=”yes”。
五、实验结果
训练数据train1.txt内容及格式如下:
需要分类的数据(预测数据)predict1.txt如下:
程序执行结果如下:
六、实验总结
贝叶斯分类的效率如何?理论上讲,与其它所有分类算法相比较,贝叶斯分类具有最小的出错率。然而,实践中并非总是如此。这是由于对其应用的假定(如类条件独立性)的不准确性,以及缺乏可用的概率数据造成的。然而种种实验研究表明,与决策树和神经网络分类算法相比,在某些领域,该分类算法可以与之媲美。
贝叶斯分类还可以用来为不直接使用贝叶斯定理的其他分类算法提供理论判定。例如,在某种假定下,可以证明正如朴素贝叶斯分类一样,许多神经网络和曲线拟合算法输出最大的后验假定。
七、Batyes程序
decision=attribute(X,n); %提取决策属性
function out=my_bayes(X,Y)
%X为原数据集,Y是要预测的数据,out是返回预测的结果
for i=1:n-1
%%%%%%%%%%%%%%%%%%%%%%打开test.txt文件
[post_pro{i},post_name{i}]=post_prob(attribute(X,i),decision); %求
clc;
各条件属性后验概率
file = textread('train1.txt','%s','delimiter','\n','whitespace','');
end
[m,n]=size(file);
for i=1:m
%%%%%%%%%%%%%%%%%%%%%%%%预测部分
words=strread(file{i},'%s','delimiter',' ');
uniq_decis=unique(decision); %求决策属性的类别
words=words';
P_X=ones(size(uniq_decis,1),1); %初始化决策属性后验概率
X{i}=words;
[M,N]=size(Y);
end
k=1;
X=X';%转置
for i=1:M
%%%%%%%%%%%%%%%%%%%%%打开predict.txt文件
for j=1:n-1
file = textread('predict1.txt','%s','delimiter','\n','whitespace','');
[m,n]=size(file);
[temp,loc]=ismember(attribute({Y{i}},j),unique(attribute(X,j)));%决策属
for i=1:m
words=strread(file{i},'%s','delimiter',' ');
P_X=post_pro{j}(:,loc).*P_X;%各条件属性后验概率之积(贝
words=words'; Y{i}=words;
end
end
[MAX,I]=max(P_X);%寻找最大值
Y=Y';%转置
out{k}=uniq_decis{I};%哪一类决策属性后验概率最大,则次样本
k=k+1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%训练部分 [M,N]=size(X);
end
[m,n]=size(X{1});
P_X=ones(size(uniq_decis,1),1);%再次初始化决策属性后验概率P_X,以便为下一样本计算作准备 属于那一类 叶斯公式) 性计算后验概率
Pro=probality(decision);%计算决策属性个分量概率
out=out'; %输出结果(转置形式)
%%%%%%%%%%%%%%%%%%%%%各子程序 function y=attribute(X,n)
%功能为提取出原数据集X中的第n个属性所对应的一列值 [M,N]=size(X); for i=1:M
temp{i}=X{i}{n}; %将指定列值以temp暂量保存 end
y=temp';%转置
%%%%%%%%%%%%%%%%%
function [post_pro,post_name]=post_prob(E,D)
%E为目标属性,D为决策属性,post_pro计算目标属性对应于决策属性的后验概率
%post_name为所求的后验概率变量名称 [M,N]=size(D);
decision=unique(D);%决策属性种类 attri=unique(E); %条件属性种类 [m1,n1]=size(decision); [m2,n2]=size(attri);
temp=cat(2,E,D); %连接条件属性和决策属性 post_pro=zeros(m1,m2); %后验概率初始化 for i=1:M for j=1:m2 for k=1:m1
post_name{k,j}=cat(2,{attri{j}},{decision{k}});
if(isequal(temp(i,:),post_name{k,j}))
post_pro(k,j)=post_pro(k,j)+1; %条件属性后验概率(频数) end end end end for i=1:m1
post_pro(i,:)=post_pro(i,:)/sum(post_pro(i,:));%求得条件属性后验概率 end
%%%%%%%%%%%%%%%%%%% function y=probality(E) %计算该属性类的概率 [M,N]=size(E);
class=unique(E);%求该决策属性的类别 [m,n]=size(class);
p=zeros(m,1);%先验概率p初始化 for i=1:M for j=1:m
if(isequal(E{i},class{j}))
p(j)=p(j)+1; %求各个样本的先验概率(频数) end end end
y=p/M;%得各样本概率