6.1 间隔与支持向量机
给定训练样本集,,分类学习最基本的想法就是在D的样本空间中找到一个超平面,把样本分开
我们想很好的分隔开两种样本,其实选两种点中间的超平面就很好,因为可以看到它对局部扰动的“容忍性”最好,比如测试集中的点可能很接近分隔界,如果是其他的划分超平面,误差会很大,可以自己在这个图上随便画一些点,其实可以看出来,虽然最中间这条不能说处处最好,但是错误分类的点数相比而言不算多。也就是说,这种分类结果是最鲁棒的,对未知样本泛化能力最强。
样本空间中,划分超平面可通过如下线性方程来描述:
其中为法向量,决定了超平面的方向;b为位移项,决定了超平面和原点之间的距离.我们将超平面记为(w,b),样本空间内任意点x到(w,b)的距离为
( ||w||代表是什么意思?_360问答 (so.com)
||w||表示为2-范数。如,w是一个n维列向量,w=(w1,w2,...,wn)';||w||=w'w。
二范数指矩阵A的2范数,就是A的转置共轭矩阵与矩阵A的积的最大特征根的平方根值,是指空间上两个向量矩阵的直线距离。类似于求棋盘上两点间的直线距离。
范数(norm)是数学中的一种基本概念。在泛函分析中,它定义在赋范线性空间中,并满足一定的条件,即:
1、非负性;
2、齐次性;
3、三角不等式。
它常常被用来度量某个向量空间(或矩阵)中的每个向量的长度或大小。
扩展资料:
常用范数这里以Cn空间为例,Rn空间类似。
最常用的范数就是p-范数。若
,那么
可以验证p-范数确实满足范数的定义。其中三角不等式的证明不是平凡的,这个结论通常称为闵可夫斯基(Minkowski)不等式。
p-范数(2-范数 即 欧几里得范数)_p范数_Selvaggia的博客-CSDN博客)
西瓜书 6.1 计算 样本空间任意点x到超平面(w,b)的距离d_证明样本空间中任意点 x 到超平面(w,b) 的距离为d_白百万的博客-CSDN博客
设点x到超平面S的投影为,则w·+b=0,由于与S的法向量w平行
= = r就是要求的距离
由于欧式距离下,向量的模=向量的范数
一般如果范数不写下标,比如,默认为L范数
又因为:
已知:
得到:
即:
假设超平面(w,b)能将样本正确分类,即对于(xi,yi),若=+1,则有。令
现根据我们的定义把图画出来, 的点对于6.3中第二个式子的等号 对应第一个式子的等号
这几个训练样本点被称为支持向量(support vector),两个异类支持向量到超平面的距离之和为
它被称为间隔(margin)。
欲找到具有“最大间隔”(maximum margin)的划分超平面,也就是要找到能满足(6.3)中约束的参数w和b,使得最大,即:
根据我们以前的知识,最大化分数就是最小化分母,即最小化。可以把(6.5)可重写为:
这就是支持向量机(Support Vector Machine,简称SVM)的基本型
6.2 对偶问题
我们的目标是算出平面的表达式,也就是说,我们其实就是通过求解(6.6)来得到超平面所对应的模型。
对偶问题:其实就是每一个线性规划问题都存在一个与其对偶的问题,在求出一个问题解的时候,也同时给出了另一问题的解。
对(6.6)使用拉格朗日乘法可得到其对偶问题(dual problem)
具体来说,对(6.6)的每条约束添加拉格朗日乘子,则该问题的拉格朗日函数可以写为:
我们先看一下书上的公式再详细写一下:
此处解出的就是(6.8)中的拉格朗日乘子,对应着样本()
这个转换其实就是把约束条件 转化到拉格朗日函数中去。
表示对L取关于a的最后大化,观察拉格朗日函数的形式:
现在, ,对 作关于 的最大化,那么:
当 (即满足约束条件)时,L(w,b,a)的最大为 f(w);
当 时,L(w,b,a)的最大为正无穷大。
这样 是一个分段函数。第一段是满足约束条件时,有函数f(w),第二段是一个正无穷大。这时要对这个分段函数取min,那么肯定是选择对满足约束条件时的f(w)取min,因为第二段是正无穷大。
这样,就把一个约束问题转化成无约束问题。
注:
这里还可以看出 要最大,那么必须有也就是拉格朗日乘子和约束中至少有一个为0;这就是KKT条件中的松弛
SVM支持向量机系列理论(二) 线性可分SVM模型的对偶问题_svm的对偶问题是凸二次么-CSDN博客
---------------------------------------------------------------------------------------------------------------------------------
如果按照我们上面谈到的拉格朗日乘子法的思路,则应该让L(x,α,β)对x以及参数α和β进行求导,然后得出结果带入原始便可求出我们需要的最优解。
但需要注意两点:
1、这里参数α和β总共p+q个,如果全部求偏导工作量太大,不现实;
2、并且大家有没有想过,这个问题可能根本就没有最优解这种情况存在。
针对上面情况,我们便引出了换一种思路,那就是利用对偶问题,也就是将原问题转化成其对偶问题进行求解。
这就是此处引入对偶问题的原因。
注意到(6.6)中存在着不等式约束,因此上述过程需要满足KKT条件(Karush-Kuhn-Tucker)
---------------------------------------------------------------------------------------------------------------------------------
注:(KKT条件就是在对偶问题中,找到最优解需要满足的条件。)
KKT条件等价于对偶间隙为0:
- 总是充分的
- 在强对偶条件下是必要的
详细证明可以看链接的文章。KKT条件(Karush-Kuhn-Tucker Conditions)-CSDN博客
---------------------------------------------------------------------------------------------------------------------------------
即要求:
(第一个式子为对偶问题可行域,第二个式子为原问题可行域,第三个式子为互补松弛性)
因为满足这个式子,所以对于任意(),总有=0或。若=0,则该样本不会对f(x)有任何影响,因为根本不会在求和式中出现;若,则>0,所对应的点处于最大间隔边界上,是一个支持向量。这显示一个支持向量机的重要特征:训练完成后,大部分的训练样本都不需要保留,不会对模型产生影响,最终模型只和支持向量有关。
我们也可以把这两种可能的取值代回(6.12)看一下,可以看到,第一种情况不会成为加和项,第二种情况,式子中只会有和两项,符合之前的对问题的定义,即对α和β求偏导。
那么如何求解(6.11)呢?我们可以看一下二次规划的形式:
(最优化 | 二次规划的基础知识理论 | 例题讲解_二次规划例题_CHH3213的博客-CSDN博客)
然后再对比一下
可以发现,(6.11)其实就是个二次规划问题。但是这个式子的问题规模正比于训练样本数,所以为了减少训练开销,我们引入SMO(Sequential Minimal Optimization)
SMO的基本思路是先固定以外的所有参数,然后求式子在α上的极值。
所以SMO每次选择两个变量和,固定其他参数,然后不断执行以下步骤直到收敛:
·选取一对需更新的变量和
·固定和以外的参数,求解式(6.11)获得更新后的和.
如果选取的参数中有不符合KTT的,那就说明,不是出现了负数,就是出现了分数,总数都会减小,也就说目标函数会收敛。同理可得,越是违反条件,那么减幅就越大,所以SMO先选取违反幅度最大的变量。
我们的目的是让目标函数收敛,所以第二个参数也要取使函数变化最大的参数,但是,直接写一个预测变量对应的函数变化值大小的函数复杂度太高,因此,SMO选择选取两变量,使对应样本之间的间隔最大,这样通常会给函数带来更大的变化。
在固定其他参数后,考虑和,可将(6.11)中的约束重写为:
其中
消去一个变量后,得到一个单变量二次规划问题,仅有≥0一个约束,直接算出闭式解就行。
又因为对任意支持向量()都有,就可以得到:
其中S是所有支持向量的下标集。为了提高鲁棒性,选用所有支持向量求解的平均值
6.3 核函数
如图,现实问题中总是会有非线性可分的问题,也就是不能用超平面直接分开样本,比如上面的异或问题。但是我们也发现,当我们把二维平面的异或问题的图投影到三维的时候,就出现了可以分割的超平面。
这种情况事实上拥有普适性,也就是说,如果原样本空间有确定的维数,那么我们肯定能找到一个高维特征空间使样本可分。
将x换为高维映射后的特征向量,得到:
(6.19)
同理,类似于(6.6)得:
就是单纯的代换,可以理解为t
因为样本空间可能维数很高,所以很有可能很难求内积,所以我们引入一个函数来解决这个问题:
这是数学上的核技巧
SVM & 核技巧(数学推导)_svm的核技巧-CSDN博客
非线性支持向量机(KSVM)就是核技巧常见的运用
决策函数为:
这里就是用核函数技巧规避了正面计算内积,只需要用那些常见的核函数来应用SVM
from sklearn.svm import SVC
X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
y = np.array([1, 1, 2, 2])
clf1 = SVC(kernel='rbf', max_iter=100)
clf1.fit(X, y)
clf2 = SVC(kernel='linear', max_iter=100)
clf2.fit(X, y)
clf3 = SVC(kernel='sigmoid', max_iter=100)
clf3.fit(X, y)
求解了重写过的对偶问题后,可以得到:
注意,核矩阵(kernel matrix)K总为半正定的:(给定一个大小为的实对称矩阵 ,若对于任意长度为 的非零向量 x ,有 xTAx>0 恒成立,则矩阵 是一个正定矩阵。给定一个大小为的实对称矩阵 ,若对于任意长度为 的非零向量 x�,有 xTAx⩾0 恒成立,则矩阵 是一个半正定矩阵。)
为什么核函数必须是半正定的?
- 半正定矩阵的特征值非负
- 核函数必须是正半定的,以便它们具有合理的(非负)距离。 那就是margins是正的
-
任何 半正定的对称函数都可以作为核函数
-
任何两个核函数的和、乘积也是核函数
-
一个核函数的n次方也是核函数
6.4 软间隔和正则化
同样的,在现实问题里,我们很难找到合适的核函数来确定超平面,即使找到了,也很难确定这个平面是不是因为过拟合造成的。
所以,我们需要引入“软间隔”(soft margin),允许向量机在一些样本上出错。
之前说的要求所有向量都满足(6.3)的,被称为硬间隔(hard margin).
这里的软间隔则是要求部分满足即可:
优化目标可写为:
(参考SVM定义)
可以看出来,当 C无穷大时,后一项中如果样本不符合约束,会得到C,也就是一个无穷大的数,很明显不符合条件;即,这种情况下,强制符合(6.3),然后就会得到和(6.6)一样的式子。
然而,和当时逻辑回归时,一开始二项分布的函数一样,非凸、非连续,也就是说不能求导。所以我们需要用一些数学性质好的函数来替代它,一般都是凸函数连续,且是的上界。这种方法叫做替代损失(surrogate loss)。
常用的函数有:
这就是常用的软间隔支持向量机。SVM支持向量机-软间隔与松弛因子(3)_svm松弛因子-CSDN博客
类似(6.8),通过拉格朗日乘子法得到(6.35)的拉格朗日函数
其中和是拉格朗日乘子
得到(6.35)的对偶问题
(软间隔)
(硬间隔)
对比可看出,唯一的不同就是约束条件,软间隔多了一个上限,那么原问题中就少了一个约束条件,符合我们之前对软硬间隔的推断。
同样使用之前的思路,先列出KKT条件:
软间隔支持向量机的KKT条件
对于训练样本(xi,yi),有
1)若α=0,那么yi(wTxi+b)-1≥0,即样本在间隔边界之外,即被正确分类。
2)若0<α<C,那么ξi=0,yi(wTxi+b)-1=0,即样本在间隔边界上。
3)若α=C,则μi=0,该样本点是有可能正确分类、也有可能分类错误,此时考试ξi。
① 如果0≤ξi≤1,那么样本点在超平面和间隔边界之间,但是被正确分类。
② 如果ξi=1,那么样本点在超平面上,无法被正确分类。
③ 如果ξi>1,样本点被分类错误。
机器学习-第六章 支持向量机(SVM)_正则化常数用于对结构风险和经验风险进行折中-CSDN博客
我们还可以把(6.29)中的0/1损失函数换成别的替代函数以得到其他学习模型。
它们具有一个共性:优化目标中的第一项用来描述划分超平面的“间隔”大小,另一项用来表述训练集上的误差,可写为更一般的形式
被称为结构风险(structural risk)用于描述f的某些性质,表述了我们希望获得什么样的模型,有助于削减假设空间,从而减小了最小化训练误差的过拟合风险。
被称为经验风险(empirical risk)用于描述模型与训练数据的契合程度;
C用于对两者进行折中。
(6.42)也可以称为正则化(regularization),称为正则化项,C被称为正则化常数。
6.5 支持向量回归
支持向量回归(Support Vector Regression)-CSDN博客
与传统回归模型直接比较预测值和真实值来计算损失不同,支持向量回归(Support Vector Regression,简称SVR)同支持向量机,也容许我们出现一定的误差,即当f(x)与y之间的误差超过时才会计算损失
如图,形象地说就是在超平面旁生成了一个区域,只要落入这个范围都是正确的。
引入松弛变量和,可将(6.43)重写为:SVM松弛变量图解-CSDN博客
与SVM类似,先用拉格朗日乘子法,将目标函数变成
令L对w,b,和的偏导为0,可得:
也是同样的,我们需要对偶问题:
需满足KKT条件,即要求:
可以看出,如果0<<C ,则必有=0,进而有:
可以看出来,只有样本不落入这个间隔带中,两个α才能取非0值,且因为和不能同时成立,所以和至少有一个为0
将(6.47)带入(6.7),得SVR的解形如
实践中我们会采取一种更鲁棒的方式,就是选取0<<C的样本求解b后取平均值。
若考虑特征映射形式(6.19),则(6.47)将形如
(6.19)
进而可得:
数学建模之Python-支持向量回归(SVM)_支持向量回归预测python-CSDN博客
#程序文件Pex19_2.py
import numpy as np
import pylab as plt
from sklearn.svm import SVR
np.random.seed(123)
x=np.arange(200).reshape(-1,1)
y=(np.sin(x)+3+np.random.uniform(-1,1,(200,1))).ravel()
model = SVR(gamma='auto'); print(model)
model.fit(x,y); pred_y = model.predict(x)
print("原始数据与预测值前15个值对比:")
for i in range(15): print(y[i],pred_y[i])
plt.rc('font',family='SimHei'); plt.rc('font',size=15)
plt.scatter(x, y, s=5, color="blue", label="原始数据")
plt.plot(x, pred_y, '-r*',lw=1.5, label="预测值")
plt.legend(loc=1)
score=model.score(x,y); print("score:",score)
ss=((y-pred_y)**2).sum() #计算残差平方和
print("残差平方和:", ss)
plt.show()
6.6 核方式
(这个其实在上面第一次提及核方法的地方做了解释,贴了链接,所以这一部分贴原文为主)
定理对损失函数没有限制,对正则化项Ω仅要求单调递增(?)
假设可通过某种映射将样本映射到一个特征空间F,然后在F中执行线性判别分析:
既然是线性的,那么就和第三章的东西很有关了。
当时在第三章也是这样要求一个损失值。
因为在实际问题中,我们是知道映射的具体形式的,所以我们直接用核函数表示这个映射,用J代替原先的损失l(这里证实了我们把它和第三章联系起来的可行性),再令Ω=0,得
由(6.59)得:
接下来是之前链接里说过的求核矩阵: