支持向量(support vector):距离超平面最近的且满足一定条件的几个训练样本点
间隔(margin):两个不同类别的支持向量到超平面的距离之和
支持向量机(support vector machine):最大化间隔
对偶问题(dual problem):实质相同但从不同角度提出不同提法的一对问题。
支持向量机本身是一个凸二次规划问题(convex quadratic programming),可直接用现成的优化计算包求解,但是利用拉格朗日乘子法可得到并进一步求解其对偶问题更加高效。
参考链接:拉格朗日乘子法和KKT条件
训练完成后,大部分的训练样本都不会保留,最终模型只与支持向量有关,模型复杂度与支持向量的数目有关。
(6.11)是一个二次规划问题,可使用通用的二次规划算法来求解,然而该问题的规模正比于训练样本数,这会在实际任务中造成很大的开销。为了避开这个障碍,人们利用问题本身的特性,提出了很多高效算法,例如SMO。SMO算法参考
对于在原始空间中线性不可分的问题,可以将样本从原始空间映射到一个更高维的特征空间,使得样本在这个特征空间内线性可分,
如果原始空间是有限维,即属性数有限,那么一定存在一个高维特征空间使得样本可分。
原始空间内划超平面所对应的模型为
特征空间内划超平面所对应的模型为
其对偶问题为
核函数(kernel function)为
对偶问题可重写成
求解得到支持向量展式(support vector expansion)
如何寻找核函数呢?
一个半正定核矩阵,总能找到一个与之对应的映射,换言之,任何一个核函数都隐式定义了一个称为“再生核希尔伯特空间”(Reproducing Kernel Hi了Bert Space)。
核函数的选择决定了支持向量机的性能。
文本数据经常采用线性核,情况不明时可先尝试高斯核。
核函数还可以通过函数组合得到。
(1)线性组合
(2)核函数直积
(3)
在现实任务中,往往很难确定合适的核函数使得训练样本在特征空间中线性可分,即使恰好找到了某个核函数使得训练集在特种空间中线性可分,也很难断定这个可分的结果是不是由于过拟合造成的。
为了缓解上述问题的一个办法是允许支持向量机在一些样本上出错,为此引入软间隔(soft margin)
硬间隔(hard margin):所有样本都必须分类正确
在最大化间隔的同时,不满足约束的样本应尽量少,优化目标可写为
由于“0/1损失函数”的非凸、不连续,数学性质不太好,通常用其他函数来代替,称为替代损失(surrogate loss),替代函数一般具有很好的数学性质。
软间隔下的对偶问题
由KKT条件知,软间隔支持向量机的最终模型仅与支持向量有关(软间隔的支持向量或在间隔超平面上,或在间隔超平面之间,或在分类超平面的误分类一侧)
正则化问题(regularization)
第一项是结构风险(structure risk),用于面熟模型 f f f的某些性质;第二项是经验风险(empirical risk),用于描述模型与训练集的契合程度。 Ω ( f ) \Omega(f) Ω(f)是正则化项, C C C是正则化常数。
L2范数是常用的正则化项。L2范数倾向于取值更加平衡,L0范数和L1范数倾向于更加稀疏。
正则化可以理解为一种罚函数法,对不希望得到的结果施以惩罚,从而使得优化过程趋向于希望目标,从贝叶斯估计的角度看,正则化可以认为是提供了模型的先验概率。
支持向量回归和传统回归的区别:传统回归模型当且仅当预测值和实际值相同时,损失才为零;支持向量回归(support vector regression,SVR)可以容忍一定的偏差,当预测值和实际值的偏差大于一定阈值时,才计算误差。
SVR的解形如:
SVR模型的支持向量是在隔离带之外的样本,SVR最终模型只与支持向量有关,其解仍具有稀疏性。
若不考虑偏置项 b b b,无论是SVM还是SVR都能表示成核函数的线性组合。
核方法(kernel methods):基于核函数的学习方法,最常见的是通过“核化”(引入核函数)来将线性学习器拓展为非线性学习器
核函数直接决定了SVM和核方法的最终性能,但遗憾的是,核函数的选择是一个未决问题。
证明:
设 超 平 面 为 w T x + b = 0 , 则 其 法 向 量 为 w , 空 间 中 一 点 为 x 1 , 设 超 平 面 上 存 在 一 点 x 2 , 使 得 ( x 2 − x 1 ) 与 超 平 面 垂 直 , 则 有 ( x 2 − x 1 ) = η w ( 其 中 η ∈ R ) ; ( 1 ) 点 x 1 到 超 平 面 的 距 离 为 r = [ ( x 2 − x 1 ) T ( x 2 − x 1 ) ] 1 2 = ∣ η ∣ ∗ ∣ ∣ w ∣ ∣ 2 ; ( 2 ) 根 据 点 x 2 在 超 平 面 上 , 有 w T x 2 + b = 0 ; ( 3 ) 将 ( 1 ) 带 入 ( 3 ) , 消 掉 x 2 , 得 w T x 1 + b = − η ∣ ∣ w ∣ ∣ 2 2 两 边 取 绝 对 值 , 得 ∣ w T x 1 + b ∣ = ∣ η ∣ ∗ ∣ ∣ w ∣ ∣ 2 2 ; ( 4 ) 将 ( 4 ) 带 入 ( 2 ) 得 , r = ∣ w T x 1 + b ∣ ∣ ∣ w ∣ ∣ 2 , 原 命 题 得 证 设超平面为w^{T}x+b=0,则其法向量为w,空间中一点为x_1, \\设超平面上存在一点x_2,使得(x2-x1)与超平面垂直, \\则有(x_2-x_1)=\eta w(其中\eta \in R) ; (1) \\点x_1到超平面的距离为 \\r=[(x_2-x_1)^{T}(x_2-x_1)]^{\frac{1}{2}}=|\eta|*||w||_2;(2) \\根据点x_2在超平面上,有w^Tx_2+b=0;(3) \\将(1)带入(3),消掉x_2,得 \\w^Tx_1+b=-\eta ||w||_2^2 \\两边取绝对值,得 \\|w^Tx_1+b|=|\eta|*||w||_2^2;(4) \\将(4)带入(2)得, \\r=\frac{|w^Tx_1+b|}{||w||_2},原命题得证 设超平面为wTx+b=0,则其法向量为w,空间中一点为x1,设超平面上存在一点x2,使得(x2−x1)与超平面垂直,则有(x2−x1)=ηw(其中η∈R);(1)点x1到超平面的距离为r=[(x2−x1)T(x2−x1)]21=∣η∣∗∣∣w∣∣2;(2)根据点x2在超平面上,有wTx2+b=0;(3)将(1)带入(3),消掉x2,得wTx1+b=−η∣∣w∣∣22两边取绝对值,得∣wTx1+b∣=∣η∣∗∣∣w∣∣22;(4)将(4)带入(2)得,r=∣∣w∣∣2∣wTx1+b∣,原命题得证
我使用的是sklearn的svm模块,也是基于libsvm的
from sklearn import svm
from sklearn.model_selection import cross_val_score
X=[
[1. , 2. , 1. , 0. , 2. , 1. , 0.697, 0.46 ],
[2. , 2. , 0. , 0. , 2. , 1. , 0.774, 0.376],
[2. , 2. , 1. , 0. , 2. , 1. , 0.634, 0.264],
[1. , 2. , 0. , 0. , 2. , 1. , 0.608, 0.318],
[0. , 2. , 1. , 0. , 2. , 1. , 0.556, 0.215],
[1. , 1. , 1. , 0. , 1. , 0. , 0.403, 0.237],
[2. , 1. , 1. , 1. , 1. , 0. , 0.481, 0.149],
[2. , 1. , 1. , 0. , 1. , 1. , 0.437, 0.211],
[2. , 1. , 0. , 1. , 1. , 1. , 0.666, 0.091],
[1. , 0. , 2. , 0. , 0. , 0. , 0.243, 0.267],
[0. , 0. , 2. , 2. , 0. , 1. , 0.245, 0.057],
[0. , 2. , 1. , 2. , 0. , 0. , 0.343, 0.099],
[1. , 1. , 1. , 1. , 2. , 1. , 0.639, 0.161],
[0. , 1. , 0. , 1. , 2. , 1. , 0.657, 0.198],
[2. , 1. , 1. , 0. , 1. , 0. , 0.36 , 0.37 ],
[0. , 2. , 1. , 2. , 0. , 1. , 0.593, 0.042],
[1. , 2. , 0. , 1. , 1. , 1. , 0.719, 0.103]
]
y=[1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0]
print("-"*20+"线性核"+"-"*20)
clf1=svm.SVC(C=1,kernel='linear')
print("交叉验证评分",cross_val_score(clf1,X,y,cv=5,scoring='accuracy').mean())
clf1.fit(X,y)
print("支持向量数目",clf1.n_support_.sum())
print("支持向量",clf1.support_vectors_)
print("-"*20+"高斯核"+"-"*20)
clf2=svm.SVC(C=1,kernel='rbf')
print("交叉验证评分",cross_val_score(clf2,X,y,cv=5,scoring='accuracy').mean())
clf2.fit(X,y)
print("支持向量数目",clf2.n_support_.sum())
print("支持向量",clf2.support_vectors_)
简单分析:在其他参数相同的情况下,在交叉验证评分上,高斯核svm要高于线性核svm;在模型复杂度上,高斯核svm的支持向量的数目要多于线性核svm,因此高斯核svm更加复杂
若将隐层神经元的数目设置为训练样本数,且每个训练样本对应一个神经元中心,则RBF网络的预测函数与高斯核SVM的预测函数相同。但是,这也只是形式相同而已,两种方法还是存在着本质区别的,比如RBF的样本中心是通过聚类等方法获得的,而高斯核RBF直接定义成每条样本;RBF函数的参数是通过学习得到的,而高斯核的参数是手动设置的。
SVM 的特性就是 “支持向量” . 即线性超平面只由少数 “支持向量” 所决定. 若噪声成为了某个 “支持向量” —— 这是非常有可能的. 那么对整个分类的影响是巨大的. 反观对率回归, 其线性超平面由所有数据共同决定, 因此一点噪声并无法对决策平面造成太大影响.
参考:https://www.cnblogs.com/cloud–/p/12304663.html