如何在仅有一个特征的情况下绘制SVM超平面

我有一个只包含一个特征的数据集,我使用scikit-learn训练了一个支持向量分类器。我想可视化结果,但我对如何绘制散点图有些困惑。我通过以下方式获得了超平面:

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

这给我得到了 y = -0.01x + 2.5

我假设这就是我的超平面。我似乎无法弄清楚如何在只有一个特征的情况下围绕这个超平面绘制我的数据。我应该用什么作为y轴呢?


回答:

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

我花了一个小时左右的时间在scikit-learn的文档中寻找答案,但关于1维SVM分类器的信息几乎没有(可能是因为它们不实用)。所以我决定尝试下面的示例代码,看看我能不能找到答案:

from sklearn import svmn_samples = 100X = 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个类别’0’和100个类别’1’)。直观上,很明显超平面应该在0和10之间的一半。

一旦你训练了分类器,你会发现截距大约是-0.96,这与0维超平面(即一个点)应该在的位置相差甚远。然而,如果你取y=0并反向计算x,它会非常接近5。现在尝试更改构成X的分布的均值,你会发现答案总是-intercept/slope。这就是分类器的0维超平面(点)。

所以为了可视化,你只需要在数轴上绘制你的数据(为不同的类别使用不同的颜色),然后绘制通过将负截距除以斜率获得的边界。我不确定如何绘制数轴,但你总可以使用所有y坐标设置为0的散点图来解决这个问题。

Related Posts

在使用k近邻算法时,有没有办法获取被使用的“邻居”?

我想找到一种方法来确定在我的knn算法中实际使用了哪些…

Theano在Google Colab上无法启用GPU支持

我在尝试使用Theano库训练一个模型。由于我的电脑内…

准确性评分似乎有误

这里是代码: from sklearn.metrics…

Keras Functional API: “错误检查输入时:期望input_1具有4个维度,但得到形状为(X, Y)的数组”

我在尝试使用Keras的fit_generator来训…

如何使用sklearn.datasets.make_classification在指定范围内生成合成数据?

我想为分类问题创建合成数据。我使用了sklearn.d…

如何处理预测时不在训练集中的标签

已关闭。 此问题与编程或软件开发无关。目前不接受回答。…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注