朴素贝叶斯

1基本思想

朴素贝叶斯法是基于贝叶斯定理和特征条件独立性假设的分类方法。对于给定的数据集,首先基于特征条件的独立假设学习输入输出的联合概率分布;然后基于此模型,对给定的输入X,利用贝叶斯定理求出后验概率最大的输出Y


2举例

确定x=(2,S)的标记y,其中X1,X2为特征,取值的集合为{1,2}{SM}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.


理论支持

朴素贝叶斯将实例分到后验概率最大的类中。这等价于期望风险最小化。假设选择0-1损失函数:

其中f(x)为分类决策函数。

这时期望风险为R=EL(Y,f(x)))。期望是对联合分布取的。由此取条件期望

为了使期望最小化,最需对X=x逐个极小化,由此得到f(x)

根据期望风险最小化原则就得到了后验概率最大化原则,这就是朴素贝叶斯。


算法步骤

1)计算先验概率和条件概率(即训练模型参数)

2)对于给定的实例X=x1,x2,...,xn,计算  

3)确定实例x的类别 

由于对于每个类别来说,使用贝叶斯公式求后验概率时分母一样故可以如上计算。


实验

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)



优势和劣势

优势:有贝叶斯定理可知给出来了最小化误差的最优解决方法。

劣势:独立性假设条件很强,属性之间有时候存在着联系。不能准确求出类概率。


7主要应用

适合在那种确定的类别和属性值比较确定的并且不是很多的时候。


8改进

求概率时候进行平滑处理

  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值