本文代码均已在 MATLAB R2019b 测试通过,如有错误,欢迎指正。

(一)Bayes算法的基本原理

设X∈Ω是一个类别未知的数据样本,$c_j$为某个类别,若数据样本X属于一个特定的类别$c_j$,那么分类问题就是决定P($c_j$|X),即在获得数据样本X时,确定X的最佳分类。
在这里插入图片描述
- P($c_j$|X):即给定数据样本X时$c_j$成立的后验概率,是我们所感兴趣的。
- P($c_j$) :类cj的先验概率(prior probability)。
- P(X|$c_j$):是当已知类别为cj的条件下,样本x出现的后验概率。
- P(X)指的是样本x出现的概率。

对于包含多个属性的数据集,直接计算P(X|$C_i$) 的运算量是非常大的。为实现对P(X|$C_i$)的有效估算,朴素贝叶斯分类通常假设各属性是相互独立的,即在属性间,不存在依赖关系,则对于给定的类别$C_i$ ,有:
在这里插入图片描述
而P($x_1$|$C_i$), P($x_2$|$C_i$),…, P($x_n$|$C_i$)的值,可以由训练样本集进行估算。

总结:
在这里插入图片描述

(二)问题描述

训练集:
在这里插入图片描述
转换后的数据(字符串转换为整型,只保留后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