前两篇博客涉及到的SVM还只是一个线性分类器,如果在二维情况下遇到如下的情况,线性分类器的效果就不会很好了
这个时候我们就需要一个叫做核函数的东西,简单来说它的最大作用就是把低维数据映射到高维数据,具体可以看前面推荐的一篇文章http://www.thebigdata.cn/JieJueFangAn/12661.html中核函数的部分,这里借用两张图来演示效果
这样我们就能分割开了,一个比较通俗的理解是:一个物体当你一个属性无法描述清楚时,就多增加几个属性来描述它,在无限个属性之内总能够描述清楚,而如何增加属性来描述它呢,需要的是核函数。
在之前的代码中,我们相当于使用了线性核函数(X*Xi.T),而这次为了分类如图的数据,我们需要使用径向基函数得高斯版本
我们需要把之前涉及到线性核函数的部分替换掉,并且增加一部分用来计算和保存核函数
在前两篇的SVM.py中添加以下部分
def kernelTrans(X, A, kTup):
m, n = shape(X)
K = mat(zeros((m, 1)))
if kTup[0] == 'lin':
K = X * A.T
elif kTup[0] == 'rbf':
for j in xrange(m):
deltaRow = X[j, :] - A
K[j] = deltaRow * deltaRow.T
K = exp(K / (-1 * kTup[1] ** 2))
else:
raise NameError('Houston We Have a Problem -- That Kernel is not recognized')
return K
在SVM.py中修改以下部分:
class optStruct:
def __init__(self, dataMatIn, classLabels, C, toler, kTup):
self.X = dataMatIn
self.labelMat = classLabels
self.C = C
self