绘制超平面线性 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的主要内容,如果未能解决你的问题,请参考以下文章

如何绘制 SVM 分类超平面

绘制来自 svm 拟合的数据 - 超平面

如何为 SVM One-Versus-All 绘制超平面?

如何不让一个超平面影响多类线性核 SVM 中的决策?

R:如何在 ggplot2 中绘制 svm 的超平面和边距?

svm原理之svm分类超平面