【问题标题】:How to plot svm hyperplane with only one feature如何绘制只有一个特征的 svm 超平面
【发布时间】:2020-01-28 06:33:43
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python machine-learning scikit-learn svm data-analysis


    【解决方案1】:

    这是一个有趣的问题。从表面上看,它非常简单——一个特征意味着一维,因此超平面必须是 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。

    【讨论】:

      猜你喜欢
      • 2014-08-22
      • 2016-07-20
      • 2020-07-28
      • 2014-07-13
      • 2018-03-12
      • 2021-03-09
      • 2018-06-18
      • 2016-06-19
      相关资源
      最近更新 更多