如何在仅有一个特征的情况下绘制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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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