西瓜书 习题6.2 用线性核、高斯核训练SVM

SVM手动实现底层代码有些麻烦,这里借助sklearn实现了一下,数据以及代码地址:

https://github.com/qdbszsj/SVM


import pandas as pd
import numpy as np
dataset = pd.read_csv('/home/parker/watermelonData/watermelon3_0a.csv', delimiter=",")
# print(dataset)

X=dataset.iloc[range(17),[1,2]].values
y=dataset.values[:,3]
print("trueV",y)
trueV=y
from sklearn import svm

linearKernalMethod=svm.SVC(C=10000,kernel='linear')#C=1 defaultly
linearKernalMethod.fit(X,y)
predictV=linearKernalMethod.predict(X)

print("linear",predictV)

confusionMatrix=np.zeros((2,2))
for i in range(len(y)):
    if predictV[i]==trueV[i]:
        if trueV[i]==0:confusionMatrix[0,0]+=1
        else: confusionMatrix[1,1]+=1
    else:
        if trueV[i]==0:confusionMatrix[0,1]+=1
        else:confusionMatrix[1,0]+=1
print("linearConfusionMatrix\n",confusionMatrix)


rbfKernalMethod=svm.SVC(C=10000,kernel='rbf')#C=1 defaultly
rbfKernalMethod.fit(X,y)
predictV=rbfKernalMethod.predict(X)

print("rbf",predictV)

confusionMatrix=np.zeros((2,2))
for i in range(len(y)):
    if predictV[i]==trueV[i]:
        if trueV[i]==0:confusionMatrix[0,0]+=1
        else: confusionMatrix[1,1]+=1
    else:
        if trueV[i]==0:confusionMatrix[0,1]+=1
        else:confusionMatrix[1,0]+=1
print("rbfConfusionMatrix\n",confusionMatrix)
这里的核函数,用了linear和rbf(radial basis function)俗称线性核和高斯核(径向基函数)

然后这个C值是用来调软间隔的,C值越大说明数据本身越重要,软间隔小,不容许分类差错。C值无穷大意味着完全不允许软间隔,就是变成硬间隔的SVM。

在这里,我们发现用线性核函数,无论如何也无法完全划分数据集,因为数据集本身就不是线性可分的,但是用高斯核函数,当我们把C值逐渐调大的时候,我们发现可以完整地划分这个数据集,不产生任何差错。

情况不明时往往使用高斯核函数,对于文本数据等已知线性可分的数据可以用线性核。

实验结果:C值是10000的时候的结果。

西瓜书 习题6.2 用线性核、高斯核训练SVM_第1张图片


你可能感兴趣的:(ML)