这是一个有趣的问题。从表面上看,它非常简单——一个特征意味着一维,因此超平面必须是 0 维,即一个点。然而 scikit-learn 给你的是一条线。所以问题实际上是如何把这条线变成一个点。
我花了大约一个小时在 scikit-learn 的文档中寻找答案,但一维 SVM 分类器根本没有任何内容(可能是因为它们不实用)。所以我决定用下面的示例代码来看看我是否能找到答案:
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 是标签数组(“0”类的 100 个和“1”类的 100 个)。直观地说,超平面应该在 0 到 10 之间。
一旦你拟合了分类器,你就会发现截距大约是 -0.96,这与 0-d 超平面(即一个点)应该在的位置相去甚远。但是,如果您取y=0 并反算x,它将非常接近5。现在尝试更改构成X 的分布的均值,您会发现答案始终是-intercept/slope。这就是分类器的 0 维超平面(点)。
因此,要进行可视化,您只需将数据绘制在数轴上(为类使用不同的颜色),然后绘制通过将负截距除以斜率获得的边界。我不确定如何绘制数轴,但您始终可以使用散点图,将所有 y 坐标设置为 0。