概述
支持向量机(Support Vecor Machine, SVM)本身是一个二元分类算法,是对感知器算法模型的一种扩展,现在的SVM算法支持线性分类和非线性分类的分类应用,并且也能够直接将SVM应用于回归应用中 。我们也可以将SVM应用在多元分类领域中。
概念
- 线性可分(Linearly Separable):在数据集中,如果可以找出一个超平面,将两组数据分开,那么这个数据集叫做线性可分数据。
- 线性不可分(Linear Inseparable):在数据集中,没法找出一个超平面,能够将两组数据分开,那么这个数据集就叫做线性不可分数据。
- 分割超平面(Separating Hyperplane):将数据集分割开来的直线/平面叫做分割超平面。
- 间隔(Margin):数据点到分割超平面的距离称为间隔。
- 支持向量(Support Vector):离分割超平面最近的那些点叫做支持向量
数学知识
梯度下降
- 梯度下降法(Gradient Descent, GD)常用于求解无约束情况下凸函数(Convex Function)的极小值,是一种迭代类型的算法,因为凸函数只有一个极值点,故求解出来的极小值点就是函数的最小值点。
- 最优化问题一般是指对于某一个函数而言,求解在其指定作用域上的全局最小值问题,一般分为以下三种情况(备注:以下几种方式求出来的解都有可能是局部极小值,只有当函数是凸函数的时候,才可以得到全局最小值) :
- 无约束问题:求解方式一般求解方式梯度下降法
- 等式约束条件:求解方式一般为拉格朗日乘子法
- 不等式约束条件:求解方式一般为KKT条件
拉格朗日乘数法
拉格朗日乘子法就是当我们的优化函数存在等值约束的情况下的一种最优化求解方式;其中参数α被称为拉格朗日乘子,要求α不等于0。
对偶问题
在优化问题中,目标函数f(x)存在多种形式,如果目标函数和约束条件都为变量x的线性函数,则称问题为线性规划;如果目标函数为二次函数,则称最优化问题为二次规划;如果目标函数或者约束条件为非线性函数,则称最优化问题为非线性优化。每个线性规划问题都有一个对应的对偶问题。
对偶问题具有以下几个特性:
- 对偶问题的对偶是原问题;
- 无论原始问题是否是凸的,对偶问题都是凸优化问题;
- 对偶问题可以给出原始问题的一个下界;
- 当满足一定条件的时候,原始问题和对偶问题的解是完美等价的
KKT条件
-
KKT条件是泛拉格朗日乘子法的一种形式;主要应用在当我们的优化函数存在不等值约束的情况下的一种最优化求解方式;KKT条件即满足不等式约束情况下的条件
min x f ( x ) s.t : h k ( x ) = 0 , k = 1 , 2 , … , p g j ( x ) ≤ 0 , j = 1 , 2 , … , q L ( x , α , β ) = f ( x ) + ∑ i = 1 p α i h i ( x ) + ∑ i = 1 q β i g i ( x ) ; α i ≠ 0 , β i ≥ 0 min x L ( x , α , β ) \min _{x} f(x) \\ \text { s.t }: h_{k}(x)=0, k=1,2, \ldots, p \\ g_{j}(x) \leq 0, j=1,2, \ldots, q \\ L(x, \alpha, \beta)=f(x)+\sum_{i=1}^{p} \alpha_{i} h_{i}(x)+\sum_{i=1}^{q} \beta_{i} g_{i}(x) ; \alpha_{i} \neq 0, \beta_{i} \geq 0 \\ \min _{x} L(x, \alpha, \beta) xminf(x) s.t :hk(x)=0,k=1,2,…,pgj(x)≤0,j=1,2,…,qL(x,α,β)=f(x)+i=1∑pαihi(x)+i=1∑qβigi(x);αi=0,βi≥0xminL(x,α,β)
-
可行解必须在约束区域g(x)之内,由图可知可行解x只能在g(x)<0和g(x)=0的区域取得.
- 当可行解x在g(x)<0的区域中的时候,此时直接极小化f(x)即可得到
- 当可行解x在g(x)=0的区域中的时候,此时直接等价于等式约束问题的求解
-
当可行解在约束内部区域的时候,令β=0即可消去约束
- 对于参数β的取值而言,在等值约束中,约束函数和目标函数的梯度只要满足平行即可,而在不等式约束中,若β≠0,则说明可行解在约束区域的边界上,这个时候可行解应该尽可能的靠近无约束情况下的解,所以在约束边界上,目标函数的负梯度方向应该远约束区域朝无约束区域时的解,此时约束函数的梯度方向与目标函数的负梯度方向应相同;从而可以得出β>0
min x f ( x ) s.t : g j ( x ) ≤ 0 , j = 1 , 2 , … , q L ( x , β ) = f ( x ) + ∑ i = 1 q β i g i ( x ) ; β i ≥ 0 \min _{x} f(x) \\ \text { s.t }: g_{j}(x) \leq 0, j=1,2, \ldots, q \\ L(x, \beta)= f(x)+\sum_{i=1}^{q} \beta_{i} g_{i}(x) ; \beta_{i} \geq 0 xminf(x) s.t :gj(x)≤0,j=1,2,…,qL(x,β)=f(x)+i=1∑qβigi(x);βi≥0
β i ≥ 0 g i ( x ) ≤ 0 } ⇒ β i g i ( x ) ≤ 0 ∴ f ( x ) = max β L ( x , β ) ∴ min x f ( x ) = min x max β L ( x , β ) \begin{array}{l} \left.\begin{array}{l} \beta_{i} \geq 0 \\ g_{i}(x) \leq 0 \end{array}\right\} \Rightarrow \beta_{i} g_{i}(x) \leq 0 \\ \therefore f(x)=\max _{\beta} L(x, \beta) \\ \therefore \min _{x} f(x)=\min _{x} \max _{\beta} L(x, \beta) \end{array} βi≥0gi(x)≤0}⇒βigi(x)≤0∴f(x)=maxβL(x,β)∴minxf(x)=minxmaxβL(x,β)
max β min x L ( x , β ) = max β [ min x f ( x ) + min x β g ( x ) ] = max β min x f ( x ) + max β min x β g ( x ) = min x f ( x ) + max β min x β g ( x ) ∵ β i ≥ 0 g i ( x ) ≤ 0 } ⇒ min x β i g i ( x ) = { 0 , β 为0或者 g ( x ) 为 0 − ∞ , β > 0 且 g ( x ) < 0 ∴ max β min x β i g i ( x ) = 0 ∴ min x f ( x ) = max β min x L ( x , β ) ; β = 0 或者 g ( x ) = 0 \begin{array}{l} \max _{\beta} \min _{x} L(x, \beta)=\max _{\beta}\left[\min _{x} f(x)+\min _{x} \beta g(x)\right] \\ =\max _{\beta} \min _{x} f(x)+\max _{\beta} \min _{x} \beta g(x)=\min _{x} f(x)+\max _{\beta} \min _{x} \beta g(x) \\ \left.\because \begin{array}{l} \beta_{i} \geq 0 \\ g_{i}(x) \leq 0 \end{array}\right\} \Rightarrow \min _{x} \beta_{i} g_{i}(x)=\left\{\begin{array}{l} 0, \beta \text { 为0或者 } g(x) \text { 为 } 0 \\ -\infty, \quad \beta>0 \text { 且 } g(x)<0 \end{array}\right. \\ \therefore \max _{\beta} \min _{x} \beta_{i} g_{i}(x)=0 \\ \therefore \min _{x} f(x)=\max _{\beta} \min _{x} L(x, \beta) ; \quad \beta=0 \text { 或者 } g(x)=0 \end{array} maxβminxL(x,β)=maxβ[minxf(x)+minxβg(x)]=maxβminxf(x)+maxβminxβg(x)=minxf(x)+maxβminxβg(x)∵βi≥0gi(x)≤0}⇒minxβigi(x)={0,β 为0或者 g(x) 为 0−∞,β>0 且 g(x)<0∴maxβminxβigi(x)=0∴minxf(x)=maxβminxL(x,β);β=0 或者 g(x)=0
硬间隔SVM
目标函数推导
考虑二分类问题,y的值为+1、-1
- 设置分隔超平面: y ( x ) = w T Φ ( x ) + b y(x)=w^T \Phi(x)+b y(x)=wTΦ(x)+b
- 可以得到
{ y ( x i ) > 0 ⇔ y i = + 1 y ( x i ) < 0 ⇔ y i = − 1 ⇒ y i ⋅ y ( x i ) > 0 \left\{\begin{array}{l} y\left(x_{i}\right)>0 \Leftrightarrow y_{i}=+1 \\ y\left(x_{i}\right)<0 \Leftrightarrow y_{i}=-1 \end{array} \Rightarrow y_{i} \cdot y\left(x_{i}\right)>0\right. {y(xi)>0⇔yi=+1y(xi)<0⇔yi=−1⇒yi⋅y(xi)>0
- SVM使用距离进行切分的,并进行缩放可得到
d i s t = ∣ A x 0 + B y 0 + C ∣ ( A 2 + B 2 ) ⇒ d i s t = ∣ f ( X 0 ) ∣ ∣ ∣ θ ∣ ∣ 2 ⇒ y i ⋅ y ( x i ) ∣ ∣ w ∣ ∣ = y i ⋅ ( w T Φ ( x i ) + b ) ∣ ∣ w ∣ ∣ dist=\frac{|Ax_0+By_0+C|}{\sqrt(A^2+B^2)} \Rightarrow dist=\frac{|f(X_0)|}{||\theta||_2} \Rightarrow \frac{y_i \cdot y(x_i)}{||w||}=\frac{y_i \cdot (w^T \Phi(x_i)+b)}{||w||} dist=( A2+B2)∣Ax0+By0+C∣⇒dist=∣∣θ∣∣2∣f(X0)∣⇒∣∣w∣∣yi⋅y(xi)=∣∣w∣∣yi⋅(wTΦ(xi)+b)
- 目的:找到距离分割超平面最近的样本,让它与超平面距离最远
a r g m a x w , b m i n i y i ⋅ ( w T Φ ( x i ) + b ∣ ∣ w ∣ ∣ ⇒ a r g m a x w , b { 1 ∣ ∣ w ∣ ∣ m i n i [ y i ⋅ ( w T Φ ( x i ) + b ) ] } argmax_{w,b}min_{i} \frac{y_i \cdot (w^T \Phi(x_i)+b}{||w||} \Rightarrow argmax_{w,b} \{ \frac{1}{||w||} min_{i} \left[ y_i \cdot (w^T \Phi(x_i)+b) \right] \} argmaxw,bmini∣∣w∣∣yi⋅(wTΦ(xi)+b⇒argmaxw,b{∣∣w∣∣1mini[yi⋅(wTΦ(xi)+b)]}
- 可以通过等比缩放的方法w的方法,使得正负类别点的函数值都满足 ∣ y ∣ ≥ 1 |y|≥ 1 ∣y∣≥1,即 y i ⋅ ( w T Φ ( x i ) + b ) ≥ 1 y_i \cdot (w^T \Phi(x_i)+b) \geq 1 yi⋅(wTΦ(xi)+b)≥1,那么
a r g m a x w , b { 1 ∣ ∣ w ∣ ∣ m i n i [ y i ⋅ ( w T Φ ( x i ) + b ) ] } ⇒ a r g m a x w , b 1 ∣ ∣ w ∣ ∣ argmax_{w,b} \{ \frac{1}{||w||} min_{i} \left[ y_i \cdot (w^T \Phi(x_i)+b) \right] \} \Rightarrow argmax_{w,b} \frac{1}{||w||} argmaxw,b{∣∣w∣∣1mini[yi⋅(wTΦ(xi)+b)]}⇒argmaxw,b∣∣w∣∣1
- 而以上形式不方便求最大值,所以我们将求最大的目标函数修改为求最小的目标函数,为:
min w , b 1 2 ∥ w ∥ 2 s.t. y i ( w T ⋅ Φ ( x i ) + b ) ≥ 1 , i = 1 , 2 , ⋯ , n \min _{w, b} \frac{1}{2}\|w\|^{2} \\ \text { s.t. } y_{i}\left(w^{T} \cdot \Phi\left(x_{i}\right)+b\right) \geq 1, \quad i=1,2, \cdots, n w,bmin21∥w∥2 s.t. yi(wT⋅Φ(xi)+b)≥1,i=1,2,⋯,n
- 根据拉格朗日乘数法:
L ( w , b , α ) = 1 2 ∥ w ∥ 2 − ∑ i = 1 n α i y i ( w T ⋅ Φ ( x i ) + b ) − 1 ) L(w,b,\alpha)=\frac{1}{2}\|w\|^{2}-\sum_{i=1}^{n} \alpha_i y_{i}\left(w^{T} \cdot \Phi\left(x_{i}\right)+b)-1 \right) L(w,b,α)=21∥w∥2−i=1∑nαiyi(wT⋅Φ(xi)+b)−1)
- 对原问题进行对偶转换
m i n w , b m a x α L ( w , b , α ) ⇒ m a x α m i n w , b L ( w , b , α ) min_{w,b}max_{\alpha}L(w,b,\alpha) \Rightarrow max_{\alpha}min_{w,b}L(w,b,\alpha) minw,bmaxαL(w,b,α)⇒maxαminw,bL(w,b,α)
- 拉格朗日函数对w,b求偏导,并等于0,得:
∂ L ∂ w = 0 ⇒ w = ∑ i = 1 n α i y i Φ ( x i ) ∂ L ∂ b = 0 ⇒ 0 = ∑ i = 1 n α i y i \frac{\partial L}{\partial w}=0 \Rightarrow w=\sum_{i=1}^{n}\alpha_i y_i \Phi(x_i) \\ \frac{\partial L}{\partial b}=0 \Rightarrow 0=\sum_{i=1}^{n}\alpha_i y_i ∂w∂L=0⇒w=i=1∑nαiyiΦ(xi)∂b∂L=0⇒0=i=1∑nαiyi
- 代入
L ( w , b , α ) = 1 2 ∥ w ∥ 2 − ∑ i = 1 n α i ( y i ( w T ⋅ Φ ( x i ) + b ) − 1 ) = 1 2 w T w − w T ∑ i = 1 n α i y i Φ ( x i ) − b ∑ i = 1 n α i y i + ∑ i = 1 n α i = 1 2 w T ∑ i = 1 n α i y i Φ ( x i ) − w T ∑ i = 1 n α i y i Φ ( x i ) − b ⋅ 0 + ∑ i = 1 n α i = ∑ i = 1 n α i − 1 2 ( ∑ i = 1 n α i y i Φ ( x i ) ) T ∑ i = 1 n α i y i Φ ( x i ) = ∑ i = 1 n α i − 1 2 ∑ i , j = 1 n α i α j y i y j Φ T ( x i ) Φ ( x j ) a ∗ = arg max α ( ∑ i = 1 n α i − 1 2 ∑ i , j = 1 n α i α j y i y j Φ T ( x i ) Φ ( x j ) ) ] \begin{aligned} L(w, b, \alpha)=& \frac{1}{2}\|w\|^{2}-\sum_{i=1}^{n} \alpha_{i}\left(y_{i}\left(w^{T} \cdot \Phi\left(x_{i}\right)+b\right)-1\right) \\ =& \frac{1}{2} w^{T} w-w^{T} \sum_{i=1}^{n} \alpha_{i} y_{i} \Phi\left(x_{i}\right)-b \sum_{i=1}^{n} \alpha_{i} y_{i}+\sum_{i=1}^{n} \alpha_{i} \\ =& \frac{1}{2} w^{T} \sum_{i=1}^{n} \alpha_{i} y_{i} \Phi\left(x_{i}\right)-w^{T} \sum_{i=1}^{n} \alpha_{i} y_{i} \Phi\left(x_{i}\right)-b \cdot 0+\sum_{i=1}^{n} \alpha_{i} \\ =& \sum_{i=1}^{n} \alpha_{i}-\frac{1}{2}\left(\sum_{i=1}^{n} \alpha_{i} y_{i} \Phi\left(x_{i}\right)\right)^{T} \sum_{i=1}^{n} \alpha_{i} y_{i} \Phi\left(x_{i}\right) \\ =& \sum_{i=1}^{n} \alpha_{i}-\frac{1}{2} \sum_{i, j=1}^{n} \alpha_{i} \alpha_{j} y_{i} y_{j} \Phi^{T}\left(x_{i}\right) \Phi\left(x_{j}\right) \\ a^{*}=& \left.\underset{\alpha}{\arg \max }\left(\sum_{i=1}^{n} \alpha_{i}-\frac{1}{2} \sum_{i, j=1}^{n} \alpha_{i} \alpha_{j} y_{i} y_{j} \Phi^{T}\left(x_{i}\right) \Phi\left(x_{j}\right)\right)\right] \end{aligned} L(w,b,α)=====a∗=21∥w∥2−i=1∑nαi(yi(wT⋅Φ(xi)+b)−1)21wTw−wTi=1∑nαiyiΦ(xi)−bi=1∑nαiyi+i=1∑nαi21wTi=1∑nαiyiΦ(xi)−wTi=1∑nαiyiΦ(xi)−b⋅0+i=1∑nαii=1∑nαi−21(i=1∑nαiyiΦ(xi))Ti=1∑nαiyiΦ(xi)i=1∑nαi−21i,j=1∑nαiαjyiyjΦT(xi)Φ(xj)αargmax(i=1∑nαi−21i,j=1∑nαiαjyiyjΦT(xi)Φ(xj))]
- 对 α \alpha α求极大值,添加负号,改为求最小值
min α − ( ∑ i = 1 n α i − 1 2 ∑ i , j = 1 n α i α j y i y j Φ T ( x i ) Φ ( x j ) ) ] s.t. α i , i = 1 , 2 , ⋯ , n ∑ i = 1 n α i y i = 0 \left.\underset{\alpha}{\min} -\left(\sum_{i=1}^{n} \alpha_{i}-\frac{1}{2} \sum_{i, j=1}^{n} \alpha_{i} \alpha_{j} y_{i} y_{j} \Phi^{T}\left(x_{i}\right) \Phi\left(x_{j}\right)\right)\right] \\ \text { s.t. } \alpha_i, \quad i=1,2, \cdots, n \\ \sum_{i=1}^{n}\alpha_i y_i=0 αmin−(i=1∑nαi−21i,j=1∑nαiαjyiyjΦT(xi)Φ(xj))] s.t. αi,i=1,2,⋯,ni=1∑nαiyi=0
- 对此等值约束问题求出 α \alpha α的最优解
- 通过以上步骤,计算
w ∗ = ∑ i = 1 N α i ∗ y i Φ ( x i ) b ∗ = y i − ∑ i = 1 N α i ∗ y i ( Φ ( x i ) ⋅ Φ ( x j ) ) \begin{aligned} w^{*} &=\sum_{i=1}^{N} \alpha_{i}^{*} y_{i} \Phi\left(x_{i}\right) \\ b^{*} &=y_{i}-\sum_{i=1}^{N} \alpha_{i}^{*} y_{i}\left(\Phi\left(x_{i}\right) \cdot \Phi\left(x_{j}\right)\right) \end{aligned} w∗b∗=i=1∑Nαi∗yiΦ(xi)=yi−i=1∑Nαi∗yi(Φ(xi)⋅Φ(xj))
- 求得分离超平面: w ∗ Φ ( x ) + b ∗ = 0 w^{*}\Phi(x)+b^{*}=0 w∗Φ(x)+b∗=0
- 则分类函数为: f ( x ) = s i g n ( w ∗ Φ ( x ) + b ∗ ) f(x)=sign(w^{*}\Phi(x)+b^{*}) f(x)=sign(w∗Φ(x)+b∗)
总结
- 要求数据必须是线性可分的;
- 纯线性可分的SVM模型对于异常数据的预测可能会不太准;
- 对于线性可分的数据,SVM分类器的效果非常不错。
软间隔SVM
- 原因:有时候不能满足所有训练集样本点分类正确,这样会降低泛化能力。
如果数据线性不可分,加上松弛因子 ξ ≥ 0 \xi \geq 0 ξ≥0,让函数加上松弛因子大于等于1,修改后的约束条件变为:
y i ( w ⋅ x i + b ) ≥ 1 − ξ i y_i(w \cdot x_i+b) ≥ 1-\xi_i yi(w⋅xi+b)≥1−ξi
目标函数修改为:
min w , b 1 2 ∥ w ∥ 2 + C ∑ i = 1 N ξ i min w , b , ξ 1 2 ∥ w ∥ 2 + C ∑ i = 1 N ξ i s.t. y i ( w ⋅ x i + b ) ≥ 1 − ξ i , i = 1 , 2 , ⋯ , n ξ i ≥ 0 , i = 1 , 2 , ⋯ , n \min _{w, b} \frac{1}{2}\|w\|^{2}+C \sum_{i=1}^{N} \xi_{i} \\ \min _{w, b, \xi} \frac{1}{2}\|w\|^{2}+C \sum_{i=1}^{N} \xi_{i} \\ \text { s.t. } \quad y_{i}\left(w \cdot x_{i}+b\right) \geq 1-\xi_{i}, \quad i=1,2, \cdots, n \\ \quad \xi_{i} \geq 0, \quad i=1,2, \cdots, n w,bmin21∥w∥2+Ci=1∑Nξiw,b,ξmin21∥w∥2+Ci=1∑Nξi s.t. yi(w⋅xi+b)≥1−ξi,i=1,2,⋯,nξi≥0,i=1,2,⋯,n
拉格朗日函数为:
L ( w , b , ξ , α , μ ) ≡ 1 2 ∥ w ∥ 2 + C ∑ i = 1 n ξ i − ∑ i = 1 n α i ( y i ( w ⋅ x i + b ) − 1 + ξ i ) − ∑ i = 1 n μ i ξ i L(w, b, \xi, \alpha, \mu) \equiv \frac{1}{2}\|w\|^{2}+C \sum_{i=1}^{n} \xi_{i}-\sum_{i=1}^{n} \alpha_{i}\left(y_{i}\left(w \cdot x_{i}+b\right)-1+\xi_{i}\right)-\sum_{i=1}^{n} \mu_{i} \xi_{i} L(w,b,ξ,α,μ)≡21∥w∥2+Ci=1∑nξi−i=1∑nαi(yi(w⋅xi+b)−1+ξi)−i=1∑nμiξi
对参数求偏导得:
∂ L ∂ w = 0 ⇒ w = ∑ i = 1 n α i y i ϕ ( x n ) ∂ L ∂ b = 0 ⇒ 0 = ∑ i = 1 n α i y i ∂ L ∂ ξ = 0 ⇒ C − α i − μ i = 0 \frac{\partial L}{\partial w}=0 \Rightarrow w=\sum_{i=1}^{n} \alpha_{i} y_{i} \phi\left(x_{n}\right) \\ \frac{\partial L}{\partial b}=0 \Rightarrow 0=\sum_{i=1}^{n} \alpha_{i} y_{i} \\ \frac{\partial L}{\partial \xi}=0 \Rightarrow C-\alpha_{i}-\mu_{i}=0 ∂w∂L=0⇒w=i=1∑nαiyiϕ(xn)∂b∂L=0⇒0=i=1∑nαiyi∂ξ∂L=0⇒C−αi−μi=0
代入L中,得:
m i n w , b ξ L ( w , b , ξ , α , μ ) = − 1 2 ∑ i = 1 n ∑ j = 1 n α i α j y i y j ( x i ⋅ x j ) + ∑ i = 1 n α i min_{w,b\xi} L(w, b, \xi, \alpha, \mu)=-\frac{1}{2} \sum_{i=1}^{n} \sum_{j=1}^{n} \alpha_i \alpha_j y_i y_j (x_i \cdot x_j)+\sum_{i=1}^{n}\alpha_i minw,bξL(w,b,ξ,α,μ)=−21i=1∑nj=1∑nαiαjyiyj(xi⋅xj)+i=1∑nαi
求 α \alpha α极大值转化为:
min α 1 2 ∑ i = 1 n ∑ j = 1 n α i α j y i y j ( x i ⋅ x j ) − ∑ i = 1 n α i s.t. ∑ i = 1 n α i y i = 0 0 ≤ α i ≤ C , i = 1 , 2 , … , n \min _{\alpha} \frac{1}{2} \sum_{i=1}^{n} \sum_{j=1}^{n} \alpha_{i} \alpha_{j} y_{i} y_{j}\left(x_{i} \cdot x_{j}\right)-\sum_{i=1}^{n} \alpha_{i} \\ \text { s.t. } \sum_{i=1}^{n} \alpha_{i} y_{i}=0 \\ 0 \leq \alpha_{i} \leq C, \quad i=1,2, \ldots, n αmin21i=1∑nj=1∑nαiαjyiyj(xi⋅xj)−i=1∑nαi s.t. i=1∑nαiyi=00≤αi≤C,i=1,2,…,n
对等值约束求最优解 α \alpha α
核函数
- 可以使用核函数,将原有的空间映射到更高维的空间,从而可以将线性不可分问题处理到在核空间中可分的状态
- 多项式核函数: K ( x 1 , x 2 ) = ( α ∣ ∣ x q − x 2 ∣ ∣ a + r ) b , α , a , b , r 为 常 数 K(x_1,x_2)=(\alpha||x_q-x_2||^a+r)^b,\alpha,a,b,r为常数 K(x1,x2)=(α∣∣xq−x2∣∣a+r)b,α,a,b,r为常数
- 高斯核函数RBF: K ( x 1 , x 2 ) = e − ∣ ∣ x 1 − x 2 ∣ ∣ 2 2 σ 2 K(x_1,x_2)=e^{-\frac{||x_1-x_2||^2}{2\sigma^2}} K(x1,x2)=e−2σ2∣∣x1−x2∣∣2
- Sigmoid核函数: K ( x 1 , x 2 ) = t a n h ( γ ⋅ ∣ ∣ x 1 − x 2 ∣ ∣ a + r ) , γ , a , r 为 常 数 K(x_1,x_2)=tanh(\gamma \cdot ||x_1-x_2||^a+r),\gamma,a,r为常数 K(x1,x2)=tanh(γ⋅∣∣x1−x2∣∣a+r),γ,a,r为常数
- 正常情况下需要使用网格搜索进行处理得到最优的核函数
python实现
API
- 分类
- sklearn.svm.SVC(C=1.0, kernel=‘rbf’, degree=3, gamma=‘auto’, coef0=0.0, shrinking=True,probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1,decision_function_shape=None,random_state=None)
- C:C-SVC的惩罚参数C?默认值是1.0 C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的
惩罚增大
- kernel :核函数,默认是rbf,可以是‘linear’, ‘poly’, ‘rbf’,‘sigmoid’, ‘precomputed’
- RBF函数:高斯核函数
- sigmoid:sigmoid函数
- degree :多项式poly函数的维度,默认是3,选择其他核函数时会被忽略
- 回归
- 与分类类似
- sklearn.svm.SVR(kernel =‘rbf’,degree = 3,gamma =‘auto_deprecated’,coef0 = 0.0,tol =0.001,C = 1.0,epsilon = 0.1,shrinking = True,cache_size = 200,verbose = False,max_iter= -1 )
例子
分类
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import matplotlib as mpl
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
data = pd.read_csv(r'..\datas\iris.txt', header=None)
x = data.iloc[:, :2]
y = data.iloc[:, -1:]
label = LabelEncoder()
y = label.fit_transform(y)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)
clf = SVC(C=0.8, kernel='rbf', gamma=20, decision_function_shape='ovr')
clf.fit(x_train, y_train.ravel())
y_train_hat = clf.predict(x_train)
print(accuracy_score(y_train, y_train_hat))
y_test_hat = clf.predict(x_test)
print(accuracy_score(y_test, y_test_hat))
iris_feature = '花萼长度', '花萼宽度', '花瓣长度', '花瓣宽度'
x1_min, x1_max = x.iloc[:, 0].min(), x.iloc[:, 0].max()
x2_min, x2_max = x.iloc[:, 1].min(), x.iloc[:, 1].max()
x1, x2 = np.mgrid[x1_min:x1_max:500j, x2_min:x2_max:500j]
grid_test = np.stack((x1.flat, x2.flat), axis=1)
Z = clf.decision_function(grid_test)
print(Z)
grid_hat = clf.predict(grid_test)
print(grid_hat)
grid_hat = grid_hat.reshape(x1.shape)
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False
cm_light = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])
cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])
x1_min, x1_max = x.iloc[:, 0].min(), x.iloc[:, 0].max()
x2_min, x2_max = x.iloc[:, 1].min(), x.iloc[:, 1].max()
x1, x2 = np.mgrid[x1_min:x1_max:500j, x2_min:x2_max:500j]
grid_test = np.stack((x1.flat, x2.flat), axis=1)
plt.pcolormesh(x1, x2, grid_hat, cmap=cm_light)
plt.scatter(x.iloc[:, 0], x.iloc[:, 1], c=y, edgecolors='k', s=50, cmap=cm_dark)
plt.scatter(x_test.iloc[:, 0], x_test.iloc[:, 1], s=120, facecolors='none', zorder=10)
plt.xlabel(iris_feature[0], fontsize=13)
plt.ylabel(iris_feature[1], fontsize=13)
plt.xlim(x1_min, x1_max)
plt.ylim(x2_min, x2_max)
plt.title(u'鸢尾花SVM二特征分类', fontsize=15)
plt.grid()
plt.show()
回归
import numpy as np
from sklearn.svm import SVR
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
N = 50
np.random.seed(0)
x = np.sort(np.random.uniform(0, 6, N), axis=0)
y = 2*np.sin(x) + 0.1*np.random.randn(N)
x = x.reshape(-1, 1)
svr_rbf = SVR(kernel='rbf', gamma=0.2, C=100)
svr_rbf.fit(x, y)
svr_linear = SVR(kernel='linear', C=100)
svr_linear.fit(x, y)
svr_poly = SVR(kernel='poly', degree=3, C=100)
svr_poly.fit(x, y)
x_test = np.linspace(x.min(), 1.2*x.max(), 100).reshape(-1, 1)
y_rbf = svr_rbf.predict(x_test)
y_linear = svr_linear.predict(x_test)
y_poly = svr_poly.predict(x_test)
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(9, 8), facecolor='w')
plt.plot(x_test, y_rbf, 'r-', linewidth=2, label='高斯核')
plt.plot(x_test, y_linear, 'g-', linewidth=2, label='线性核')
plt.plot(x_test, y_poly, 'b-', linewidth=2, label='多项式核')
plt.plot(x, y, 'mo', markersize=6)
plt.scatter(x[svr_rbf.support_], y[svr_rbf.support_], s=130, c='r', marker='*',
label='高斯核支持向量')
plt.legend(loc='lower left')
plt.title('SVR', fontsize=16)
plt.xlabel('X')
plt.ylabel('Y')
plt.grid(True)
plt.show()