贝叶斯分类中最简单的一类:朴素贝叶斯分类。
理解:经验分布,即根据以往数据的呈现结果生成经验,测试数据则符合学习的经验
贝叶斯定理
P(A│B)=(P(AB))/(P(B))
P(B│A)=(P(A│B)P(B))/(P(A))
朴素贝叶斯分类的原理
对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。
算法流程
STEP1:获取训练样本,并分类
STEP2:计算先验概率和条件概率
STEP3:对给定的实例,计算概率
STEP4:找出概率最大值所对应的类别作为该实例所属的类别
代码实现
%naive Bayes method
clear all;
data =[1,1,-1;1,2,-1;1,2, 1;1,1, 1;1,1,-1;2,1,-1;2,2,-1;2,2, 1;2,3, 1;
2,3, 1;2,3, 1;3,3, 1;3,2, 1;3,3, 1;3,3,-1];
[numbers,types]=size(data);
A=[1,2,3];
B=[1,2,3];
C=[1,-1];
test=[2,1];
for i=1:2 %2 is the number of types about C
arrayy(i)=size(find(data(:,types)==C(i)),1);
end
for i=1:2
for j=1:3
arrayx1(i,j)=size(find((data(:,types)==C(i))&data(:,1)==A(j)),1)/arrayy(i);
end
end
for i=1:2
for j=1:3
arrayx2(i,j)=size(find((data(:,types)==C(i))&data(:,2)==B(j)),1)/arrayy(i);
end
end
for i=1:2
prob(i)=arrayy(i)/numbers*arrayx1(i,test(1))*arrayx2(i,test(2));
end
%=========output message========%
disp('numbers');
disp(numbers);
disp('types:');
disp(types-1);
disp(arrayy/numbers);
disp(arrayx1);
disp(arrayx2);
%================================%
disp('the answer is:');
disp(C(find(prob==max(prob))));
=============结果==================
训练数据:data =[1,1,-1;1,2,-1;1,2, 1;1,1, 1;1,1,-1;2,1,-1;2,2,-1;2,2, 1;2,3, 1;
2,3, 1;2,3, 1;3,3, 1;3,2, 1;3,3, 1;3,3,-1];
输入数据:2 1
测试数据个数:
15
特征数目:
2
0.6000 0.4000
0.2222 0.4444 0.3333
0.5000 0.3333 0.1667
0.1111 0.3333 0.5556
0.5000 0.3333 0.1667
贝叶斯估计结果
-1
贝叶斯估计(Laplace smoothing)
用极大似然估计可能会出现所要估计的概率值为0的情况,解决办法,采取贝叶斯估计。
其中S为种类B的个数。
当λ=1时,称为Laplace smoothing。
%naive Bayes method with laplace smoothing
for i=1:2
for j=1:3
arrayx1(i,j)=(size(find((data(:,types)==C(i))&data(:,1)==A(j)),1)+1)/(arrayy(i)+size(A,2));
end
end
for i=1:2
for j=1:3
arrayx2(i,j)=(size(find((data(:,types)==C(i))&data(:,2)==B(j)),1)+1)/(arrayy(i)+size(B,2));
end
end
两种算法比较:
输入实例(3,1)
极大似然估计:y=-1
贝叶斯估计:y=1
我们看到训练数据中,当x1=3时,大部分情况下输出结果为-1。从实际经验的角度上看,贝叶斯估计结果更为接近实际经验值。
参考链接
算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification)
参考书目
李航《统计学习方法》