支持向量机是一种二分类模型,基本模型是定义在特征空间的间隔最大的线性分类器。间隔最大化使它有别于感知机。在面试中,经常遇到手推SVM,所以公式的推导也很重要。
模型:
策略:间隔最大化,形式化为求解凸二次规划,等价于正则化的合页损失函数最小化
算法:略
支持向量机包括:线性可分支持向量机,线性支持向量机,非线性支持向量机
间隔最大化的直观解释:对训练数据集找到几何间隔最大的超平面意味着以充分大的确信度对训练数据进行分类。使其面对最难分的实例点也有足够大的确信度将它们分开,这样在面对未知的新实例也有很好的分类预测能力。
支持向量:在数据线性可分的情况下,训练数据的样本点与分离超平面最近的样本点
献上我看到的最好的讲解:https://blog.csdn.net/v_july_v/article/details/7624837(因为链接中的大神讲解非常好,就不写自己的理解了)
关于smo的公式推导:https://www.jianshu.com/p/eef51f939ace
合页损失函数
支持向量机的另外一种解释就是最小化合页损失函数
SVM的损失函数就是合页损失函数加上正则项,第一项是经验损失,第二项是w的L2范数;它与SVM求最优解的目标函数的形式很相似
从图中我们可以看到,
1)0-1损失
当样本被正确分类时,损失为0;当样本被错误分类时,损失为1。
2)感知机损失函数
当样本被正确分类时,损失为0;当样本被错误分类时,损失为-y(wx+b)。
3)合页损失函数
当样本被正确分类且函数间隔大于1时,合页损失才是0,否则损失是1-y(wx+b)。
相比之下,合页损失函数不仅要正确分类,而且确信度足够高时损失才是0。也就是说,合页损失函数对学习有更高的要求。
python代码实现:
import numpy as np
from sklearn.metrics.pairwise import rbf_kernel
from scipy.io import loadmat
from sklearn import datasets
"""
svm模型
"""
def linearKernel():
"""线性核函数
"""
def calc(X, A):
return X * A.T
return calc
def rbfKernel(delta):
"""rbf核函数
"""
gamma = 1.0 / (2 * delta**2)
def calc(X, A):
return np.mat(rbf_kernel(X, A, gamma=gamma))
return calc
def getSmo(X, y, C, tol, maxIter, kernel=linearKernel()):
"""SMO, X 训练样本,y标签集 C正规化参数 tol容忍值 maxIter最大迭代次数,K所用的核
Args:
X 训练样本
y 标签集
C 正规化参数
tol 容忍值
maxIter 最大迭代次数
K 所用核函数
Returns:
trainSimple 简化版训练算法
train 完整版训练算法
predict 预测函数
"""
m, n = X.shape
# 存放核函数的转化结果
K = kernel(X, X)
# Cache存放预测误差,用以加快计算速度
ECache = np.zeros((m,2))
def predict(X, alphas, b, supportVectorsIndex, supportVectors):
"""计算权值向量
Args:
X 预测矩阵
alphas alphas
b b
supportVectorsIndex 支持向量坐标集
supportVectors 支持向量
Returns:
predicts 预测结果
这里因为对预测起作用的是支持向量,
非支持向量的前面的alphas为0,支持向量的0<alphas<C(使用软间隔)
"""
Ks = kernel(supportVectors, X)
predicts = (np.multiply(alphas[supportVectorsIndex], y[
supportVectorsIndex]).T * Ks + b).T
predicts = np.sign(predicts)
return predicts
def w(alphas, b, supportVectorsIndex, supportVectors):
"""计算权值
Args:
alphas alphas
b b
supportVectorsIndex 支持向量坐标
supportVectors 支持向量
Returns:
w