对于二维数据,分离超平面是一条线,而对于一维数据,超平面则简化为一个点。绘制一维数据的分离超平面最简单的方法是通过一些技巧:
数据被转换为二维,通过添加第二个特征并将其值设置为所有样本的0来实现。这样做,权重向量的第二个分量为零,即
w=[
w0, 0](请参见本文末附录)。由于
w1=0且
w1在定义分离线的斜率和y截距项的表达式的分母中(请参见附录),因此两个系数都为∞。在这种情况下,解出关于
x的分离超平面方程是方便的,结果为
x=
x0=-b/
w0。边缘结果为2/
w0(详见附录)。
以下脚本实现了这种方法:
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
np.random.seed(0)
pos = np.hstack((np.random.randn(20, 1) + 1, np.zeros((20, 1))))
neg = np.hstack((np.random.randn(20, 1) - 1, np.zeros((20, 1))))
X = np.r_[pos, neg]
Y = [0] * 20 + [1] * 20
clf = svm.SVC(kernel='linear')
clf.fit(X, Y)
w = clf.coef_[0]
x_0 = -clf.intercept_[0]/w[0]
margin = w[0]
plt.figure()
x_min, x_max = np.floor(X.min()), np.ceil(X.max())
y_min, y_max = -3, 3
yy = np.linspace(y_min, y_max)
XX, YY = np.mgrid[x_min:x_max:200j, y_min:y_max:200j]
Z = clf.predict(np.c_[XX.ravel(), np.zeros(XX.size)]).reshape(XX.shape)
plt.pcolormesh(XX, YY, Z, cmap=plt.cm.Paired)
plt.plot(x_0*np.ones(shape=yy.shape), yy, 'k-')
plt.plot(x_0*np.ones(shape=yy.shape) - margin, yy, 'k--')
plt.plot(x_0*np.ones(shape=yy.shape) + margin, yy, 'k--')
plt.scatter(pos, np.zeros(shape=pos.shape), s=80, marker='o', facecolors='none')
plt.scatter(neg, np.zeros(shape=neg.shape), s=80, marker='^', facecolors='none')
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.show()
尽管上述代码已经很明显,但这里有一些提示。
X
的维度是40行2列:第一列中的值是随机数,而第二列的所有元素都是零。在代码中,权重向量
w = [
w0, 0]和截距
b分别为
clf_coef_[0]
和
clf.intercept_[0]
,其中
clf
是
sklearn.svm.SVC
返回的对象。
当运行脚本时,您将得到以下绘图:
![Plot of separating hyperplane for one-dimensional data](https://istack.dev59.com/ZIKBE.webp)
为了更清晰明了,建议通过添加/减去一个小常数来调整上述代码的第二个特征,例如:
plt.scatter(pos, .3 + np.zeros(shape=pos.shape), ...)
plt.scatter(neg, -.3 + np.zeros(shape=neg.shape), ...)
通过这样做,可显著提高可视化效果,因为不同的类别可以显示而不重叠。
附录
![\mathbf{w}^{\top}\mathbf{x}+b=0](https://latex.codecogs.com/gif.latex?%5Cmathbf%7Bw%7D%5E%7B%5Ctop%7D%5Cmathbf%7Bx%7D+b=0)
其中x是一个n维向量,w是权重向量,b是偏置或截距。当n=2时,我们有w0.x+w1.y+b=0。经过一些代数运算,我们得到y=-(w0/w1).x+(-b/w1)。从这个表达式可以清楚地看出,在二维特征空间中,判别超平面是方程y=a.x+y0的一条直线,其中斜率由a=-w0/w1给出,y截距项为y0=-b/w1。在SVM中,分离超平面的边距是2/‖w‖,对于二维情况,它缩小到
![\frac{2}{\sqrt{w_0^2+w_1^2}}](https://latex.codecogs.com/gif.latex?%5Cfrac%7B2%7D%7B%5Csqrt%7Bw_0%5E2+w_1%5E2%7D%7D)