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)
根据 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输入数据维度范围内的总和。