朴素贝叶斯(Naive-Bayes)

  • 基本原理

贝叶斯定理:image.png 全几率公式:p(x) = p(x/y1)p(y1)+p(x/y2)p(y2)+...p(x/yk)p(yk),其中(y1,y2,...yk)组成一个完备事件且之间相互独立。算法

  • 前提条件

各个特征之间相互独立,其中各个特征又分别为离散的类别。 image.png测试

  • 直接上步骤:
  1. 计算训练X各个特征xi中某个类别xij在每一类yk下的条件几率:p(xij/yk),全部计算结果存为三维矩阵Pxy(j,i,k)
  2. 计算各种yk的先验几率 :p(yk),即该类在整体样品中所占的比例
  3. 再根据步骤1和2的计算结果,计算新x的全几率:p(x) = p(x/y1)*p(y1)+p(x/y2)*p(y2)+...p(x/yk)*p(yk),其中,p(x/yk) = Pxy(~,1,k)Pxy(~,2,k)...*Pxy(~,m,k),是yk下样品出现的几率,~表明该特征下的该类特征,m为特征维度。
  4. 依据贝叶斯公式计算出P(yk/x),排序选择最大的类别。
  • matlab测试代码:
%朴素贝叶斯 --- 分类算法
%假设x特征之间相互独立

%输入: x[n*m]=[特征1,特征2,...特征m],其中特征一、2...m的值又分别为ij类(即离散数值)
%       y[n*1]=[类1;类2;...类k]
%如:x=[1,'高'      y=[‘是’
%       0,'低'         ‘否’
%       1,'中'         ‘是’
%       0,'高']        ‘否’]

%输出:p(xi)
clc;clear;close all;

x=[1,1,0,1,0,0,1,1,0,0
   0,1,1,0,0,1,1,1,0,1
   0,1,1,2,0,1,1,0,2,2];
y=[1,0,0,1,0,0,0,1,0,1];



x=x';
y=y';


[n,m]=size(x);%肯定x特征维数m,
for i=1:m 
    C(i)=length(unique(x(:,i)));%肯定x每一个特征的类数Ci;
end
uny=unique(y);
C(m+1)=length(uny);%肯定y的类数;

%-----------------------------计算先验几率,条件几率------------------
for i=1:C(m+1)  %y的类别数
    num=find(y==uny(i));
    sumy(i)=sum(y==uny(i));
    py(i)=sumy(i)/n;%先验几率P(Y=yi)
    
    xi=x(num,:);%y==yi下的x矩阵;
    for j=1:m   %x特征变量个数
        unx{j}=unique(x(:,j));
        for k=1:C(j)  %x每一个特征下的类别数
            pxy(k,j,i)=sum(xi(:,j)==unx{j}(k))/sumy(i);%条件几率矩阵,每一列为yi条件下xi特征的各种别的条件几率
        end
    end
end

%--------------------------------求后验几率---------------------------
% unx uny pxy py  C

xx=[0;0;0];

sum=0;
for i=1:C(m+1)
    mul=1;
    for j=1:m
        j_n=unx{j}==xx(j);
        mul=mul*pxy(j_n,j,i);
    end
    pxx(i)=mul;    
    sum=sum+py(i)*pxx(i);            
end
p_b=sum;%分母,全几率

for i=1:C(m+1)
    mul=1;
    for j=1:m
        j_n=find(unx{j}==xx(j));
        mul=mul*pxy(j_n,j,i);
    end
    pxx(i)=mul;
    p_a=py(i)*pxx(i);%分子,联合几率
    

    pyx(i)=p_a/p_b;
end

y_pre=max(pyx);%预测的最大几率
y_num=uny(unique(find(pyx==y_pre)));%预测最大几率的所属类别

disp('预测为:类别   几率')
disp([y_num,y_pre])
  • 附图 image.png
相关文章
相关标签/搜索