绘制超平面线性 SVM python
Posted
技术标签:
【中文标题】绘制超平面线性 SVM python【英文标题】:Plot hyperplane Linear SVM python 【发布时间】:2018-03-12 16:03:15 【问题描述】:我正在尝试为我使用 LinearSVC 和 sklearn 训练的模型绘制超平面。请注意,我正在使用自然语言;在拟合模型之前,我使用 CountVectorizer 和 TfidfTransformer 提取了特征。
这里是分类器:
from sklearn.svm import LinearSVC
from sklearn import svm
clf = LinearSVC(C=0.2).fit(X_train_tf, y_train)
然后我尝试按照on the Scikit-learn website的建议进行绘图:
# get the separating hyperplane
w = clf.coef_[0]
a = -w[0] / w[1]
xx = np.linspace(-5, 5)
yy = a * xx - (clf.intercept_[0]) / w[1]
# plot the parallels to the separating hyperplane that pass through the
# support vectors
b = clf.support_vectors_[0]
yy_down = a * xx + (b[1] - a * b[0])
b = clf.support_vectors_[-1]
yy_up = a * xx + (b[1] - a * b[0])
# plot the line, the points, and the nearest vectors to the plane
plt.plot(xx, yy, 'k-')
plt.plot(xx, yy_down, 'k--')
plt.plot(xx, yy_up, 'k--')
plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1],
s=80, facecolors='none')
plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired)
plt.axis('tight')
plt.show()
此示例使用 svm.SVC(kernel='linear'),而我的分类器是 LinearSVC。因此,我收到此错误:
AttributeError Traceback (most recent call last)
<ipython-input-39-6e231c530d87> in <module>()
7 # plot the parallels to the separating hyperplane that pass through the
8 # support vectors
----> 9 b = clf.support_vectors_[0]
1 yy_down = a * xx + (b[1] - a * b[0])
11 b = clf.support_vectors_[-1]
AttributeError: 'LinearSVC' object has no attribute 'support_vectors_'
如何成功绘制我的 LinearSVC 分类器的超计划?
【问题讨论】:
这里是:scikit-learn.org/0.18/auto_examples/svm/… 我知道在那个例子中他们为线性 SVM 使用了另一个内核,但我想绘制我的分类器 好吧,这个问题看起来就像您正在寻找错误的原因,但正如文档中明确指出的那样:“请注意,LinearSVC 不接受关键字内核,因为这被认为是线性的。它还缺少一些 SVC 和 NuSVC 的成员,例如support_
。" 我对 LinearSVC 的用法了解不多,但我想您可以改写问题以明确您想要与SVC
类似的输出,但使用LinearSVC
代替,它没有'support_vectors_'
属性。这样人们就不需要深入挖掘来找到显而易见的东西。
【参考方案1】:
如果没有为LinearSVC
定义的support_
不存在呢?
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
np.random.seed(0)
X = np.r_[np.random.randn(20, 2) - [2, 2], np.random.randn(20, 2) + [2, 2]]
Y = [0] * 20 + [1] * 20
fig, ax = plt.subplots()
clf2 = svm.LinearSVC(C=1).fit(X, Y)
# get the separating hyperplane
w = clf2.coef_[0]
a = -w[0] / w[1]
xx = np.linspace(-5, 5)
yy = a * xx - (clf2.intercept_[0]) / w[1]
# create a mesh to plot in
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx2, yy2 = np.meshgrid(np.arange(x_min, x_max, .2),
np.arange(y_min, y_max, .2))
Z = clf2.predict(np.c_[xx2.ravel(), yy2.ravel()])
Z = Z.reshape(xx2.shape)
ax.contourf(xx2, yy2, Z, cmap=plt.cm.coolwarm, alpha=0.3)
ax.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.coolwarm, s=25)
ax.plot(xx,yy)
ax.axis([x_min, x_max,y_min, y_max])
plt.show()
【讨论】:
它在这一行失败:----> 8 x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 错误: TypeError: unhashable type: 'slice' 是的,我正在运行确切的代码。我使用 python 3.6、sklearn 0.19、numpy 1.13 我尝试重新启动内核,现在它可以工作了。但是现在我该如何绘制我训练过的模型的超平面呢? 超平面到底是什么意思?这不是答案中显示的吗? 是的,就是这样。但在此图中,它显示了随机生成的点。我想绘制我的模型分类的那些以上是关于绘制超平面线性 SVM python的主要内容,如果未能解决你的问题,请参考以下文章