sklearn的svm使用方法
from sklearn.svm import SVC
import numpy as np
# 构造数据
X= np.array([[-1,-1],[-2,-1],[1,1],[2,1]])
y = np.array([-1,-1, 1, 1])
# 数据集线性可分,使用最简单的线性核
svc = SVC(kernel='linear')
svc.fit(X, y)
testX = [[-5, -7], [-3, -1], [-7, -89], [5, 7], [3, 1], [7, 89]]
# 输出 testY = [-1, -1, -1, 1, 1, 1]
print(svc.predict(testX))
以上就是一个简单的svm实例。
线性分类问题
对于一个线性分类问题,假设有n个样本向量,就可以找到一个超平面将正反向量分隔开。如图:
Figure_1.png但是图中有三条线可以将其分隔开,都是分类面,实际上,可以找到中间有无数条分类面,但是图中黑色的线分隔效果要比另外两条线要好,因为黑线离两个样本的距离比另外两条线要远(比如绿线更靠近绿色样本,以此为分类面时,更容易将实际上绿色的点划归红色区域)。
因此线性分类问题实际上需要求出类似于图中黑色的线. 盗用Wikipedia的图:
其中f(x) = w·x + b, 就是需要求的分类面,图中写的是f(x) = w·x - b,其实都一样。
对于一个分类面f(x)
假设所有样本距离此分类面的最小距离为δ,并且正反的分类分别为1和-1,则对于正样本和负样本有如下不等式。
两端乘以其分类结果y
所以转换为优化δ,使其最大化。(max(δ)) 但是函数距离并不能代表一个点到一个分类面的真实距离,举例如下: 对于一个二维分类面
可以表示成以下两种等价形式:
由于δ可以任意变化,并且确定δ后,w也确定了,为了求解方便,就强制将\deltaδ归一化为1。此时简化成了优化问题:
上述优化问题与以下优化问题等价:
然而这组方程并不像表面上那么好解决。。。 需要使用SMO算法迭代出最优解。 最终可以迭代出w和b,即求出了分类面f(x)=w⋅x+b 而SVM的训练过程即SMO算法迭代求解w和b的过程。
网友评论