目录
1、最大间隔与分类
对于线性模型,那就是希望在样本空间中寻找一个超平面, 将不同类别的样本分开。
超平面可以定义为:
其中 表示为超平面的法向量,x表示超平面上任意的点,b表示一个位移项。1可以为任何值(可以为0、-1等等)。这只是简单的介绍,在其他博客中有很多具体的,可以更好的助于理解svm。
那假设有上述样本,可以有很多超平面将它们分开,我们怎么抉择呢?那肯定是选最中间那条:容忍性好, 鲁棒性高, 泛化能力最强。那要找到这么一个超平面就要求其最大间隔。
怎么求解最大间隔,就是对该超平面进行平移,直到碰到训练点,然后计算离两条平面最大距离。其实就是找到一个最近的决策边界,去求解一个超平面使得该决策边界上的点到该超平面距离最大。那就是求点到平面距离(在三维空间中)。
空间中点到平面距离可以由法向量很好得到。
所以分类间隔:
其实分母就代表法向量的模。总之这就是一个点到平面距离公式。那我们要最大化该间隔width,就要最小化法向量模。
2、对偶问题
利用拉格朗日优化方法可以把最大间隔问题转换为比较简单的对偶问题。
更详细的例子可以看:Karush-Kuhn-Tucker (KKT)条件 - 知乎 (zhihu.com)
3、核函数
那主要就是设计一个函数,这个函数就叫核函数。
4、软间隔与正则化
有一些样本不满足约束条件无法判断其是否是过拟合的。怎么办?引入软间隔概念,加入松弛变量。
5、python简单实现
from sklearn import svm
import numpy as np
import scipy.io as scio
from sklearn.metrics import accuracy_score
# 加载数据
train_data = scio.loadmat('spamTrain.mat')
test_data = scio.loadmat('spamTest.mat')
X = train_data['X']
y = train_data['y'].ravel()
Xtest = test_data['Xtest']
ytest = test_data['ytest'].ravel()
# 训练SVM分类器
clf = svm.SVC(C=0.1, kernel='linear')
clf.fit(X, y)
# 在训练集和测试集上计算准确度
train_predictions = clf.predict(X)
test_predictions = clf.predict(Xtest)
print('Training accuracy = {0}%'.format(100 * accuracy_score(y, train_predictions)))
print('Test accuracy = {0}%'.format(100 * accuracy_score(ytest, test_predictions)))