使用scikit-learn线性SVM提取决策边界

use*_*865 4 python classification svm scikit-learn

我有一个非常简单的1D分类问题:值列表[0,0.5,2]及其关联的类[0,1,2].我想获得这些类之间的分类界限.

调整虹膜示例(用于可视化目的),摆脱非线性模型:

X = np.array([[x, 1] for x in [0, 0.5, 2]]) 
Y = np.array([1, 0, 2])

C = 1.0  # SVM regularization parameter
svc = svm.SVC(kernel='linear', C=C).fit(X, Y)
lin_svc = svm.LinearSVC(C=C).fit(X, Y)
Run Code Online (Sandbox Code Playgroud)

给出以下结果: 在此输入图像描述

LinearSVC正在返回垃圾(为什么?),但带有线性内核的SVC工作正常.所以我想得到边界值,你可以用图形猜测:~0.25和~1.25.

这就是我失去的地方:svc.coef_回归

array([[ 0.5       ,  0.        ],
       [-1.33333333,  0.        ],
       [-1.        ,  0.        ]])
Run Code Online (Sandbox Code Playgroud)

svc.intercept_回归array([-0.125 , 1.66666667, 1. ]).这不明确.

我一定是在傻傻丢失,如何获得这些价值观?它们似乎很容易计算,迭代x轴找到边界会很荒谬......

小智 6

我有同样的问题,最终在sklearn文档中找到了解决方案.

给定权重W=svc.coef_[0]和截距I=svc.intercept_,决策边界就是线

y = a*x - b
Run Code Online (Sandbox Code Playgroud)

a = -W[0]/W[1]
b = I[0]/W[1]
Run Code Online (Sandbox Code Playgroud)


Apo*_*ica 6

根据 coef_ 和截距_ 计算的精确边界


我认为这是一个很好的问题,并且无法在文档中的任何地方找到它的一般答案。这个网站确实需要 Latex,但无论如何,我会尽力而为,而不......

一般来说,超平面由其单位法线和距原点的偏移量定义。所以我们希望找到某种形式的决策函数:(x dot n + d > 0其中>当然可以替换为>=)。

在SVM 边距示例中,我们可以操纵它们开始的方程来阐明其概念意义。coef首先,让我们建立表示法coef_[0]intercept表示法的方便表示法intercept_[0],因为这些数组只有 1 个值。然后进行一些简单的代入即可得到等式:

y + coef[0]*x/coef[1] + intercept/coef[1] = 0
Run Code Online (Sandbox Code Playgroud)

乘以coef[1],我们得到

coef[1]*y + coef[0]*x + intercept = 0
Run Code Online (Sandbox Code Playgroud)

因此我们看到系数和截距函数大致如其名称所暗示的那样。应用一种快速概括的符号应该可以使答案变得清晰 - 我们将用单个向量xx替换和。y

coef[0]*x[0] + coef[1]*x[1] + intercept = 0
Run Code Online (Sandbox Code Playgroud)

一般来说,svm 分类器的 coef_ 和 Intercept_ 成员将具有与其训练数据集相匹配的维度,因此我们可以将该方程外推到任意维度的数据。为了避免让任何人误入歧途,这里是使用 svm 中的原始变量名称的最终广义决策边界:

coef_[0][0]*x[0] + coef_[0][1]*x[1] + coef_[0][2]*x[2] + ... + coef_[0][n-1]*x[n-1] + intercept_[0] = 0
Run Code Online (Sandbox Code Playgroud)

其中数据的维度是n

或者更简洁地说:

sum(coef_[0][i]*x[i]) + intercept_[0] = 0
Run Code Online (Sandbox Code Playgroud)

其中i输入数据维度范围内的总和。