本文代码均已在 MATLAB R2019b 测试通过,如有错误,欢迎指正。
(一)Bayes算法的基本原理
设X∈Ω是一个类别未知的数据样本,
c
j
c_j
cj为某个类别,若数据样本X属于一个特定的类别
c
j
c_j
cj,那么分类问题就是决定P(
c
j
c_j
cj|X),即在获得数据样本X时,确定X的最佳分类。
- P( c j c_j cj|X):即给定数据样本X时 c j c_j cj成立的后验概率,是我们所感兴趣的。
- P( c j c_j cj) :类cj的先验概率(prior probability)。
- P(X| c j c_j cj):是当已知类别为cj的条件下,样本x出现的后验概率。
- P(X)指的是样本x出现的概率。
对于包含多个属性的数据集,直接计算P(X|
C
i
C_i
Ci) 的运算量是非常大的。为实现对P(X|
C
i
C_i
Ci)的有效估算,朴素贝叶斯分类通常假设各属性是相互独立的,即在属性间,不存在依赖关系,则对于给定的类别
C
i
C_i
Ci ,有:
而P(
x
1
x_1
x1|
C
i
C_i
Ci), P(
x
2
x_2
x2|
C
i
C_i
Ci),…, P(
x
n
x_n
xn|
C
i
C_i
Ci)的值,可以由训练样本集进行估算。
总结:
(二)问题描述
训练集:
转换后的数据(字符串转换为整型,只保留后5列):
你需要输入一个类别未知的样本,例如[1,2,2,1],求出它属于哪类的概率最大,预测其分类。
(三)利用matlab实现Bayes算法
clear;clc;
% 录入数据,最后一列为决策属性
data=[
1 1 1 1 1
1 1 1 2 1
2 1 1 1 2
3 2 1 1 2
3 3 2 1 2
3 3 2 2 1
2 3 2 2 2
1 2 1 1 1
1 3 2 1 2
3 2 2 1 2
1 2 2 2 2
2 2 1 2 2
2 1 2 1 2
3 2 1 2 1
];
[n,m]=size(data);
C=data(:,m);
C_unique=unique(C);
C_num=length(C_unique); % 决策属性取值个数(决策属性的不同取值代表不同类别)
fprintf("当前数据集:"); data
X=input("请输入类别未知的样本。示例:[1,2,2,1]\n");
for i=1:m-1
if ~ismember(X(i),data(:,i))
warning("输入的某个属性值不在数据集中!"); % 警告
end
end
% 设第i种决策属性取值为Ci
% 设第j个条件属性取值为Xj
for i=1:C_num
C_select=(C==C_unique(i)); % n行1列的逻辑向量,其取值为1表示取出此行(元组)
data_new=data(C_select,:); % 取值均为Ci的行构成新数据子集
C_num=sum(C_select); % Ci所占行数
pc(i)=C_num/n; % 计算p(Ci)
pxc(i)=1;
for j=1:m-1
A=data_new(:,j); % 取出新数据子集的第j个条件属性
t=sum(A==X(j))/C_num; % 计算p(Xj|Ci)
pxc(i)=pxc(i)*t; % 计算p(X|Ci)
end
p(i)=pc(i)*pxc(i); % 计算p(Ci)*p(X|Ci)
end
fprintf("\n计算 p(Ci) 的结果为:"); pc
fprintf("计算 p(X|Ci) 的结果为:"); pxc
fprintf("计算 p(Ci)*p(X|Ci) 的结果为:"); p
[mx,mxpos]=max(p);
fprintf("结论:当前类别未知的样本属于类别%d的概率最大,其概率为%f\n",C_unique(mxpos),mx);
运行结果:
当前数据集:
data =
1 1 1 1 1
1 1 1 2 1
2 1 1 1 2
3 2 1 1 2
3 3 2 1 2
3 3 2 2 1
2 3 2 2 2
1 2 1 1 1
1 3 2 1 2
3 2 2 1 2
1 2 2 2 2
2 2 1 2 2
2 1 2 1 2
3 2 1 2 1
请输入类别未知的样本。示例:[1,2,2,1]
[1,2,2,1]
计算 p(Ci) 的结果为:
pc =
0.3571 0.6429
计算 p(X|Ci) 的结果为:
pxc =
0.0192 0.0439
计算 p(Ci)*p(X|Ci) 的结果为:
p =
0.0069 0.0282
结论:当前类别未知的样本属于类别2的概率最大,其概率为0.028219