监督算法大比拼之BP、SVM、adaboost非线性多分类实验

写在之前:

前些文章曾经细数过从决策树、贝叶斯算法等一些简单的算法到神经网络(BP)、支持向量机(SVM)、adaboost等一些较为复杂的机器学习算法(对其中感兴趣的朋友可以往前的博客看看),各种算法各有优缺点,基本上都能处理线性与非线性样本集,然通观这些算法来看,个人感觉对于数据(无论线性还是非线性)的分类上来说,里面比较好的当数BP、SVM、adaboost元算法这三种了,由于前面在介绍相应算法原理以及实验的时候所用的样本以及分类情况都是二分类的,对于多分类的情况未曾涉及过,而实际情况往往是分类多分类数据的样本较多,本节旨在对BP、SVM、adaboost这三种个人感觉较好的算法进行一个对比,同时实验一个简单的非线性多分类样本

一:理解与分析

既然是多分类样本,首先对样本需要理解,所谓多分类就是样本集中不止2类样本,至少3类才称得上是多分类。比如下面一个二维非线性的多类样本集(这也是后面我们实验的样本集):
这里写图片描述
每种颜色代表一类,可以看到共有5类,同时也可以看到是一个非线性的吧,这里可以就把五类分别设置为1~5类类标签。

好了,曾经在单个算法介绍的时候,里面的实验都是二分类的(也就是只有上述5类样本中的两类),二分类的方式很简单,不是你就是我的这种模式,那么从二分类到多分类该怎么转换呢?假如一个样本不是我,那也可能不是你呀,可能是他它她对吧,这个时候该如何呢?

现在一般的方式都是将多分类问题转化为二分类问题,因为前面许多算法在原理推导上都是假设样本是二分类的,像SVM,整个推导过程以至结论都是相对二分类的,根本没有考虑多分类,依次你想将SVM直接应用于多分类是不可能的,除非你在从原理上去考虑多分类的情况,然后得到一个一般的公式,最后在用程序实现这样才可以。

那么多分类问题怎么转化为二分类问题?很简单,一个简单的思想就是分主次,采取投票机制。转化的方式有两种,因为分类问题最终需要训练产生一个分类器,产生这个分类器靠的是训练样本,前面的二分类问题实际上就是产生了一个分类器,而多分类问题根据训练集产生的可不止是一个分类器,而是多个分类器。

第一种方式就是将训练样本集中的某一类当成一类,其他的所有类当成另外一类,像上面的5类,我把最中间的一类当成是第一类,并重新赋予类标签为1,而把四周的四类都认为是第二类,并重新赋予类标签维-1,好了现在的问题是不是就是二分类问题了?是的。那二分类好办,用之前的任何一个算法处理即可。好了,这是把最中间的当成一类的情况下建立的一个分类器。同理,我们是不是也可以把四周任何一类自成一类,而把其他的统称为一类呀?当然可以,这样依次类推,我们共建立了几个分类器?像上面5类就建立了5个分类器吧,好了到了这我们该怎么划分测试集的样本属于哪一类了?注意测试集是假设不知道类标签的,那么来了一个测试样本,我把它依次输入到上述建立的5个分类器中,看看最终它属于哪一类的多,那它就属于哪一类了吧。比如假设一个测试样本本来是属于中间的(假设为第5类吧),那么先输入第五类自成一类的情况,这个时候发现它属于第五类,记录一下5,然后再输入左上角(假设为1类)自成一类的情况,那么发现这个样本时不属于1类的,而是属于2,3,4,5这几类合并在一起的一类中,那么它属于2,3,4,5中的谁呢?都有可能吧,那么我都记一下,此时记一下2,3,4,5。好了再到有上角,此时又可以记一下这个样本输入1,3,4,5.依次类推,最后把这5个分类器都走一遍,就记了好多1~5的标签吧,然后去统计他们的数量,比如这里统计1类,发现出现了3次,2,3,4都出现了3次,就5出现了5次,那么我们就有理由认为这个样本属于第五类,那么现在想想是不是就把多类问题解决了呢?而这个过程参考这位大神博客中的一张图表示就如下:
这里写图片描述
可以看到,其实黑实线本类是我们想要的理想分类面,而按照这种方式建立的分类面是带阴影部分的那个分类面,那阴影部分里面表示什么呢?我们想想,假设一个样本落在了阴影里面,比如我画的那个紫色的点,按照上面计算,发现它属于三角形一类的2次,属于正方形一类的2次,属于圆形一类的1次,那这个时候你怎么办?没招,只能在最大的两次中挑一个,运气好的认为属于三角形,挑对了,运气不好的挑了个正方形,分错了。所以阴影部分是属于模棱两可的情况,这个时候只能挑其中一个了。

这是第一种方式,那还有第二种分类方式,思想类似,也是转化为二分类问题,不过实现上不同。前面我们是挑一类自成一类,剩下的所有自成一类,而这里,也是从中挑一类自成一类,然剩下的并不是自成一类,而是在挑一类自成一类,也就是说从训练样本中挑其中的两类来产生一个分类器。像上述的5类,我先把1,2,类的训练样本挑出来,训练一个属于1,2,类的分类器,然后把1,3,挑出来训练一个分类器,再1,4再1,5再2,3,等等(注意2,1与1,2一样的,所以省去了),那这样5类样本需要建立多少个分类器呢?n*(n-1)/2吧,这里就是5*4/2=10个分类器,可以看到比上面的5个分类器多了5个。而且n越大,多的就越多。好了建立完分类器,剩下的问题同样采取投票机制,来一个样本,带到1,2建立的发现属于1,属于1类的累加器加一下,带到1,3建立的发现也属于1,在加一下,等等等等。最后看看5个类的累加器哪个最大就属于哪一类。那么一个问题来了,会不会出现像上面那种情况,有两个或者更多个累加器的值是一样的呢?答案是有的,但是这种情况下,出现一样的概率可比上述情况的概率小多了(比较是10个分类器来的结果,怎么也得比你5个的要好吧),同样一个示意图如下:
这里写图片描述
可以看到重叠部分就是中间那么一小块,相比上面那种方式小了不少吧。
那么细比较这两种方式,其实各有优缺点。第一种方式由于建立的分类器少(n越大越明显吧,两者相差(n*(n-1)/2 - n)个分类器)。也就是在运算的时候速度更快,而第二种方式虽然速度慢,但是精度高呀,而且现在计算机的速度也够快了,可以弥补第二种方式的缺点,所以个人更倾向于第二种方式了。
好了说完了理论部分,实践起来吧,实践是检验真理的唯一方法

二:BP模式识别工具箱处理多分类实验

首先采用神经网络算法来实验,同时为了速度与准确率,我们实验matlab的神经网络工具箱,关于该工具箱怎么用,请参考:

机器学习之实战matlab神经网络工具箱

为了实现较好的效果,这里我们直接使用matlab在BP下建立起来的模式识别工具箱(nprtool)。该工具箱的使用可以通过GUI界面直接操作,也可以命令操作,需要说明一点的就是数据的输入形式,尤其是对于类标签的设置,在该工具箱下,类标签已经不再是用数字1~5直接表示,而是用一个向量,比如类别1可以表示为[1,0,0,0,0],类别3可以表示为[0,0,1,0,0]这种表示方式。同时如果样本输入每一行表示一个样本,那么类别就得像上面那一,每一行表示一个样本类别。如果每一列为一个样本,那么对应的标签也是每一列一个样本,下面实验每一列表示一个样本的样本集:

%%  
% * matlab模式识别工具箱的分类设计
% * 多类非线性分类
% 
%% 
clc
clear
close all
%% Load data
% * 数据预处理
data = load('data_test.mat');
data = data.data;
%选择训练样本个数
num_train = 200;%共500个样本
%构造随机选择序列
choose = randperm(length(data));
train_data = data(choose(1:num_train),:);
label_temp = train_data(:,end);
label_train = 
  • 31
    点赞
  • 153
    收藏
    觉得还不错? 一键收藏
  • 53
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 53
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值