自编程实现详见:https://blog.csdn.net/leemusk/article/details/105596434
优点: 泛化错误率低,计算开销不大,结果易解释
缺点: 对参数调节和核函数的选择敏感,原始分类器不加修改仅适用于处理二类问题
使用数据类型: 数值型和标称型数据
希尔伯特空间 H \mathcal{H} H:完备的,可能是无限维的,被赋予內积的线性空间
完备的:对极限是封闭的
內积:具有以下性质
{ 对 称 性 : < f , g > = < g , f > 正 定 性 : < f , f > ≥ 0 , ′ = ′ ⇔ f = 0 线 性 : < r 1 f 1 + r 2 f 2 , g > = r 1 < f 1 , g > + r 2 < f 2 , g > \begin{cases} 对称性:
线性空间:向量空间,支持加法和数乘操作
正定核 :
定义1:
K : χ ∗ χ → R , ∀ x , z ∈ χ , 有 K ( x , z ) , 如 果 ∃ Φ ( x ) → R , Φ ∈ χ s . t K ( x , z ) = < ϕ ( x ) , ϕ ( z ) > , 那 么 称 K ( x , z ) 为 正 定 核 函 数 K: \chi * \chi \rightarrow R , \forall x, z \in \chi , 有 K(x,z), 如果 \exists \Phi(x) \rightarrow R, \Phi \in \chi \\ s.t \quad K(x,z) = <\phi(x), \phi(z)>, 那么称K(x, z)为正定核函数 K:χ∗χ→R,∀x,z∈χ,有K(x,z),如果∃Φ(x)→R,Φ∈χs.tK(x,z)=<ϕ(x),ϕ(z)>,那么称K(x,z)为正定核函数
KKT条件:
定义拉格朗日函数:
{ 可 行 性 条 件 : { c i ( x ∗ ) ≤ 0 h j ( x ∗ ) = 0 α ∗ ≥ 0 互 补 松 弛 条 件 : α i c i = 0 梯 度 为 0 : ∂ f ∂ x ∣ x = x ∗ = 0 \begin{cases} 可行性条件:\begin{cases} c_i(x ^*) \le 0 \\ h_j(x^*)=0 \\ \alpha^* \ge 0 \end{cases} \\ 互补松弛条件: \alpha_i c_i = 0 \\ 梯度为0:\frac {\partial{f}} {\partial{x}} |_{x=x^*}=0 \end{cases} ⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧可行性条件:⎩⎪⎨⎪⎧ci(x∗)≤0hj(x∗)=0α∗≥0互补松弛条件:αici=0梯度为0:∂x∂f∣x=x∗=0
拉格朗日对偶性:
最简单的理解是极小极大化转为极大极小化,主要的公式如下:
1)什么是原始问题,什么是对偶问题,以及它们的最优解
原始问题的无约束条件:
{ m i n x m a x α , β ; α i ≥ 0 s . t α i > 0 \begin{cases} min_x \ max_{\alpha,\beta;\alpha_i \ge 0}\\ s.t \ \alpha_i > 0 \end{cases} \\ {minx maxα,β;αi≥0s.t αi>0
拉格朗日函数:
注意这里的 α i > 0 , c i ( x ) ≤ 0 , h j ( x ) = 0 \alpha_i > 0, c_i(x) \le 0, h_j(x) = 0 αi>0,ci(x)≤0,hj(x)=0
定义原始问题的最优解:
P ∗ = m i n x m a x α , β ; α i ≥ 0 L ( x , α , β ) P^* = min_x max_{\alpha,\beta;\alpha_i \ge 0}L(x,\alpha,\beta) P∗=minxmaxα,β;αi≥0L(x,α,β)
称为原始问题的值。
定义对偶问题的最优值
d ∗ = m a x α , β ; α i ≥ 0 m i n x L ( x , α , β ) d^* =max_{\alpha,\beta;\alpha_i \ge 0} \ min_xL(x,\alpha,\beta) d∗=maxα,β;αi≥0 minxL(x,α,β)
称为对偶问题的值。
弱对偶性: d* <= p*
强对偶性:d* = p*
凸优化 + slater => 强对偶 <=> KKT
凸优化:
凸优化问题是指约束最优化问题:
其中,目标函数 f ( w ) f(w) f(w)和约束函数 g i ( w ) g_i(w) gi(w)是凸函数都是 R n R^n Rn上的连续可微的凸函数, 约束函数 h i ( w ) h_i(w) hi(w) 是 R n R^n Rn上的仿射函数。放射函数是指一元一次方差(y=ax + b)。
凸二次规划:
如果目标函数f(w)是二次函数且约束函数 h i ( w ) h_i(w) hi(w) 是放射函数时,上述凸优化问题成为凸二次规划问题。
我们可以将凸优化理解为:
\quad 可行域:凸集(集合内任意两点的连线在该集合内)
\quad 目标函数:凸函数(函数上任意两点的连线在这两点间的函数曲线的上面,注意直线即时凸函数也是凹函数)
slater条件:
m i ( x ) m_i(x) mi(x)为不等式约束条件
∃ x ^ ∈ r e l i n t D , s . t ∀ i = 1 , . . . , m , m i ( x ^ ) < 0 \exists \hat{x} \in relint \ D, \\ s.t \ \forall i = 1, ..., m,\ m_i(\hat{x}) < 0 \\ ∃x^∈relint D,s.t ∀i=1,...,m, mi(x^)<0
relint: relative interior,意思是相对内部,不包含函数边界上的值
简要表示存在能使所有不等式都小于0的绝对可行点。
支持向量机是判别模型,既支持线性可分数据,又支持非线性可分数据。用于线性可分数据的支持向量机为硬间隔支持向量机,若有一点点误差,则使用软间隔支持向量机,若严格非线性可分,则首先通过低维向高维转换将非线性可分数据转换为线性可分数据,也是输入空间到特征空间的非线性变换,再使用硬间隔支持向量机。因为高维空间比低维空间更容易线性可分。
这里的非线性变换其实指的就是核函数,而且核函数还可以直接求出內积 < ϕ ( x ) , ϕ ( z ) > <\phi(x), \phi(z)> <ϕ(x),ϕ(z)>,而不必纠单独求解 ϕ ( x ) , ϕ ( z ) \phi(x), \phi(z) ϕ(x),ϕ(z),该內积用于求解支持向量机模型的参数值w, b。
硬间隔支持向量机与感知机的异同:
相同点:
1. 决策函数相同
2. 分离超平面相同
3. 都是二类分类器
4. 输入的数据为离散数据
5. 都是判别模型,输出分类结果
不同点:
1. 损失函数不同:
支持向量的损失函数是合页损失
感知机的损失函数为误分类点到分离超平面的总距离
2. 分离超平面的数量:
支持向量机的分离超平面唯一
感知机的分离超平面不唯一
硬间隔支持向量机最大化的思想,对应的优化问题,对偶问题和响应算法:
支持向量机最简单的情况是线性可分支持向量机,或硬间隔支持向量机。构建它的条件是训练数据线性可分。其学习策略是最大间隔法。
最大间隔法:找个一个分离超平面,其训练样本的最小的几何距离(可以理解为靠分离超平面最近点的样本到分离超平面的距离)是所有分离超平面中最大的。
无约束形式:
m a x w , b m i n x i , i = 1... N 1 ∣ ∣ w ∣ ∣ ( w T x i + b ) y i = m a x w , b 1 ∣ ∣ w ∣ ∣ m i n x i , i = 1... N ( w T x i + b ) y i max_{w,b} min_{x_i, i=1...N} \frac 1 {||w||}(w^Tx_i + b )y_i=max_{w,b} \frac 1 {||w||} min_{x_i, i=1...N}(w^Tx_i + b )y_i maxw,bminxi,i=1...N∣∣w∣∣1(wTxi+b)yi=maxw,b∣∣w∣∣1minxi,i=1...N(wTxi+b)yi
因为 ( w T x i + b ) y i (w^Tx_i + b )y_i (wTxi+b)yi为函数距离,所以可以任意假设取值,则令 m i n x i , i = 1... N ( w T x i + b ) y i = 1 → ( w T x i + b ) y i > 1 min_{x_i, i=1...N}(w^Tx_i + b )y_i = 1 \rightarrow (w^Tx_i + b )y_i > 1 minxi,i=1...N(wTxi+b)yi=1→(wTxi+b)yi>1,
转为有约束形式:
m a x w , b 1 ∣ ∣ w ∣ ∣ s . t ( w T x i + b ) y i > 1 max_{w,b}\frac 1 {||w||} \\ s.t \quad (w^Tx_i + b )y_i > 1 maxw,b∣∣w∣∣1s.t(wTxi+b)yi>1
考虑到计算方便将其原始最优化问题转换为如下形式:
因为svm满足强对偶的条件,所以可以通过拉格朗日对偶转换以及KKT条件求得支持向量机模型参数。
对偶问题:
通过SMO等凸二次规划问题的求解算法对以下对偶问题进行求解,可以到的 α \alpha α的值。
得到线性可分支持向量机,分离超平面是:
决策函数是:
最大间隔法中,函数间距与几何间距是最重要的概念。
函数间距: ∣ w ⋅ x + b ∣ |w \cdot x + b| ∣w⋅x+b∣
几何间距: ∣ w ⋅ x + b ∣ ∣ ∣ w ∣ ∣ \frac {|w \cdot x + b|} {||w||} ∣∣w∣∣∣w⋅x+b∣
w成比例变化的时候,函数间距改变,几何间距不变,我们需要的是只要w各参数的比例不变,则距离不变,所以在最优化是需要选择几何间距。
线性可分支持向量机的最优解存在且唯一(证明见下文)。位于间隔边界上的实例点为支持向量。最优分离超平面有支持向量完全决定。即可以理解为支持向量机值取决于训练集中的极小部分重要的样本点。
二次规划问题的对偶问题是:
软间隔支持向量机最大化的思想,对应的优化问题,对偶问题和响应算法:
现实中训练数据是线性可分的情况较少,训练数据往往是近似线性可分的,这是使用线性支持向量机,或软间隔支持向量机。线性支持向量机是最基本的支持向量机。
对于噪声或例外,通过引入松弛变量 ξ i \xi_i ξi,使其“可分”,得到线性支持向量机学习的凸二次规划问题,其原始最优化问题是:
同线性可分支持向量机一样,首先求解对偶问题的最优解a *,然后求最优值w *和b *,得到支持向量机:
对偶问题:
通过对对偶问题进行求解,可以到的 α \alpha α的值。
其超平面
分类决策函数为
但需要注意的一点是线性支持向量机的解w *唯一但b *不唯一。其范围如图显示:
上支撑边界最低为蓝色虚线处,即最靠近分离超平面的蓝色噪声的决定的支持边界,下支撑边界最高为红色虚线处,即最靠近分离超平面的红色噪声的决定的支持边界。
对偶问题的解a *中满足 α i ∗ > 0 \alpha_i^*>0 αi∗>0的实例点 x i x_i xi称为支持向量。支持向量可在间隔边界上,也可以间隔边界与分离超平面之间,或者在在分离超平面误分一侧。最优分离超平面有支持向量完全决定。
这里可由KKT条件中得出此结论,KKT条件中有一条互补松弛条件:
α i ( 1 − y i ( w ⋅ x + b ) − ξ i ) = 0 \alpha_i(1-y_i(w \cdot x + b) - \xi_i) = 0 αi(1−yi(w⋅x+b)−ξi)=0。
当 α i ∗ > 0 \alpha_i^*>0 αi∗>0时, 1 − y i ( w ⋅ x + b ) − ξ i = 0 1-y_i(w \cdot x + b) - \xi_i=0 1−yi(w⋅x+b)−ξi=0, ξ i = m a x ( 0 , 1 − y i ( w ⋅ x + b ) ) \quad \xi_i=max(0, 1-y_i(w \cdot x + b)) ξi=max(0,1−yi(w⋅x+b))
当样本点在间隔边界上,或在间隔边界与分离超平面之间,或在分离超平面误分一侧时, ξ i \xi_i ξi为该样本点到间隔边界的距离即 1 − y i ( w ⋅ x + b ) 1-y_i(w \cdot x + b) 1−yi(w⋅x+b),此时 1 − y i ( w ⋅ x + b ) − ξ i = 0 1-y_i(w \cdot x + b) - \xi_i = 0 1−yi(w⋅x+b)−ξi=0,否则为 ξ i = 0 \xi_i=0 ξi=0, 1 − y i ( w ⋅ x + b ) − ξ i > 0 1-y_i(w \cdot x + b) - \xi_i \ > 0 1−yi(w⋅x+b)−ξi >0,不满足互补松弛条件。
线性支持向量机学习等价于最小化二阶范数正则化的合页函数:
合页函数
可以理解为: m a x ( 0 , 1 − y i ( w ⋅ x + b ) ) max(0, 1-y_i(w \cdot x + b)) max(0,1−yi(w⋅x+b))
合页损失函数图为:
在支持向量机中,我们通常将合页函数作为损失函数,但事实上0-1损失是真正的损失函数,不过应为0-1损失不是连续可导的,直接优化其构成的目标函数比较困难,可以认为线性支持向量机最优化由0-1损失函数的上界(合页损失函数)构成的目标函数。
非线性支持向量机
对于输入空间的非线性分类问题,可以通过非线性变换将它转为某个高维特征空间中的线性分类问题,在高维特征空间中学习线性支持向量机。由于在线性支持向量机学习的对偶问题里,目标函数和分类决策函数都只涉及实例与实例之间的內积,所以不需要显示地指定非线性变换,而是用核函数来替代当中的內积。核函数表示,通过一个非线性转换后的两个实例间的內积。具体地,K(x,z)是一个核函数,或正定核,意味着存在一个从输入空间x到特征空间 χ \chi χ的映射Ø(x): χ \chi χ→ H \mathcal{H} H,对任意地 x , z ∈ H x,z \in \mathcal{H} x,z∈H,有
我们可以这么理解核函数的作用,核函数既包含了输入空间到特征空间的非线性变换,又包含了用于对偶问题的两个向量的內积。这样只要我们知道了核函数,就可以直接按照线性支持向量机模型的算法计算就可以了。
常用的核函数:
SMO算法
SMO算法是支持向量机学习的一种快速算法,其特点是不断地将原二次规划问题分解为只有两个变量的二次规划子问题,并对子问题进行解析求解,知道所有变量满足KKT条件为止。这样通过启发式的方法得到原二次规划问题的最优解。因为子问题有解析解,所有每次计算子问题都很快,虽然计算子问题次数很多,但在总体上还是高效的。
关于SMO的详细计算过程可以参考:https://blog.csdn.net/leemusk/article/details/105253485
以下仅给出其算法过程:
from sklearn.svm import SVC
import numpy as np
import matplotlib.pyplot as plt
def draw(X,y,w,b):
y=np.array([y[i] for i in range(y.shape[0])])
X_po=X[np.where(y==1)]
X_ne=X[np.where(y==-1)]
x_1=X_po[:,0]
y_1=X_po[:,1]
x_2=X_ne[:,0]
y_2=X_ne[:,1]
plt.plot(x_1,y_1,"ro")
plt.plot(x_2,y_2,"gx")
x=np.array([0,3])
y=(-b-w[0]*x)/w[1]
y_po=(1-b-w[0]*x)/w[1]
y_ne=(-1-b-w[0]*x)/w[1]
plt.plot(x,y,"r-")
plt.plot(x,y_po,"b-")
plt.plot(x,y_ne,"b-")
plt.show()
def main():
X=np.array([[1,2],
[2,3],
[3,3],
[2,1],
[3,2]])
y=np.array([1,1,1,-1,-1])
clf=SVC(C=10,kernel="linear")
clf.fit(X,y)
w=clf.coef_[0]
b=clf.intercept_
print(clf.support_vectors_)
print(w,b)
print(clf.predict([[5,6],[-1,-1]]))
print(clf.score(X,y))
draw(X,y,w,b)
if __name__=="__main__":
main()