贝叶斯二分类算法的实现

技术凯 2020-12-18 00:50:25 10903
一、贝叶斯分类算法介绍

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

二、贝叶斯算法的实现

  本篇文章,我们使用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);

运行结果如下:

可以看出,程序预测结果为100%。

三、总结

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

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 85 6 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
技术凯
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区