获取SVM的决策边界

时间:2017-08-26 11:35:00

标签: python machine-learning scikit-learn svm

在以下示例中:      http://scikit-learn.org/stable/auto_examples/svm/plot_separating_hyperplane.html

我想获得图中所示的(线)决策边界的系数。 致电

clf.coef_ 

返回

[[-0.2539717  -0.83806387]]

如果我没记错的话,代表等式线

y = -0.83806387 * x - 0.2539717

然而,上面的行不是示例中得到的决策边界,那么究竟是什么样的coef_以及如何获得线性决策边界的方程呢?

3 个答案:

答案 0 :(得分:4)

要获得线性模型决策边界线的等式,您需要同时获得coef_intercept_。另请注意,由于您使用的是SVC,因此会涉及多个决策边界。

线方程可以构造为:

y = w0 + w1 * x1 + w2 * x2 + ...

从[{1}}获取w0的地方intercept_以后w1中找到coef_x1以及之后是您的功能。

例如,此代码向您展示如何打印每个决策边界的方程式。

from sklearn import svm
import numpy as np

clf = svm.SVC(kernel="linear")

X = np.array([[1, 2], [3, 4], [5, 1], [6, 2]])
y = np.array(["A", "B", "A", "C"])

clf.fit(X, y)

for (intercept, coef) in zip(clf.intercept_, clf.coef_):
    s = "y = {0:.3f}".format(intercept)
    for (i, c) in enumerate(coef):
        s += " + {0:.3f} * x{1}".format(c, i)

    print(s)

在此示例中,行被确定为:

y = 2.800 + -0.200 * x0 + -0.800 * x1
y = 7.000 + -1.000 * x0 + -1.000 * x1
y = 1.154 + -0.462 * x0 + 0.308 * x1

来源:http://scikit-learn.org/stable/modules/linear_model.html

答案 1 :(得分:3)

如果你想绘制线性图,即y = ax + b,那么你可以使用下面的代码块

tmp = clf.coef_[0]
a = - tmp[0] / tmp[1]

b = - (clf.intercept_[0]) / tmp[1]

xx = np.linspace(xlim[0], xlim[1])
yy = a * xx + b
plt.plot(xx, yy)

希望这有帮助!

答案 2 :(得分:0)

感谢@Prem和@Christopher Wells-这真的很有帮助。我合并了这两个答案,因为在Prem的代码中不包含y_target(->参见Christopher的答案),它对于y_target = 0很好用。

作为示例,我使用了logRegression tutorial from scikitLearn。我插入了以下代码:

mf = logreg.intercept_.shape[0];
xm = np.r_[np.min(X),np.max(X)]
yf = logreg.classes_.copy()
xm = np.r_[np.min(X),np.max(X)]

for jf in np.arange(mf):
    tmp = logreg.coef_[jf]
    a = - tmp[0] / tmp[1]; 
    b = - (logreg.intercept_[jf]-yf[jf]) / tmp[1]
    yy = a * xm + b
    plt.plot(xm, yy, label='Coeff ='+str(jf))
plt.legend()
plt.show()

这非常适合y_target = 0(请参见skLearn示例中的图形)。但是其他两条直线是什么?还有什么需要考虑的吗? Examlpe from scikitLearn: LogisticRegression