(转载请注明出处:http://blog.csdn.net/buptgshengod)
1.背景知识
前面我们提到的数据集都是线性可分的,这样我们可以用SMO等方法找到支持向量的集合。然而当我们遇到线性不可分的数据集时候,是不是svm就不起作用了呢?这里用到了一种方法叫做核函数,它将低维度的数据转换成高纬度的从而实现线性可分。
可能有的人不明白为什么低维度的数据集转换成高维度的就可以实现线性可分,下面摘抄一个网上的例子解释一下。看下面这个图,我们设红色的区域是一组数据
,而直线ab除了红色区域以外是另一组数据。因为直线是一维的,所以我们无法找到一条直线区分这两组数据。
单是当我们把这组数据引入二维之后,我们可以得到一组曲线,它在ab直线上部分指向黑色直线部分,ab直线下部指向红色部分。
我们通过这个例子可以看到核函数的作用,因为svm的结果只跟向量内积有关系,所以我们可以配合核函数实现任意数据集的分类。如果有人问,如果就是有一定的点数使得我们无论增加多少维度都不能实现分类,这就是引用松弛变量的意义,忽略这一部分点,因为它们很有可能是噪声。
2.代码部分
因为核函数有很多种类,比较常用的就是径向基核函数(RBF),这个准确率是比较高的。公式:
K = exp(K/(-1*kTup[1]**2))