scikits learn SVM - 1维分离超平面

时间:2016-07-29 10:59:08

标签: python numpy matplotlib scikit-learn svm

如何绘制分离"超平面"对于使用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 个答案:

答案 0 :(得分:1)

.coef_的{​​{1}}成员将返回"超平面,"从一个方面来说,这只是一个观点。查看this post以获取有关如何在数字线上绘制点的信息。

答案 1 :(得分:0)

二维数据的分离超平面是一条线,而对于一维数据,超平面可以归结为一个点。绘制一维数据的分离超平面的最简单方法是有点黑客攻击:通过添加第二个特征,将数据设为二维,所有第二个特征都取值为0。通过这样做,权重向量的第二个分量为零,即 w = [ w 0 ,0](参见附录中的这篇文章的结尾)。由于 w 1 = 0且 w 1 位于定义斜率和y的表达式的分母中 - 分隔线的术语(见附录),两个系数均为∞。在这种情况下,方便的是求解 x 的分离超平面方程,这导致 x = x 0 = -b / w 0 。边际变为± w 0 (详见附录)。

以下脚本实现了这种方法:

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 = [ w 0 ,0]和拦截 b 是{{如果clf_coef_[0]返回的对象,则分别为{}}和clf.intercept_[0]

这是脚本运行时得到的情节:

Plot of separating hyperplane for one-dimensional data

为了清楚起见,我建议通过在第二个特征中添加/减去一个小常量来调整上面的代码,例如:

clf

通过这样做,可视化得到显着改善,因为不同的类显示没有重叠。

附录

分离超平面通常表示为 w t x + b = 0,其中 x n 维向量, w 是权重向量, b 是偏差或截距。对于 n = 2,我们有 w 0 .x + w 1 .y + b = 0.在一些代数之后我们得到 y = - ( w 0 / w < sub> 1 )。 x +( - b / w 1 ) 。从这个表达式可以清楚地看出,2D特征空间中的判别超平面是等式线 y = ax + y 0 ,其中斜率由 a = - w 0 / w 1 给出和y截距项是 y 0 = - b / w 1 。在SVM中,分离超平面的边界为±‖ w ‖,其中2D减小为sqrt( w 0 2 < / em> + w 1 2 )。