天气晴 和妈妈在家(因疫情延迟开学)
今日小任务:使用matlab完成多分类(svm+ovr)
SVM也叫支持向量机,其是一个二类分类器,但是对于多分类,SVM也可以实现。主要方法就是训练多个二类分类器。常见的有以下两种方式:
一对一(one-vs-one)
给定m个类,对m个类中的每两个类都训练一个分类器,总共的二类分类器个数为 m(m-1)/2 。比如有三个类,1,2,3,那么需要有三个分类器,分别是针对:1和2类,1和3类,2和3类。对于一个需要分类的数据x,它需要经过所有分类器的预测,最后使用投票的方式来决定x最终的类属性。
一对多(one-vs-rest)【今天重点学习】
给定m个类,需要训练m个二类分类器。其中的分类器 i 是将 i 类数据设置为类1(正类),其它所有m-1个i类以外的类共同设置为类2(负类),这样,针对每一个类都需要训练一个二类分类器,最后,我们一共有 m 个分类器。对于一个需要分类的数据 x,通常选择置信度最大的类别标记为分类结果。
举个例子:假如我有四类要划分(也就是有存在四个Label),他们是A、B、C、D。 于是我在抽取训练集的时候,分别选取四个训练集如下:
1.A所对应的向量作为正集,B,C,D所对应的向量作为负集;
2.B所对应的向量作为正集,A,C,D所对应的向量作为负集;
3.C所对应的向量作为正集,A,B,D所对应的向量作为负集;
4.D所对应的向量作为正集,A,B,C所对应的向量作为负集;
可以概括为 自己一类为正集 其余类为负集,N个类别(N个label)有N个训练集
使用这四个训练集分别进行训练,然后的得到四个训练结果文件。在测试的时候,把对应的测试向量分别利用这四个训练结果文件进行测试,每个测试都有一个结果f1(x),f2(x),f3(x),f4(x),最终的结果便是这四个值中最大的一个作为分类结果。
注:这种方法有种缺陷,因为训练集是1:M,这种情况下存在biased,因而不是很实用。在菜菜的sklearn讲解《SVM(下)》中也提到:当类别更多的时候,无论是ovr还是ovo模式需要的决策边界都会越来越多,模型也会越来越复杂,不过ovo模式下的模型计算会更加复杂,因为ovo模式中的决策边界数量增加更快,但相对的,ovo模型也会更加精确。ovr模型计算更快,但是效果往往不是很好。在硬件可以支持的情况下,还是建议选择ovo模式。
使用ovr模式还可能存在以下两个问题:
1.一个是一个样本可能同时属于几个类
那么看一下这个样本到各个超平面的距离,哪个远判给哪个
2.另一个是一个样本可能不属于任何一个
这样这个样本属于第N+1类,这个类的数目远大于N类之和,所以会造成数据偏斜问题。
Matab代码实现:
测试数据Wine来源UCI(UC Irvine Machine Learning Repository)。数据记录的是在意大利某一地区同一区域上三种不同品种的酒的化学成分分析,数据里含有178个样本属于三个类别(类别标签已给),每个样本含有13个特征分量。
算法部分代码和第一次运行结果 算法部分代码和第二次运行结果UCI数据集下载地址:UC Irvine Machine Learning Repository(找到右侧红酒数据集下载)
台湾林智仁libsvm工具箱(ovo模式)下载地址:LIBSVM -- A Library for Support Vector Machines
参考资料:
代码部分:https://blog.csdn.net/qq_23016555/article/details/96429399
理论部分:https://www.jianshu.com/p/4743a4b5b610
记录学习的第一天,感觉还不错诶!希望吉吉可以坚持介个好习惯。
好啦,去午休啦,在电脑上前坐了已经三个小时啦,休息一下!
今天也要开心地度过呀,嘻~
网友评论