使用SVM对随机生成数据集进行分类 (线性可分 硬间隔)

具体数学原理参考《统计学习方法》

在学习过程中有疑惑如下:

使用SVM对随机生成数据集进行分类 (线性可分 硬间隔)_第1张图片

使用SVM对随机生成数据集进行分类 (线性可分 硬间隔)_第2张图片

一直想不明白为什么式7.11中的分子没有用并且可以被当作常数

下面的解释是当w与b同比例变换时,函数间隔(即分子)亦会同比例变换。的确是这样,自己纸上写一下就好。

但是为什么w和b一定要同比例变换?如果不同比例的话上述结论就不成立了啊?

后来自己想到的解释是:

我们最终要求的参数是w和b,而w和b组合在一起就代表了一个平面。对于整个问题而言,我们要找的就是一个可以是几何间隔最大的超平面,可以大体表示为y=f(x)的形式,其中x代表各个平面,y代表最大几何间隔,f代表我们求解的过程。在多项式中,我们如果将x换元为2*x、x+1等,是对x这个整体进行的操作。在这里也是一样的道理,必须对这个平面整体进行操作,即w',b'=2*(w,b)

 

 

 

svm在sklearn中被封装成了现成的工具

先生成线性可二分类的数据集 然后调用库函数即可求出代表超平面的w与b

 

import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn import svm
from matplotlib import pyplot as plt

np.random.seed(0)
X=np.r_[np.random.randn(20,2)-[3,3],np.random.randn(20,2)+[3,3]]
Y=20*[0]+20*[1]

clf=svm.SVC(kernel='linear')
clf.fit(X,Y)
w,b=clf.coef_[0],clf.intercept_[0]
s=clf.support_vectors_
#print(w,b)
#print(s)

k,b0=-w[0]/w[1],-b/w[1]
b1=(w[0]*s[0][0]+w[1]*s[0][1])/w[1]
b2=(w[0]*s[2][0]+w[1]*s[2][1])/w[1]

plt.title('SVM')
plt.xlabel('X')
plt.ylabel('Y')
XX=np.linspace(-5,5)
YY0=k*XX+b0
YY1=k*XX+b1
YY2=k*XX+b2
plt.plot(XX,YY0,'-m',label='Hyperplane')
plt.plot(XX,YY1,'-c',label='Hard margin I')
plt.plot(XX,YY2,'-k',label='Hard margin II')
plt.legend(loc='upper left')
plt.scatter(X[0:20,0],X[0:20,1],s=10,c='r')
plt.scatter(X[20:40,0],X[20:40,1],s=10,c='b')
for i in s:
    plt.scatter(i[0],i[1],s=20,c='g',linewidths=2,edgecolors='y')
plt.grid()
plt.show()

效果如下图所示:

使用SVM对随机生成数据集进行分类 (线性可分 硬间隔)_第3张图片

你可能感兴趣的:(AI)