首页 > 技术知识 > 正文

一、从二分类到多分类

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

二、数据集简介

  本文中使用的数据集结构如下图: 贝叶斯多分类之参数估计方法 训练数据为190×10515的大小,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%。运行结果如下图: 贝叶斯多分类之参数估计方法1 贝叶斯多分类之参数估计方法2 贝叶斯多分类之参数估计方法3

四、总结

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

猜你喜欢