【问题标题】:scikits learn SVM - 1-dimensional Separating Hyperplanescikits 学习 SVM - 一维分离超平面
【发布时间】:2016-12-04 01:43:32
【问题描述】:

如何使用 scikit svm 绘制一维数据的分离“超平面”?

我遵循二维数据指南:http://scikit-learn.org/stable/auto_examples/svm/plot_svm_margin.html,但不知道如何使其适用于一维数据

pos = np.random.randn(20, 1) + 1
neg = np.random.randn(20, 1) - 1
X = np.r_[pos, neg]
Y = [0] * 20 + [1] * 20
clf = svm.SVC(kernel='linear', C=0.05)
clf.fit(X, Y)

# how to get "hyperplane" and margins values ??

谢谢

【问题讨论】:

    标签: python numpy matplotlib scikit-learn svm


    【解决方案1】:

    二维数据的分离超平面是一条线,而对于一维数据,超平面将归结为一个点。绘制分离超平面的最简单方法是一维数据的一点:通过添加所有样本的第二个特征添加第二个特征,使数据进行二维。通过这样做,权重向量的第二组件为零,即 w = [ w 0 sub> sub>,0](请参阅附录这篇文章的结尾)。作为 w 1 sub> em> = 0和 w 1 sub> sum>是定义斜率和y的表达的分母-Intercept术语的分离线(见附录),两个系数都是∞。在这种情况下,求解分离超平面的分离超平面的等式,这导致 x em> = x 0 sub> EM> = -B / W 0 sub> em>。边缘是2 / W 0 sub> em>(有关详细信息,请参阅附录)。

    以下脚本实现此方法:

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn import svm
    
    np.random.seed(0)
    pos = np.hstack((np.random.randn(20, 1) + 1, np.zeros((20, 1))))
    neg = np.hstack((np.random.randn(20, 1) - 1, np.zeros((20, 1))))
    X = np.r_[pos, neg]
    Y = [0] * 20 + [1] * 20
    
    clf = svm.SVC(kernel='linear')
    clf.fit(X, Y)
    w = clf.coef_[0]
    x_0 = -clf.intercept_[0]/w[0]
    margin = w[0]
    
    plt.figure()
    x_min, x_max = np.floor(X.min()), np.ceil(X.max())
    y_min, y_max = -3, 3
    yy = np.linspace(y_min, y_max)
    XX, YY = np.mgrid[x_min:x_max:200j, y_min:y_max:200j]
    Z = clf.predict(np.c_[XX.ravel(), np.zeros(XX.size)]).reshape(XX.shape)
    plt.pcolormesh(XX, YY, Z, cmap=plt.cm.Paired)
    plt.plot(x_0*np.ones(shape=yy.shape), yy, 'k-')
    plt.plot(x_0*np.ones(shape=yy.shape) - margin, yy, 'k--')
    plt.plot(x_0*np.ones(shape=yy.shape) + margin, yy, 'k--')
    plt.scatter(pos, np.zeros(shape=pos.shape), s=80, marker='o', facecolors='none')
    plt.scatter(neg, np.zeros(shape=neg.shape), s=80, marker='^', facecolors='none')
    plt.xlim(x_min, x_max)
    plt.ylim(y_min, y_max)
    plt.show()
    

    虽然上面的代码是自我解释的,但这里有一些提示。 X尺寸为40行2列:第一列中的值是随机数,而第二列的所有元素都是零。在代码中,权重向量 w = [ w 0 sub> em>,0]和拦截 b em>是clf_coef_[0]clf.intercept_[0],分别,wehre clf如果sklearn.svm.SVC 987654330 @。

    ,这是您在脚本运行时获得的情节:

    为了清楚起见,我建议通过向第二个功能添加/减去小常数来调整上面的代码,例如:

    plt.scatter(pos, .3 + np.zeros(shape=pos.shape), ...)
    plt.scatter(neg, -.3 + np.zeros(shape=neg.shape), ...)
    

    通过这样做,因此显着提高了显着提升,因为没有重叠的不同类别。


    附录 h3> 分离的超平面通常表示为

    其中 x n em> - vimension view, w 是重量矢量, B Em>是偏差或拦截。对于 n em> = 2,我们有 w 0 sub> .x em> + w 1 sub> .y em> + B EM> = 0.在一些代数之后,我们获得 Y EM> = - ( W 0 sub> em> / w 1 sub> em>)。 x Em> +( - B EM> / W 1 sub> em>) 。它清楚地从这种表达中出现了2D特征空间中的判别超平面是一条等式 Y EM> = AX EM> + Y 0 sub> Em>,其中斜率由 a em> = - w 0 sub> em> / w 1 sub> em>和y截距术语是 y 0 sub> em> = - b em> / w 1 sub> em>。在SVM中,分离超平面的裕度为2 /‖ w ‖,其中2D减少到

    【讨论】:

      【解决方案2】:

      clf.coef_ 成员将返回“超平面”,在一个维度上,它只是一个点。查看this post 了解如何在数字线上绘制点。

      【讨论】:

        猜你喜欢
        • 2012-06-12
        • 2012-03-27
        • 2016-02-21
        • 2012-11-16
        • 1970-01-01
        • 2016-07-20
        • 2013-10-27
        • 2023-03-26
        • 2014-04-25
        相关资源
        最近更新 更多