我们以鸢尾花数据来说说如何利用svm做分类,由于svm是一个2分类的办法,所以我们将鸢尾花数据也分为两类,“setosa”与“versicolor”(将后两类均看做一类),那么数据按照特征:花瓣长度与宽度做分类,有分类:
从上图可以看出我们通过最优化原始问题或者对偶问题就可以得到w,b,利用 sign(w.xb)就可以判断分类了。
我们这里取3, 10,56, 68,107, 120号数据作为测试集,其余的作为训练集,我们可以看到:
训练集 setosa virginica
setosa 48 0
virginica 0 96
测试集 setosa virginica
setosa 2 0
virginica 0 4
也就是完全完成了分类任务。
我们来看看鸢尾花后两类的分类versicolor和virginica的分类,我们将数据的散点图描绘如下:(我们把第一类“setosa“看做”versicolor“)
不难发现这时无论怎么画一条线都无法将数据分开了,那么这么办呢?我们一个自然的办法就是允许分类有一部分的错误,但是错误不能无限的大。我们使用一个松弛项来分类数据。最优化问题转变为:
当我们确定好松弛项C后,就可以得到分类:
我们还是先来看看分类的效果:(C=10)
训练集 versicolor virginica
versicolor 93 2
virginica 3 46
测试集 versicolor virginica
versicolor 4 2
virginica 0 0
虽然分类中有一些错误,但是大部分还是分开了的,也就是说还是不错的,至少完成了分类这个任务。r语言 支持向量机分类
我们再来看看一个更麻烦的例子:
假设数据是这样的:
这时再用直线作为划分依据就十分的蹩脚了,我们这时需要引入核的方法来解决这个问题。
在上图中,我们一就能看出用一个S型去做分类就可以把数据成功分类了(当然是在允许一点点错误的情况下),但是计算机能识别的只有分类器的分类结果是-1还是1,这时,我们需要将数据做出某种形式的转换,使得原来不可用直线剖分的变得可分,易分。也就是需要找到一个从一个特征空间到另一个特征空间的映射。我们常用的映射有:
线性核:u'*v
多项式核:(gamma*u'*v coef0)^degree
高斯核:exp(-gamma*|u-v|^2)
Sigmoid核:tanh(gamma*u'*v coef0)
我们这里使用各种常见的核来看看分类效果:
从图中我们可以看到正态核的效果是最好的,用数据说话,我们来看看分类错误率与折10交叉验证的结果(报告平均分类正确率):
我们可以看到,无论从存储数据量的多少(支持向量个数)还是分类精确度来看,高斯核都是最优的。所以一般情况,特别是在大样本情况下,优先使用高斯核,至少可以得到一个不太坏的结果(在完全线性可分下,线性函数的支持向量个数还是少一些的)。
有许多介绍SVM的书都有类的表述“由于理解支持向量机需要掌握一些理论知识,而这对读者来说有一定的难度,建议直接下载LIBSVM使用。”
确实,如果不是为了训练一下编程能力,我们没有必要自己用前面提到的做法自己实现一个效率不太高的SVM。R的函数包e1071提供了libSVM的接口,使用e1071的函数SVM()可以得到libSVM相同的结果,write.svm()更是可以把R训练得到的结果写为标准的libSVM式供其他环境下的libSVM使用。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-30138-2.html
我们是“让它三分”
尽管此后3年一蹶不振