贝叶斯分类算法及其matlab代码

17 篇文章 2 订阅
9 篇文章 1 订阅

贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。
贝叶斯分类是一类利用概率统计知识进行分类的算法,其分类原理是贝叶斯定理。贝叶斯定理是由18世纪概率论和决策论的早期研究者Thomas Bayes发明的,故用其名字命名为贝叶斯定理。
贝叶斯定理是概率论中的一个结果,它跟随机变量的条件概率以及边缘分布有关。在有些关于概率的解说中,贝叶斯定理能够告诉我们如何利用新证据修改已有的看法。通常,事件A在事件B(发生)的条件下的概率,与事件B在事件A的条件下的概率是不一样的;然而,这两者有确定的关系,贝叶斯定理就是对这种关系的陈述。
假设、是一对随机变量,它们的联合概率是指取值且取值的概率,条件概率是指一随机变量在另一随机变量取值已知的情况下取某一特定值的概率。例如,条件概率是指在变量取值的情况下,变量取值的概率。和的联合概率、条件概率满足如下关系:

此式变形可得到下面的公式

称为贝叶斯定理。
贝叶斯定理很有用,因为它允许我们用先验概率、条件概率和证据来表示后验概率。而在贝叶斯分类器中,朴素贝叶斯最为常用,下面介绍朴素贝叶斯的原理。
朴素贝叶斯分类是一种十分简单的分类算法,朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。
朴素贝叶斯分类器以简单的结构和良好的性能受到人们的关注,它是最优秀的分类器之一。朴素贝叶斯分类器建立在一个类条件独立性假设(朴素假设)基础之上:给定类结点(变量)后,各属性结点(变量)之间相互独立。根据朴素贝叶斯的类条件独立假设,则有

条件概率可以从训练数据集求得,根据此方法,对一个未知类别的样本,可以先计算出属于每一个类别的概率,然后选择其中概率最大的类别作为其类别。
朴素贝叶斯分类的正式步骤如下
设为一个待分类项,而每个为的一个特征属性;
有类别集合;
计算;
如果,则。
那么现在的关键就是如何计算第(3)步中的各条件概率
找到一个已知分类的待分类项集合,这个集合叫作训练样本集;
统计得到在各类别下各个特征属性的条件概率估计,即

如果各个特征属性是条件独立的,则根据贝叶斯定理有如下推导

因为分母对于所有类别为常数,因此只要将分子最大化即可;又因为各特征属性是条件独立的,所以有

根据上述分析,朴素贝叶斯分类的流程可以由下图表示
在这里插入图片描述

由图可知,整个朴素贝叶斯分类分为三个阶段。
第一阶段:准备工作阶段。这个阶段的任务是为朴素贝叶斯分类做必要的准备,主要工作是根据具体情况确定特征属性,并为每个特征属性进行适当划分,如何由人工对一部分待分类项进行分类,形成训练样本集合。这一阶段的输入是所有待分类数据,输出是特征属性和训练样本。这一阶段是整个朴素贝叶斯分类中唯一需要人工完成的阶段,其质量对整个过程将有重要影响。分类器的质量很大程度上由特征属性、特征属性划分及训练样本质量决定。
第二阶段:分类器训练阶段。这个阶段的任务就是生成分类器,主要工作是计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计,并记录结果。其输入是特征属性和训练样本,输出是分类器。这一阶段是机械性阶段,根据前面讨论的公式,由程序自动计算完成。
第三阶段:应用阶段。这个阶段的任务是使用分类器对待分类项进行分类,其输入是分类器和待分类项,输出是待分类项与类别的映射关系。这一阶段也是机械性阶段,由程序完成。
朴素贝叶斯算法成立的前提是各属性之间相互独立。当数据集满足这种独立行假设时,分类的准确度较高,否则可能较低。另外,该算法没有分类规则输出。
下面展示一些 内联代码片

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 产生模式类函数
% N:生成散点个数 C:类别个数 d:散点的维数
% mu:各类散点的均值矩阵
% sigma:各类散点的协方差矩阵
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function result = MixGaussian(N, C, d, mu, sigma)
color = {'r.', 'g.', 'm.', 'b.', 'k.', 'y.'}; % 用于存放不同类数据的颜色
% if nargin <= 3 & N < 0 & C < 1 & d < 1
%   error('参数太少或参数错误');
if d == 1
        for i = 1 : C
            for j = 1 : N/C
            r(j,i) = sqrt(sigma(1,i)) * randn() + mu(1,i);
            end
            X = round(mu(1,i)-5);
            Y = round(mu(1,i) + sqrt(sigma(1,i))+5);
            b = hist(r(:,i), X:Y);
            subplot(1,C,i),bar(X:Y, b,'b');
            title('三类一维随机点的分布直方图');
            grid on
        end
elseif d == 2
            for i = 1:C
                r(:,:,i) = mvnrnd(mu(:,:,i),sigma(:,:,i),round(N/C));
                plot(r(:,1,i),r(:,2,i),char(color(i)));
                hold on;
            end
elseif d == 3
            for i = 1:C
                r(:,:,i) = mvnrnd(mu(:,:,i),sigma(:,:,i),round(N/C));
                plot3(r(:,1,i),r(:,2,i),r(:,3,i),char(color(i)));
                hold on;
            end
else disp('维数只能设置为1,2或3');
end
result = r;
​
​
​
​
​
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
  高斯型Bayes判别函数
%  mu:输入正态分布的均值
%  sigma:输入正态分布的协方差矩阵
%  p:输入各类的先验概率
%  X:输入样本矢量
%  输出判别函数值、马氏距离和判别结果
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function GuassianBayesModel( mu,sigma,p,X )
​
%
 构建判别函数
% 计算点到每个类的Mahalanobis距离
for i = 1:3;
P(i) = mvnpdf(X, mu(:,:,i), sigma(:,:,i)) * p(i);
r(i) = sqrt((X - mu(:,:,i)) * inv(sigma(:,:,i)) * (X - mu(:,:,i))');
end
% 判断样本属于哪个类的概率最高
% 并显示点到每个类的Mahalanobis距离
maxP = max(P);
style = find(P == maxP);
disp(['
点[
',num2str(X),'
]关于第一类的判别函数值为:
',num2str(P(1))]);
disp(['
点[
',num2str(X),'
]关于第二类的判别函数值为:
',num2str(P(2))]);
disp(['
点[
',num2str(X),'
]关于第三类的判别函数值为:
',num2str(P(3))]);
​
disp(['
点[
',num2str(X),'
]到第
1
类的Mahalanobis距离为:
',num2str(r(1))]);
disp(['
点[
',num2str(X),'
]到第
2
类的Mahalanobis距离为:
',num2str(r(2))]);
disp(['
点[
',num2str(X),'
]到第
3
类的Mahalanobis距离为:
',num2str(r(3))]);
​
disp(['
点[
',num2str(X),'
]属于第
',num2str(style),'
类
']);
​
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%贝叶斯分类器实验主函数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
​
% 生成两类各100个散点样本
mu(:,:,1) = [1 3];  
sigma(:,:,1) = [1.5 0; 0 1];
p1 = 1/2;
​
mu(:,:,2) = [3 1];  
sigma(:,:,2) = [1 0.5; 0.5 2];
p2 = 1/2;
% 生成200个二维散点,平分为两类,每类100个
aa = MixGaussian(200, 2, 2, mu, sigma);
title('
两类共
200
个高斯分布的散点
');
​
% 只x分量作为分类特征的分类情况
figure;
% 正确分类的散点个数
right1 = 0;
right2 = 0;
% 正确率
rightRate1 = 0;
rightRate2 = 0;
for i = 1:100
    x = aa(i,1,1);
    plot(aa(:,1,1),aa(:,2,1),'
r.
');
% 计算后验概率
P1 = normpdf(x, 1, sqrt(1.5));
P2 = normpdf(x, 3, sqrt(1));
​
if P1 > P2
    plot(aa(i,1,1),aa(i,2,1),'
ks
');
    hold on;
    right1 = right1 + 1;% 统计正确个数
elseif P1 < P2
    plot(aa(i,1,1),aa(i,2,1),'
go
');
    hold on;
end
end
rightRate1 = right1 / 100; % 正确率
​
for i = 1:100
    x = aa(i,1,2);
    plot(aa(:,1,2),aa(:,2,2),'
g.
');
% 计算后验概率
P1 = normpdf(x, 1, sqrt(1.5));
P2 = normpdf(x, 3, sqrt(1));
​
if P1 > P2
    plot(aa(i,1,2),aa(i,2,2),'
ks
');
    hold on;
elseif P1 < P2
    plot(aa(i,1,2),aa(i,2,2),'
go
');
    hold on;
    right2 = right2 + 1; % 统计正确个数
end
end
rightRate2 = right2 / 100;
title('
使用第一个分类特征的分类结果
');
disp(['
只用第一个特征时,第一类分类的准确率为:
',num2str(rightRate1*100),'
%
']);
disp(['
只用第一个特征时,第二类分类的准确率为:
',num2str(rightRate2*100),'
%
']);
​
% 只使用y分量的分类特征的分类情况
figure;
% 正确分类的散点个数
right1 = 0;
right2 = 0;
% 正确率
rightRate1 = 0;
rightRate2 = 0;
for i = 1:100
    y = aa(i,2,1);
      plot(aa(:,1,1),aa(:,2,1),'
r.
');
% 计算后验概率
P1 = normpdf(y, 3, sqrt(1));
P2 = normpdf(y, 1, sqrt(2));
​
if P1 > P2
    plot(aa(i,1,1),aa(i,2,1),'
ks
');
    hold on;
    right1 = right1 + 1; % 统计正确个数
elseif P1 < P2
    plot(aa(i,1,1),aa(i,2,1),'
go
');
    hold on;
end
end
rightRate1 = right1 / 100; % 正确率
​
for i = 1:100
    y = aa(i,2,2);
      plot(aa(:,1,2),aa(:,2,2),'
g.
');
% 计算后验概率
P1 = normpdf(y, 3, sqrt(1));
P2 = normpdf(y, 1, sqrt(2));
​
if P1 > P2
    plot(aa(i,1,2),aa(i,2,2),'
ks
');
    hold on;
​
elseif P1 < P2
    plot(aa(i,1,2),aa(i,2,2),'
go
');
    hold on;
    right2 = right2 + 1; % 统计正确个数
end
end
rightRate2 = right2 / 100; % 正确率
title('
使用第二个分类特征的分类结果
');
disp(['
只用第二个特征时,第一类分类的准确率为:
',num2str(rightRate1*100),'
%
']);
disp(['
只用第二个特征时,第二类分类的准确率为:
',num2str(rightRate2*100),'
%
']);
​
% 同时使用两个分类特征的分类情况
figure;
% 正确分类的散点个数
right1 = 0;
right2 = 0;
% 正确率
rightRate1 = 0;
rightRate2 = 0;
for i = 1:100
    x = aa(i,1,1);
    y = aa(i,2,1);
  plot(aa(:,1,1),aa(:,2,1),'
r.
');
% 计算后验概率
P1 = mvnpdf([x,y], mu(:,:,1), sigma(:,:,1));
P2 = mvnpdf([x,y], mu(:,:,2), sigma(:,:,2));
​
if P1 > P2
    plot(aa(i,1,1),aa(i,2,1),'
ks
');
    hold on;
    right1 = right1 + 1;
else if P1 < P2
    plot(aa(i,1,1),aa(i,2,1),'
go
');
    hold on;
    end
end
end
rightRate1 = right1 / 100;
​
for i = 1:100
    x = aa(i,1,2);
    y = aa(i,2,2);
    plot(aa(:,1,2),aa(:,2,2),'
g.
');
% 计算后验概率
P1 = mvnpdf([x,y], mu(:,:,1), sigma(:,:,1));
P2 = mvnpdf([x,y], mu(:,:,2), sigma(:,:,2));
​
if P1 > P2
    plot(aa(i,1,2),aa(i,2,2),'
ks
');
    hold on;
else if P1 < P2
​
    plot(aa(i,1,2),aa(i,2,2),'
go
');
    hold on;
    right2 = right2 + 1;
    end
end
end
rightRate2 = right2 / 100;
title('
使用两个分类特征的分类结果
');
disp(['
同时使用两个特征时,第一类分类的准确率为:
',num2str(rightRate1*100),'
%
']);
disp(['
同时使用两个特征时,第二类分类的准确率为:
',num2str(rightRate2*100),'
%
']);
​
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 进一步的Bayes分类器
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% w1,w2,w3三类散点
w = zeros(10,3,3);
w(:,:,1) = [-5.01 -8.12 -3.68;...
            -5.43 -3.48 -3.54;...
             1.08 -5.52  1.66;...
             0.86 -3.78 -4.11;...
            -2.67  0.63  7.39;...
             4.94  3.29  2.08;...
            -2.51  2.09 -2.59;...
            -2.25 -2.13 -6.94;...
             5.56  2.86 -2.26;...
             1.03 -3.33  4.33];
​
w(:,:,2) = [-0.91 -0.18 -0.05;...
             1.30 -.206 -3.53;...
            -7.75 -4.54 -0.95;...
            -5.47  0.50  3.92;...
             6.14  5.72 -4.85;...
             3.60  1.26  4.36;...
             5.37 -4.63 -3.65;...
             7.18  1.46 -6.66;...
            -7.39  1.17  6.30;...
            -7.50 -6.32 -0.31];
​
w(:,:,3) = [ 5.35  2.26  8.13;...
             5.12  3.22 -2.66;...
            -1.34 -5.31 -9.87;...
             4.48  3.42  5.19;...
             7.11  2.39  9.21;...
             7.17  4.33 -0.98;...
             5.75  3.97  6.65;...
             0.77  0.27  2.41;...
             0.90 -0.43 -8.71;...
             3.52 -0.36  6.43];
% 均值
mu1(:,:,1) = sum(w(:,:,1)) ./ 10;
mu1(:,:,2) = sum(w(:,:,2)) ./ 10;
mu1(:,:,3) = sum(w(:,:,3)) ./ 10;
% 协方差矩阵
sigma1(:,:,1) = cov(w(:,:,1));
sigma1(:,:,2) = cov(w(:,:,2));
sigma1(:,:,3) = cov(w(:,:,3));
% 各类别的先验概率
% p(1) = 1/3;
% p(2) = 1/3;
% p(3) = 1/3;
p(1) = 0.8;
p(2) = 0.1;
p(3) = 0.1;
% 样本矢量
X = [1 0 0];
% 调用高斯型Bayes判别函数,输出判别函数值、马氏距离和判别结果
GuassianBayesModel(mu1,sigma1,p,X);
  • 6
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

35℃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值