如何绘制只有一个特征的支持向量机超平面

How to plot svm hyperplane with only one feature

我有一个具有一个特征的数据集,我正在使用 scikit-learn 训练一个支持向量分类器。我想可视化结果,但我对如何绘制散点图有点困惑。我通过执行以下操作获得我的超平面:

slope = clf.coef_[0][0]
intercept = clf.intercept_[0]

这给了我 y = -.01x + 2.5

我假设这是我的超平面。我似乎无法弄清楚如何仅使用一个功能来绘制我的数据。我的 y 轴用什么?

这是一个有趣的问题。从表面上看,它非常简单——一个特征意味着一维,因此超平面必须是 0 维的,即一个点。然而,scikit-learn 给你的是一条线。所以问题实际上是如何将这条线变成一个点。

我花了大约一个小时在 scikit-learn 的文档中寻找答案,但在 1-d SVM classifier 上根本没有任何内容(可能是因为它们不实用)。所以我决定试一试下面的示例代码,看看我是否能找出答案:

from sklearn import svm

n_samples = 100
X = np.concatenate([np.random.normal(0,0.1,n_samples), np.random.normal(10,0.1,n_samples)]).reshape(-1,1)
y = np.array([0]*n_samples+[1]*n_samples)
clf = svm.LinearSVC(max_iter = 10000)
clf.fit(X,y)  
slope = clf.coef_
intercept = clf.intercept_
print(slope, intercept)
print(-intercept/slope)

X 是样本数组,前 100 个点从 N(0,0.1) 中采样,接下来的 100 个点从 N(10,0.1) 中采样。 y 是标签数组(100 个 class '0' 和 100 个 class '1')。直觉上很明显超平面应该在 0 和 10 之间。

一旦你适应了 classifier,你会发现截距大约是 -0.96,这离 0-d 超平面(即一个点)应该的位置很远。然而,如果你取 y=0 并反算 x,它会非常接近 5。现在尝试改变构成 X 的分布的均值,你会发现答案总是-intercept/slope。那是 classifier 的 0-d 超平面(点)。

因此,为了可视化,您只需要在数轴上绘制数据(classes 使用不同的颜色),然后绘制通过将负截距除以斜率而获得的边界。我不确定如何绘制数轴,但您始终可以求助于所有 y 坐标都设置为 0 的散点图。