我有一个非常简单的1D分类问题:值列表[0,0.5,2]及其关联的类[0,1,2] . 我想获得这些类之间的分类界限 .
调整iris example(用于可视化目的),摆脱非线性模型:
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)
给出以下结果:
LinearSVC正在返回垃圾(为什么?),但带有线性内核的SVC工作正常 . 所以我想得到边界值,你可以用图形猜测:~0.25和~1.25 .
那个's where I' m输了: svc.coef_
返回
array([[ 0.5 , 0. ],
[-1.33333333, 0. ],
[-1. , 0. ]])
而 svc.intercept_
返回 array([-0.125 , 1.66666667, 1. ])
. 这不明确 .
我一定是在傻傻丢失,如何获得这些 Value 观?它们似乎很容易计算,迭代x轴找到边界会很荒谬......
3 回答
我有同样的问题,最终在sklearn documentation找到了解决方案 .
给定权重
W=svc.coef_[0]
和截距I=svc.intercept_
,决策边界就是线同
Exact boundary calculated from coef_ and intercept_
我认为这是一个很好的问题,并且无法在文档中的任何位置找到它的一般答案 . 这个网站真的需要Latex,但无论如何,我会尽力而为......
通常,超平面由其单位法线和与原点的偏移来定义 . 所以我们希望找到一些形式的决策函数:
x dot n + d > 0
(其中>
当然可以用>=
替换) .在SVM Margins Example的情况下,我们可以操纵他们开始的等式来阐明其概念意义 . 首先,让我们 Build 编写
coef
以表示coef_[0]
和intercept
来表示intercept_[0]
的符号方便性,因为这些数组只有1个值 . 然后一些简单的替换产生等式:乘以
coef[1]
,我们得到所以我们看到系数和截距函数大致就像它们的名字所暗示的那样 . 应用一种快速的符号概括应该明确答案 - 我们将用单个向量 x 替换
x
和y
.通常,svm分类器的coef_和intercept_成员将具有与其训练的数据集匹配的维度,因此我们可以将该等式推断为任意维度的数据 . 为了避免让任何人误入歧途,这里是使用svm中原始变量名的最终 generalized decision boundary :
其中数据的维度是
n
.或者更简洁:
其中
i
在输入数据的维度范围内求和 .从SVM获取决策线,演示1
Prints:
近似SVM的分离n-1维超平面,演示2
Prints:
这些超平面都像箭一样直,它们只能被限制在三维空间中的凡人所理解 . 这些超平面通过创造性的内核功能投射到更高的尺寸,而不是平坦回到可见尺寸以便您的观看乐趣 . 这是一个视频试图传达一些关于演示2中发生的事情的直觉:https://www.youtube.com/watch?v=3liCbRZPrZA