1基本思想
朴素贝叶斯法是基于贝叶斯定理和特征条件独立性假设的分类方法。对于给定的数据集,首先基于特征条件的独立假设学习输入输出的联合概率分布;然后基于此模型,对给定的输入X,利用贝叶斯定理求出后验概率最大的输出Y。
2举例
确定x=(2,S)的标记y,其中X1,X2为特征,取值的集合为{1,2},{S,M},Y为类标记{1,-1}。
训练数据(经验数据):
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
1 | 1 | 1 | 1 | 1 | 2 | 2 | 2 | X1 |
S | M | M | S | S | S | M | M | X2 |
-1 | -1 | 1 | 1 | -1 | -1 | -1 | 1 | Y |
先验概率:P(Y=1)=3/8 P(Y=-1)=5/8
条件概率:P(x1=1|y=1)=2/3 P(x1=2|y=1)=1/3 p(x2=S|y=1)=1/3 p(x2=M|y=1)=2/3
P(x1=1|y=-1)=3/5 P(x1=2|y=-1)=2/5 p(x2=S|y=-1)=3/5 p(x2=M|y=-1)=2/5
通过先验概率和条件概率就可求得联合概率分布,继而可求:
P(y=1)p(x1=2|y=1)p(x2=S|y=1)=3/8*1/3*1/3=3/72=1/24
P(y=-1)p(x1=2|y=-1)p(x2=S|y=-1)=5/8*2/5*3/5=48/125
可知x的类别为Y=-1.
3 理论支持
朴素贝叶斯将实例分到后验概率最大的类中。这等价于期望风险最小化。假设选择0-1损失函数:
其中f(x)为分类决策函数。
这时期望风险为R=E(L(Y,f(x)))。期望是对联合分布取的。由此取条件期望
为了使期望最小化,最需对X=x逐个极小化,由此得到f(x):
根据期望风险最小化原则就得到了后验概率最大化原则,这就是朴素贝叶斯。
4 算法步骤
1)计算先验概率和条件概率(即训练模型参数)
2)对于给定的实例X=(x1,x2,...,xn),计算
3)确定实例x的类别
由于对于每个类别来说,使用贝叶斯公式求后验概率时分母一样故可以如上计算。
5 实验
Trainbayes如下:
function [model] = trainbayes( traindata,trainlabel)
%pc 先验概率,pt 类条件概率.pc(k).label,pc(k).prob;pt(h).data,pt(h).prob
UNTITLED Summary of this function goes here
% Detailed explanation goes here
[traindata_m,traindata_n]=size(traindata);
[trainlabel_m,trainlabel_n]=size(trainlabel);
k=1;%k为标签数目,确定类别数目
pc(1).label=trainlabel(1,1);
for i=1:1:trainlabel_m
ss=0;
for tt=1:1:k%和所有的标签对比
if trainlabel(i,1)~= pc(tt).label
ss=ss+1;
end
end
if ss==k
k=k+1;
pc(k).label=trainlabel(i,1);
end
end
%初始化每个类别的概率
for i=1:1:k
pc(i).prob=0;
end
%求出每个类别的先验概率
for j=1:1:k
for i=1:1:trainlabel_m
if trainlabel(i,1)==pc(j).label
pc(j).prob=pc(j).prob+1;
end
end
pc(j).prob=(pc(j).prob+1)/(trainlabel_m+k);%拉普拉斯平滑
end
%求出类条件概率
for s=1:1:k;
for j=1:1:traindata_n
h=1;
pt(s).index(j).data(h).x=traindata(1,j);
for i=1:1:traindata_m%当前列的有多少不同值
ss=0;
for tt=1:1:h
if traindata(i,j)~=pt(s).index(j).data(tt).x
ss=ss+1;
end
end
if ss==h;
h=h+1;
pt(s).index(j).data(h).x=traindata(i,j);
end
end
for t=1:1:h%初始化概率
pt(s).index(j).data(t).prob=0;
end
for t=1:1:h%当前列的每个不同取值的个数
for i=1:1:traindata_m
if traindata(i,j)==pt(s).index(j).data(t).x
pt(s).index(j).data(t).prob= pt(s).index(j).data(t).prob+1;
end
end
end
for i=1:1:h%当前列的每个属性值的类条件概率
sum=0;
for t=1:1:traindata_m
if (traindata(t,j)==pt(s).index(j).data(i).x)&&(pc(s).label==trainlabel(t,1))
sum=sum+1;
end
end
pt(s).index(j).data(i).prob=(sum+1)/(pt(s).index(j).data(i).prob+h); %拉普拉斯平滑
end
end
end
model.pc=pc;
model.pt=pt;
model.label=k;
end
Testbayes如下:
利用判决函数求得
function [ accuracy ,vector] = testbayes( model,testdata,testlabel )
%UNTITLED Summary of this function goes here
% Detailed explanation goes here
[testdata_m,testdata_n]=size(testdata);
[testlabel_m,testlabel_n]=size(testlabel);
%判定函数为类条件概率和先验概率的乘积的最大值
for tt=1:1:testdata_m
for i=1:1:model.label
res=1;
for j=1:1:testdata_n
temp=1;
for t=1:1:length(model.pt(i).index(j).data)
if testdata(tt,j)==model.pt(i).index(j).data(t).x
temp=model.pt(i).index(j).data(t).prob
end
end
res=temp*res;
end
Max(i)=model.pc(i).prob*res;
end
[temp,index]=max(Max);
vector(tt)=index;
end
%求取准确率
accuracy=0;
for i=1:1:testdata_m
if vector(i)==testlabel(i,1)
accuracy=accuracy+1;
end
end
accuracy=accuracy/testdata_m;
end
结果准确率1.
用heart_scale数据集测试的准确率是0.7746。(train200,test71)
6 优势和劣势
优势:有贝叶斯定理可知给出来了最小化误差的最优解决方法。
劣势:独立性假设条件很强,属性之间有时候存在着联系。不能准确求出类概率。
7主要应用
适合在那种确定的类别和属性值比较确定的并且不是很多的时候。
8改进
求概率时候进行平滑处理