贝叶斯多分类之参数估计方法

技术凯 2020-12-20 16:30:48 5822
一、从二分类到多分类

  我们可以回顾一下进行二分类决策的流程:首先估计每一类的先验概率,然后使用参数估计方法或者非参数方法估计待决策样本对于每一类的条件概率密度,将先验概率和类的条件概率密度的乘积作为判别函数,比较两类相应的判别函数,将待决策样本归类到判别函数较大的一类中。多分类决策方法可以从二分类的方法中推广而来。和二分类方法类似,先估计所有类别对应的先验概率,然后估计待决策样本对于每一类的条件概率密度,同样将二者的乘积作为判别函数,比较所有类别对应的判别函数,将样本归为判别函数最大的一类中。
  前面的文章中,我们对比了二分类决策下的分类器使用两种概率密度估计方法的性能,这篇文章,我们将实现不同概率密度估计方法下的贝叶斯多分类算法。

二、数据集简介

  本文中使用的数据集结构如下图:

训练数据为190x10515的大小,190代表数据维数,10515代表数据样本数。即训练数据由10515个190维的样本组成。测试数据也是190维,样本数为10510.剩下两个数组存储的是训练标签和测试标签,用1、2、3……表示类别,一共17类。

三、使用参数估计方法实现多分类

  与二分类的编程实现相似,对每一个样本,分别计算每一类的判别函数,将该样本归到判别函数最大的那一类。相关代码如下:
导入数据并获取数据相关信息,如数据集大小。

clear
warning off;
load('Mult-class Problem.mat');% 导入数据

tic

class_nums=Label_training(end);% 获取类别数
test_nums=size(Testing_data,2);% 获取测试集大小
train_nums=size(Training_data,2);    % 获取训练集大小

估计每一类样本的参数,获取每一类数据的数量并计算先验概率。

for class=1:class_nums
    [miu(:,class),sigma(:,:,class)]=ParamerEstimation(Training_data(:,Label_training==class));% 参数估计
    num=size(Training_data(:,Label_training==class),2);% 每一类训练样本数
    pw(class)=num/train_nums;% 每一类的先验概率
end

遍历所有测试数据,得到测试数据在每一类的判别函数,将每个测试数据归到相应判别函数最大的那一类。并每隔100个数据打印一次实时正确率,方便观察程序进度以及分类器性能。

for i=1:test_nums
    for class=1:class_nums
        % 估计每一类的条件概率
        pxw(class)=gaussian(miu(:,class),sigma(:,:,class),Testing_data(:,i));
        % 判别函数
        g_x(class)=log(pw(class))+log(pxw(class));
    end
    % 将该样本归到判别函数最大的一类
    [~,argmax]=max(g_x);
    predict(i)=argmax;
    % 每隔100个样本打印一次已经归好类的数据分类正确率
    if mod(i,100) == 0
        acc=sum(predict==Label_testing(1:i))/(i);
        disp(['预测数据号:' num2str(i)])
        disp(['准确度是:' num2str(acc)])
    end
end

计算总正确率。

% 计算总的正确率        
acc=sum(predict==Label_testing)/(test_nums);
toc
disp(['总准确度是:' num2str(acc)])     

完整代码如下:

clear
warning off;
load('Mult-class Problem.mat');% 导入数据

tic

class_nums=Label_training(end);% 获取类别数
test_nums=size(Testing_data,2);% 获取测试集大小
train_nums=size(Training_data,2);    % 获取训练集大小

Training_temp=0;
predict=0;% 初始化结果

for class=1:class_nums
    [miu(:,class),sigma(:,:,class)]=ParamerEstimation(Training_data(:,Label_training==class));% 参数估计
    num=size(Training_data(:,Label_training==class),2);% 每一类训练样本数
    pw(class)=num/train_nums;% 每一类的先验概率
end
for i=1:test_nums
    for class=1:class_nums
        % 估计每一类的条件概率
        pxw(class)=gaussian(miu(:,class),sigma(:,:,class),Testing_data(:,i));
        % 判别函数
        g_x(class)=log(pw(class))+log(pxw(class));
    end
    % 将该样本归到判别函数最大的一类
    [~,argmax]=max(g_x);
    predict(i)=argmax;
    % 每隔100个样本打印一次已经归好类的数据分类正确率
    if mod(i,100) == 0
        acc=sum(predict==Label_testing(1:i))/(i);
        disp(['预测数据号:' num2str(i)])
        disp(['准确度是:' num2str(acc)])
    end
end
% 计算总的正确率        
acc=sum(predict==Label_testing)/(test_nums);
toc
disp(['总准确度是:' num2str(acc)])        

运行结果分析:运行耗时349秒,最终的正确率是77.36%。运行结果如下图:


四、总结

  多分类的实现从原理上来讲只是二分类的推广,即从比较两个判别函数推广至比较多个判别函数。多分类涉及到的数据集数量一般来说远远大于二分类,这也就造成了多分类器的耗时巨大。此外,多分类器不像二分类,它不存在线性可分的情况,因此多分类任务一般不会达到100%的分类正确率,比如我们本篇文章的例子,正确率不足80%。
  通过之前的文章,我们也可以想到,使用非参数估计可能会达到更好的效果,首先耗时一定会大大降低,但是否还能像二分类任务一样维持高正确率呢?接下来的文章将为大家解读。

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

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

举报反馈

举报类型

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

详细说明

审核成功

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

审核失败

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

小包子的红包

恭喜发财,大吉大利

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

    易百纳技术社区