首页 文章

SVM:支持向量的边际为0?

提问于
浏览
0

我正在尝试为3D点生成二进制分类的分离超平面 .

这是我的观点,它们是线性可分的 .

Class 0: [[0,0,0], [0,1,1], [1,0,1], [0.5,0.4,0.4]]
Class 1: [[1,3,1], [2,0,2], [1,1,1]]

sklearn.svm.SVC(kernel='linear') 开始,生成以下内容:

w = clf.coeff_ = [ 1.   0.5  0.5]
b = clf.intercept_ = -2.0
sv = clf.support_vectors_ = 
array([[ 0.,  1.,  1.],
       [ 1.,  0.,  1.],
       [ 2.,  0.,  2.],
       [ 1.,  1.,  1.]])

理解是,如果 w.dot(x)+b 返回负值,则x为0级;如果是正值,则为1级 . 但是, w.dot([1,1,1])+b = 0 !!这意味着 [1,1,1] ,它是来自Class 1的 support vectorlies 在分离平面上.....而没有来自Class 0的SV位于sep上 . 平面 .

SO MY QUESTION IS...

我的数据是线性可分的,因此理论上SVM的两个类的边距应该> 0 . 但是在这里,我的SVM对于class1有一个= 0,对于class0有一个> 0的余量 . 为什么会这样?如果我的超平面不正确,我该如何计算正确的超平面?谢谢 .

CODE

from sklearn import svm
X0 = [[0,0,0], [0,1,1], [1,0,1], [0.5,0.4,0.4]]
Y0 = [0] * len(X0)
X1 = [[1,3,1], [2,0,2], [1,1,1]]
Y1 = [1] * len(X1)
X = X0 + X1
Y = Y0 + Y1
clf = svm.SVC(kernel='linear')
clf.fit(X, Y)
sv = clf.support_vectors_
w = clf.coef_[0] 
b = clf.intercept_[0]
print([w.dot(X0[i])+b for i in range(len(X0))]) # negative class
print([w.dot(X1[i])+b for i in range(len(X1))]) # positive class

1 回答

  • 0

    是!你的解释是正确的,如果 w.dot(x)+b 返回一个负值,那么x是Class 0 ;

    这是需要更加谨慎地强调的地方!

    分类基于THE SIGN!

    它是 SIGNUM(w.dot([x])+b)w.dot([1, 1, 1]) + b = 0 ,0被认为是 POSITIVE !这就是 [1, 1, 1] 被认为属于1级的原因

    X1 = [[1,3,1], [2,0,2], [1,1,1]]

    clf.predict(X1)

    你得到

    array([1, 1, 1])

    对于2D中的点,首先要找到一条正确分隔数据的线 . 这条线称为决策边界!现在在这个决策边界? w.dot([1, 1, 1]) + b = 0 那么你想要做的是,找到一条线周围最宽的区域(称为MARGIN / MAXIMUM SEPARATING HYPERPLANE / WIDEST ROAD),它可以最大化两个点之间的距离!

    当 class 完全可分离时?

    在您的保证金的一端由支持向量管理? w.dot([1, 1, 1]) + b = -1

    在您的保证金的另一端由支持向量管理? w.dot([1, 1, 1]) + b = +1

    但是,当课程不是完全可分的时候?你可以在决策边界上获得完美的保证金!这取决于您的数据!在您的情况下,您的MARGIN / MAXIMUM SEPARATING HYPERPLANE / WIDEST ROAD的一部分位于您的决策边界!它无法帮助!

相关问题