【发布时间】:2018-10-26 19:41:10
【问题描述】:
我正在尝试为 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属于Class 0;如果为正值,则为 1 类。但是,w.dot([1,1,1])+b = 0 !这意味着[1,1,1],它是来自第 1 类的支持向量,位于分离平面上.....而没有来自第 0 类的 SV 位于 sep .飞机。
所以我的问题是......
我的数据是线性可分的,因此理论上 SVM 的两个类的边距都应该 >0。但在这里,我的 SVM 对 class1 有一个 =0,对 class0 有 >0 边距。为什么会这样?如果我的超平面不正确,我该如何计算正确的超平面?谢谢。
代码
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
【问题讨论】:
标签: python machine-learning scikit-learn svm