scikits learn SVM - 一维分离超平面

3

如何使用scikit svm绘制一维数据的分离“超平面”?

我按照这个指南处理了二维数据: http://scikit-learn.org/stable/auto_examples/svm/plot_svm_margin.html, 但不知道如何将其应用于一维数据。

pos = np.random.randn(20, 1) + 1
neg = np.random.randn(20, 1) - 1
X = np.r_[pos, neg]
Y = [0] * 20 + [1] * 20
clf = svm.SVC(kernel='linear', C=0.05)
clf.fit(X, Y)

# how to get "hyperplane" and margins values ??

谢谢

2个回答

5
对于二维数据,分离超平面是一条线,而对于一维数据,超平面则简化为一个点。绘制一维数据的分离超平面最简单的方法是通过一些技巧:数据被转换为二维,通过添加第二个特征并将其值设置为所有样本的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],其中clfsklearn.svm.SVC返回的对象。

当运行脚本时,您将得到以下绘图:

Plot of separating hyperplane for one-dimensional data

为了更清晰明了,建议通过添加/减去一个小常数来调整上述代码的第二个特征,例如:
plt.scatter(pos, .3 + np.zeros(shape=pos.shape), ...)
plt.scatter(neg, -.3 + np.zeros(shape=neg.shape), ...)

通过这样做,可显著提高可视化效果,因为不同的类别可以显示而不重叠。

附录


其中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‖,对于二维情况,它缩小到


1
clf.coef_成员将返回“超平面”,在一维中,它只是一个点。请查看this post以获取有关如何在数轴上绘制点的信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接