贝叶斯定理:
全几率公式:p(x) = p(x/y1)p(y1)+p(x/y2)p(y2)+...p(x/yk)p(yk),其中(y1,y2,...yk)组成一个完备事件且之间相互独立。算法
各个特征之间相互独立,其中各个特征又分别为离散的类别。
测试
- 计算训练X各个特征xi中某个类别xij在每一类yk下的条件几率:p(xij/yk),全部计算结果存为三维矩阵Pxy(j,i,k)
- 计算各种yk的先验几率 :p(yk),即该类在整体样品中所占的比例
- 再根据步骤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为特征维度。
- 依据贝叶斯公式计算出P(yk/x),排序选择最大的类别。
%朴素贝叶斯 --- 分类算法 %假设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])