首页 > 技术知识 > 正文

一、贝叶斯分类算法介绍

  按照贝叶斯的理论,我们在判断一个事物有多大可能性发生时,是基于两个概率来进行的,一个是先验概率,另一个是类的条件概率。举个简单的例子,当你想要判断同事今天中午会不会吃鸡排饭,如果我们已经知道,鸡排饭相比于其他饭菜是最美味的,那么先验概率就与午饭的美味程度有关。而类的条件概率就是在我们已经知道鸡排饭最美味的条件下,同事吃鸡排饭的概率。这样,我们可以通过统计同事最近一段时间吃鸡排饭的次数、鸡排饭老板因为骄傲而不开门的次数等其他信息来估计类的条件概率。最终,通过比较同事吃鸡排饭这个事件发生与否相对应的先验概率与类的条件概率的乘积,我们便可以对同事今天的选择进行预测。

二、贝叶斯算法的实现

  本篇文章,我们使用matlab进行贝叶斯分类算法的实现。首先,我们需要导入学习样本,如图:

file_name=2-Class data.mat; load(file_name);

“file_name”变量存储的是数据文件的路径,当数据文件与源代码文件在同一目录下,则直接写数据文件名称即可(相对路径)。 读取到的文件结构如下图: 贝叶斯二分类算法的实现 接下来,我们获取数据的相关信息。

Training_class1=Training(:,Label_Training==1);% 第一类数据 Training_class2=Training(:,Label_Training==2);% 第二类数据 % 获取两类训练数据的数量与维度,b1、b2是维度,n1、n2是数量 [b1,n1]=size(Training_class1); [b2,n2]=size(Training_class2); % 获取测试数据的数量和维度 [b,n]=size(Testing);

计算先验概率,这里我们将样本数据中第一类数据与第二类数据各自的占比作为先验概率。

% 先验概率 pw1=n1/(n1+n2); pw2=n2/(n1+n2);

我们借助高斯分布估计类的条件概率密度,在此之前,得先估计出相应参数

% 概率密度估计,参数估计 [miu1,sigma1]=ParamerEstimation(Training_class1); [miu2,sigma2]=ParamerEstimation(Training_class2);

估计参数使用的函数如下:

function [miu,sigma]=ParamerEstimation(Training_class) [~,n]=size(Training_class); miu=mean(Training_class,2); sigma=0; for i=1:n x=Training_class(:,i); sigma=sigma+(x-miu)*(x-miu); end sigma=sigma/n; end

逐一遍历我们的测试数据,进行预测

% 初始化预测结果 predict_label=0; for i=1:n x=Testing(:,i); % 概率密度估计 pxw1=gaussian(miu1,sigma1,x); pxw2=gaussian(miu2,sigma2,x); % 判别函数 g_x1=pw1*pxw1; g_x2=pw2*pxw2; if g_x1>g_x2 predict_label(i)=1; else predict_label(i)=2; end end

其中,高斯分布估计概率密度的函数实现代码如下:

function y=gaussian(miu,sigma,x) d=size(miu,1); % 防止某些类估计出的协方差矩阵不可逆,加一个小的扰动矩阵可以避免计算错误 I=5*eye(d); d=d/2; sigma=sigma+I; y=exp(-0.5*(x-miu)*inv(sigma)*(x-miu))/sqrt(det(sigma)); end

估计完成,计算正确率

% 计算正确率 acc=sum(predict_label==Label_Testing)/n; t2=clock;% 结束计时 time=etime(t2,t1); fprintf(正确率是%.2f%%\n,acc*100); fprintf(运行时长是%.2fs\n,time);

运行结果如下: 贝叶斯二分类算法的实现1 可以看出,程序预测结果为100%。

三、总结

  我们刚才进行分类的数据满足线性可分这个条件,才可以达到100%的正确率。所谓线性可分,在二分类情况下,可以理解为在平面上,存在一条直线,可以将不同类别的数据分隔开来。在线性不可分的情况下,贝叶斯分类并不能达到100%的正确率,但使用贝叶斯分类器同样能达到不错的效果。   本篇文章,我们介绍了贝叶斯分类器的基本原理以及如何使用matlab编程实现,大家不妨使用自己的数据集试一试。

猜你喜欢