机器学习05|一万五字:SVM支持向量机01 【原理详解篇】


本文用到的所有数据 机器学习05:SVM【代码及数据文件】

本文为SVM支持向量机系列第一篇,主要讲解原理及计算。详细代码及解析,请参考第二篇博客:
机器学习05|一万五字:SVM支持向量机02 【jupyter代码详解篇】

一 SVM简单介绍

支持向量机(Support Vector Machine,SVM)是Corinna Cortes和Vapnik等于1995年首先提出的,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中。 在机器学习中,支持向量机是与相关的学习算法有关的监督学习模型,可以分析数据、识别模式,用于分类和回归分析。

二 函数间隔与几何间隔

对一个数据点进行分类,当超平面离数据点的“间隔”越大,分类的确信度(confidence)也越大。所以,为了使得分类的确信度尽量高,需要让所选择的超平面能够最大化这个“间隔”值。这个间隔就是下图中的Gap的一半。
在这里插入图片描述

2.1 函数间隔

定义函数间隔为:
γ ^ = y ( w T x + b ) = y f ( x ) \hat\gamma=y(w^Tx+b)=yf(x) γ^=y(wTx+b)=yf(x)
而超平面(w,b)关于T中所有样本点( x i x_i xi y i y_i yi)的函数间隔最小值(其中,x是特征,y是结果标签,i表示第i个样本),便为超平面(w, b)关于训练数据集T的函数间隔。 但这样定义的函数间隔有问题,即如果成比例的改变w和b(如将它们改成2w和2b),则函数间隔的值f(x)却变成了原来的2倍(虽然此时超平面没有改变),所以只有函数间隔还不够,我们要引入几何间隔。
在这里插入图片描述

2.2 几何间隔

在几何学里,点( x i x_i xi y i y_i yi)到直线 a x + b y + c = 0 ax+by+c=0 ax+by+c=0的距离公式:
d ( x i , y i ) = ∣ a x i + b y i + c ∣ a 2 + b 2 d(x_i, y_i) = \frac{|ax_i+by_i+c|}{\sqrt{a^{2}+b^{2}}} d(xi,yi)=a2+b2 axi+byi+c
所以在二维空间中,几何间隔就是点到直线的距离;在三维空间中,几何间隔是点到空间上一平面的距离;而在SVM中,平面变成了超平面,几何间隔便是样本点到超平面的距离:
γ i = y i ( w T ∥ w ∥ x i + b ∥ w ∥ ) \gamma_{i}=y_{i}(\frac{w^T}{\Vert w\Vert}x_{i}+\frac{b}{\Vert w\Vert}) γi=yi(wwTxi+wb)

三 最大间隔分类器

如下图所示,中间的实线便是寻找到的最优超平面(Optimal Hyper Plane),其到两条虚线边界的距离相等,虚线边界上的点到最优超平面的距离便是几何间隔,两条虚线间隔边界之间的距离等于2倍的几何间隔,而虚线间隔边界上的点则是支持向量。而对于所有不是支持向量的点,有如下关系:
y ( w T x + b ) > 1 y(w^Tx+b)>1 y(wTx+b)>1
在这里插入图片描述

函数间隔不适合用来最大化间隔值,因为在超平面固定以后,可以等比例地缩放w的长度和b的值,这样可以使得的值任意大,亦即函数间隔可以在超平面保持不变的情况下被取得任意大。但几何间隔因为除上了 ∥ w ∥ {\Vert w\Vert} w,使得在缩放w和b的时候几何间隔的值是不会改变的,它只随着超平面的变动而变动,因此,这是更加合适的一个间隔。换言之,这里要找的最大间隔分类超平面中的“间隔”指的是几何间隔。 于是最大间隔分类器(maximum margin classifier)的目标函数可以定义为: 同时需满足一些条件,根据间隔的定义,有
y i ( w T x i + b ) = γ ^ i > = γ ^ , i = 1 , 2 , . . . , n y_i(w^Tx_i+b)=\hat\gamma_i>=\hat\gamma,i=1,2,...,n yi(wTxi+b)=γ^i>=γ^,i=1,2,...,n
距离超平面最近的这几个训练样本点使得等式成立,它们被称为支持向量,这些支持向量到到超平面的距离是 1 w \frac{1}{w} w1
从而上述目标函数转化成了:
m a x 1 ∥ w ∥ , s . t .   y i ( w T x i + b ) > = 1 , i = 1 , 2 , . . . , n max\frac{1}{\Vert w\Vert},s.t.\ y_i(w^Tx_i+b)>=1,i=1,2,...,n maxw1,s.t. yi(wTxi+b)>=1,i=1,2,...,n

相当于在相应的约束条件下,最大化这个 1 ∥ w ∥ \frac{1}{\Vert w\Vert} w1值,而 1 ∥ w ∥ \frac{1}{\Vert w\Vert} w1便是要求解的几何间隔。

通过以上的介绍,我们得出支持向量机的目标函数,但往往这个问题不是那么容易解决,所以需要将其转化为其对偶形式求解,往往对对偶形式求解会比直接对原问题求解方便很多。

四 原始问题到对偶问题的求解

接着考虑之前得到的目标函数:
m a x 1 ∥ w ∥ max\frac{1}{\Vert w\Vert} maxw1 s . t .   y i ( w T x i + b ) > = 1 , i = 1 , 2 , . . . , n s.t.\ y_i(w^Tx_i+b)>=1,i=1,2,...,n s.t. yi(wTxi+b)>=1,i=1,2,...,n
由于求 1 ∥ w ∥ \frac{1}{\Vert w\Vert} w1的最大值相当于求 ∥ w ∥ {\Vert w\Vert} w的最小值,也相当于求 1 2 ∥ w ∥ 2 \frac{1}{2}{\Vert w\Vert}^2 21w2的最小值,所以上述目标函数等价于:
m i n 1 2 ∥ w ∥ 2 min\frac{1}{2}{\Vert w\Vert}^2 min21w2 s . t .   y i ( w T x i + b ) > = 1 , i = 1 , 2 , . . . , n s.t.\ y_i(w^Tx_i+b)>=1,i=1,2,...,n s.t. yi(wTxi+b)>=1,i=1,2,...,n

此外,由于这个问题的特殊结构,还可以通过拉格朗日对偶性(Lagrange Duality)变换到对偶变量 (dual variable) 的优化问题,即通过求解与原问题等价的对偶问题(dual problem)得到原始问题的最优解,这就是线性可分条件下支持向量机的对偶算法,这样做的优点在于:一者对偶问题往往更容易求解;二者可以自然的引入核函数,进而推广到非线性分类问题。 那什么是拉格朗日对偶性呢?简单来讲,通过给每一个约束条件加上一个拉格朗日乘子(Lagrange multiplier),定义拉格朗日函数(通过拉格朗日函数将约束条件融合到目标函数里去,从而只用一个函数表达式便能清楚的表达出我们的问题):
L ( w , b , α ) = 1 2 ∥ w ∥ 2 − ∑ i = 1 n α i ⟮ y i ( w T x i + b ) − 1 ⟯ L\left(w,b,\alpha\right)=\frac{1}{2}{\Vert w\Vert}^2-\sum_{i=1}^{n}\alpha_i{\lgroup}y_i\left(w^Tx_i+b\right)-1\rgroup L(w,b,α)=21w2i=1nαiyi(wTxi+b)1
然后令:
θ ( w ) = m a x   L ( w , b , α ) , α i > = 0 \theta\left(w\right)=max\ L\left(w,b,\alpha\right),\alpha_i>=0 θ(w)=max L(w,b,α),αi>=0

容易验证,当某个约束条件不满足时,例如 y i ( w T x i + b ) < 1 y_i\left(w^Tx_i+b\right)<1 yi(wTxi+b)<1,那么显然有 θ ( w ) = ∞ \theta\left(w\right)=\infty θ(w)=(只要令 α i = ∞ \alpha_i=\infty αi=即可)。而当所有约束条件都满足时,则最优值为 θ ( w ) = 1 2 w 2 \theta\left(w\right)=\frac{1}{2}{w}^2 θ(w)=21w2,亦即最初要最小化的量。 因此,在要求约束条件得到满足的情况下最小化 1 2 w 2 \frac{1}{2}{w}^2 21w2,实际上等价于直接最小化 θ ( w ) \theta\left(w\right) θ(w)(当然,这里也有约束条件,就是 α i > = 0 , i = 1 , . . . , n ) \alpha_i>=0,i=1,...,n) αi>=0,i=1,...,n),因为如果约束条件没有得到满足,会等于无穷大,自然不会是我们所要求的最小值。 具体写出来,目标函数变成了:
min ⁡ w , b θ ( w ) = min ⁡ w , b max ⁡ α i > = 0 L ( w , b , α ) = p ∗ \min\limits_{w,b}\theta\left(w\right)=\min\limits_{w,b} \max\limits_{\alpha_i>=0}L\left(w,b,\alpha\right)=p^* w,bminθ(w)=w,bminαi>=0maxL(w,b,α)=p
这里用 p ∗ p^* p表示这个问题的最优值,且和最初的问题是等价的。如果直接求解,那么一上来便得面对w和b两个参数,而又是不等式约束,这个求解过程不好做。不妨把最小和最大的位置交换一下,变成:
max ⁡ α i > = 0 min ⁡ w , b L ( w , b , α ) = d ∗ \max\limits_{\alpha_i>=0}\min\limits_{w,b}L\left(w,b,\alpha\right)=d^* αi>=0maxw,bminL(w,b,α)=d

交换以后的新问题是原始问题的对偶问题,这个新问题的最优值用来 d ∗ d^* d来表示。而且有 d ∗ ≤ p ∗ d^*≤p^* dp,在满足某些条件的情况下,这两者相等,这个时候就可以通过求解对偶问题来间接地求解原始问题。

换言之,之所以从min max的原始问题 p ∗ p^* p,转化为max min的对偶问题 d ∗ d^* d,一者因为是近似解,二者,转化为对偶问题后,更容易求解。 下面可以先求L对w、b的极小,再求L对 α \alpha α的极大。

五 对偶问题的求解

L ( w , b , α ) = 1 2 ∥ w ∥ 2 − ∑ i = 1 n α i ⟮ y i ( w T x i + b ) − 1 ⟯ L\left(w,b,\alpha\right)=\frac{1}{2}{\Vert w\Vert}^2-\sum_{i=1}^{n}\alpha_i{\lgroup}y_i\left(w^Tx_i+b\right)-1\rgroup L(w,b,α)=21w2i=1nαiyi(wTxi+b)1

首先固定 α \alpha α,要让L关于w和b最小化,我们分别对w,b求偏导数,即令:

∂ L ∂ w = 0 \frac{\partial{L}}{\partial{w}}=0 wL=0
∂ L ∂ b = 0 \frac{\partial{L}}{\partial{b}}=0 bL=0

∂ L ∂ w = 0 ⇒ ∥ w ∥ = ∑ i = 1 n α i y i x i \frac{\partial{L}}{\partial{w}}=0\Rightarrow \parallel w \parallel =\sum_{i=1}^{n}\alpha_iy_ix_i wL=0⇒∥w∥=i=1nαiyixi
∂ L ∂ b = 0 ⇒ ∑ i = 1 n α i y i = 0 \frac{\partial{L}}{\partial{b}}=0\Rightarrow\sum_{i=1}^{n}\alpha_iy_i=0 bL=0i=1nαiyi=0
将以上结果带入之前的 L ( w , b , α ) L\left(w,b,\alpha\right) L(w,b,α)
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{\lgroup}y_i\left(w^Tx_i+b\right)-1{\rgroup} L(w,b,α)=21w2i=1nαiyi(wTxi+b)1

得到:
L ( w , b , α ) = 1 2 ∑ i , j = 1 n α i α j y i y j x i T x j − ∑ i , j = 1 n α i α j y i y j x i T x j − b ∑ i = 1 n α i y i + ∑ i = 1 n α i = ∑ i = 1 n α i − 1 2 ∑ i , j = 1 n α i α j y i y j x i T x j L(w,b,\alpha)=\frac{1}{2}\sum_{i,j=1}^{n}\alpha_i\alpha_jy_iy_j{x_i}^Tx_j-\sum_{i,j=1}^{n}\alpha_i\alpha_jy_iy_j{x_i}^Tx_j-b\sum_{i=1}^{n}\alpha_iy_i+\sum_{i=1}^{n}\alpha_i=\sum_{i=1}^{n}\alpha_i-\frac{1}{2}\sum_{i,j=1}^{n}\alpha_i\alpha_j{y_iy_j{x_i}^Tx_j} L(w,b,α)=21i,j=1nαiαjyiyjxiTxji,j=1nαiαjyiyjxiTxjbi=1nαiyi+i=1nαi=i=1nαi21i,j=1nαiαjyiyjxiTxj

求对 α \alpha α的极大,即是关于对偶问题的最优化问题。经过上面一个步骤的求w和b,得到的拉格朗日式子已经没有了变量w,b,只有 α \alpha α。从上面的式子得到:
max ⁡ α ∑ i = 1 n α i − 1 2 ∑ i , j = 1 n α i α j y i y j x i T x j \max\limits_{\alpha}\sum_{i=1}^{n}\alpha_i-\frac{1}{2}\sum_{i,j=1}^{n}\alpha_i\alpha_jy_iy_j{x_i}^Tx_j αmaxi=1nαi21i,j=1nαiαjyiyjxiTxj
s . t . , α i > = 0 , i = 1 , . . . , n s.t.,\alpha_i>=0,i=1,...,n s.t.,αi>=0,i=1,...,n
∑ i = 1 n α i y i = 0 \sum_{i=1}^{n}\alpha_iy_i=0 i=1nαiyi=0

这样,求出了 α i \alpha_i αi,根据: w = ∑ i = 1 n α i y i x i w=\sum_{i=1}^{n}\alpha_iy_ix_i w=i=1nαiyixi
即可求出w,然后通过
b ∗ = − max ⁡ i : y i = − 1 w T x i + min ⁡ i : y i = 1 w T x i 2 b^*=-\frac{\max_{i:y^i = -1}w^Tx^i+\min_{i:y^i = 1}w^Tx^i}{2} b=2maxi:yi=1wTxi+mini:yi=1wTxi
即可求出b,最终得出分离超平面和分类决策函数。

在求得 L ( w , b , α ) L(w,b,\alpha) L(w,b,α)关于w和b最小化,以及对 α \alpha α的极大之后,最后一步可以利用SMO算法求解对偶问题中的拉格朗日乘子 α \alpha α

在我们刚开始讨论支持向量机时,我们就假定数据是线性可分的,也就是我们可以找到一个可行的超平面将数据完全分开。但是如果数据有噪音,而不是因为数据本身不是非线性结构。对于这种偏离正常位置很远的数据点,我们称之为outlier。

六 使用松弛变量处理outliers方法

在原先的SVM模型中,outlier的存在可能造成很大的影响,因为超平面本身就是只有少数几个support vector组成,如果这些support vector里又存在outlier的话,其影响就很大了。例如下图:
在这里插入图片描述

用黑圈圈起来的那个蓝点是一个 outlier ,它偏离了自己原本所应该在的那个半空间,如果直接忽略掉它的话,原来的分隔超平面还是挺好的,但是由于这个 outlier 的出现,导致分隔超平面不得不被挤歪了,变成途中黑色虚线所示(这只是一个示意图,并没有严格计算精确坐标),同时 margin 也相应变小了。当然,更严重的情况是,如果这个 outlier 再往右上移动一些距离的话,我们将无法构造出能将数据分开的超平面来。

为了处理这种情况,SVM 允许数据点在一定程度上偏离一下超平面。例如上图中,黑色实线所对应的距离,就是该 outlier 偏离的距离,如果把它移动回来,就刚好落在原来的超平面蓝色间隔边界上,而不会使得超平面发生变形了。

我们原来的约束条件变成了:
y i ( w T x i + b ) > = 1 , i = 1 , . . . , n y_i(w^Tx_i+b)>=1,i=1,...,n yi(wTxi+b)>=1,i=1,...,n
现在考虑outlier的问题,约束条件变成了:
y i ( w T x i + b ) > = 1 − ε i , i = 1 , . . . n y_i(w^Tx_i+b)>=1-\varepsilon_i,i=1,...n yi(wTxi+b)>=1εi,i=1,...n

其中 ε i > = 0 \varepsilon_i>=0 εi>=0称为松弛变量,对应数据点 x i x_i xi允许偏离的function margin的量。当然,如果我们运行 ε i \varepsilon_i εi任意大的话,那任意的超平面都是符合条件的了。所以,我们在原来的目标函数后面加上一项,使得这些 ε i \varepsilon_i εi的总和也要最下:
min ⁡ 1 2 ∥ w ∥ 2 + C ∑ i = 1 n ε i \min\frac{1}{2}{\parallel w\parallel}^2+C\sum_{i=1}^{n}\varepsilon_i min21w2+Ci=1nεi

其中C是一个参数,用于控制目标函数中两项(“寻找margin最大的超平面和保证数据点偏差量最小”)之间的权重。注意,其中 ε \varepsilon ε是需要优化的变量之一,而C是一个事先确定好的常量。完整地写出来是这个样子:
min ⁡ 1 2 ∥ w ∥ 2 + C ∑ i = 1 n ε i \min\frac{1}{2}{\parallel w\parallel}^2+C\sum_{i=1}^{n}\varepsilon_i min21w2+Ci=1nεi
s . t   y i ( w T x i + b ) > = 1 − ε i , i = 1 , . . . n s.t\ y_i(w^Tx_i+b)>=1-\varepsilon_i,i=1,...n s.t yi(wTxi+b)>=1εi,i=1,...n
ε i > = 0 , i = 1 , . . . , n \varepsilon_i>=0,i=1,...,n εi>=0,i=1,...,n

用之前的方法将约束条件加入到目标函数中,得到的新的拉格朗日函数,如下所示:
L ( w , b , ε , α , γ ) = 1 2 ∥ w ∥ 2 + C ∑ i = 1 n ε i − ∑ i = 1 n α i ⟮ y i ( w T x i + b ) − 1 + ε i ⟯ − ∑ i = 1 n γ i ε i L(w,b,\varepsilon,\alpha,\gamma)=\frac{1}{2}{\parallel w\parallel}^2+C\sum_{i=1}^{n}\varepsilon_i-\sum_{i=1}^{n}\alpha_i{\lgroup}y_i\left(w^Tx_i+b\right)-1+\varepsilon_i\rgroup-\sum_{i=1}^{n}\gamma_i\varepsilon_i L(w,b,ε,α,γ)=21w2+Ci=1nεii=1nαiyi(wTxi+b)1+εii=1nγiεi

分析方法和前面一样,转换为另一个问题后,我们先让L针对 w , b 和 ε w,b和\varepsilon w,bε最小化:
∂ L ∂ w = 0 ⇒ w = ∑ i = 1 n α i y i x i \frac{{\partial}L}{\partial w}=0\Rightarrow w=\sum_{i=1}{n}\alpha_iy_ix_i wL=0w=i=1nαiyixi

∂ L ∂ b = 0 ⇒ ∑ i = 1 n α i y i = 0 \frac{{\partial}L}{\partial{b}}=0\Rightarrow\sum_{i=1}^{n}\alpha_iy_i=0 bL=0i=1nαiyi=0

∂ L ∂ ε i = 0 ⇒ C − α i − γ i = 0 , i = 1 , . . . , n \frac{{\partial}L}{\partial\varepsilon_i}=0{\Rightarrow}C-\alpha_i-\gamma_i=0,i=1,...,n εiL=0Cαiγi=0,i=1,...,n
w w w带回L并化简,得到和原来一样的目标函数:
max ⁡ α ∑ i = 1 n α i − 1 2 ∑ i , j = 1 n α i α j y i y j < x i , x j > \max\limits_{\alpha}\sum_{i=1}^{n}\alpha_i-\frac{1}{2}\sum_{i,j=1}^{n}\alpha_i\alpha_jy_iy_j<x_i,x_j> αmaxi=1nαi21i,j=1nαiαjyiyj<xi,xj>
s . t .   0 < = α i < = C , i = 1 , . . . , n s.t.\ 0<=\alpha_i<=C,i=1,...,n s.t. 0<=αi<=C,i=1,...,n
∑ i = 1 n α i y i = 0 \sum_{i=1}^{n}\alpha_iy_i=0 i=1nαiyi=0
可以看到唯一区别就是现在dual variable α \alpha α多了一个上限C。

写到这里,可以做个小结,不准确的说,SVM它本质上即是一个分类方法,用 w T x + b w^Tx+b wTx+b定义分类函数,于是求w、b为寻找最大间隔。引出 1 2 ∥ w ∥ 2 \frac{1}{2}{\parallel w \parallel}^2 21w2,继而引出拉格朗日因子,转化为对拉格朗日乘子 α \alpha α的求解(求解过程会涉及一系列最优化或凸二次规划等问题),如此,求w、b与求 α \alpha α等价,而 α \alpha α的求解可以用一种快速学习算法SMO。

七 核函数

在以上的问题中,我们都假设数据本身都是线性可分的,事实上,大部分时候数据并不是线性可分的,这个时候满足这样的条件的超平面就根本不存在。在前面,我们已经了解到SVM处理线性可分的情况,那对于非线性的数据SVM如何处理?这时候SVM的处理方法是选择一个核函数K。通过将数据映射到高纬空间,来解决在原始空间中线性不可分的问题。

具体来说,在线性不可分的情况下,支持向量机首先在低维空间中完成计算,然后通过核函数将输入空间映射到高维特征空间,最终在高维特征空间中构造出最优分离超平面,从而把平面上本身不好分的非线性数据分开。如图所示,一维数据在二维空间无法划分,从而映射到三维空间里划分:
在这里插入图片描述

那么kernel是如何达到这个效果的呢?对于一个2维空间数据点v = (x, y),要把它映射到3维空间,其中一种映射关系是: p ( x , y ) = ( x 2 , 2 x y , y 2 ) p(x, y) = (x^2, \sqrt 2xy, y^2) p(x,y)=(x2,2 xy,y2)。假如有任意两个数据点: v 1 = ( x 1 , y 1 ) v_1=(x_1,y_1) v1=(x1,y1), v 2 = ( x 2 , y 2 ) v_2=(x_2,y_2) v2=(x2,y2),我们可以直接计算它们对应向量的内积为: < p ( v 1 ) , p ( v 2 ) > = < ( x 1 2 , 2 x 1 y 1 , y 1 2 ) , ( x 2 2 , 2 x 2 y 2 , y 2 2 ) > < p(v_1), p(v_2) > = < (x_1^2, \sqrt 2x_1y_1, y_1^2), (x_2^2, \sqrt 2x_2y_2, y_2^2) > <p(v1),p(v2)>=<(x12,2 x1y1,y12),(x22,2 x2y2,y22)>
很明显,这是一个3维运算。假如3维还是无法线性区分,要映射到N维去,那这里就是N维运算,N越大计算量越大。有没有办法能够降低这个计算量呢?我们来展开推导一下:


< p ( v 1 ) , p ( v 2 ) > = < ( x 1 2 , 2 x 1 y 1 , y 1 2 ) , ( x 2 2 , 2 x 2 y 2 , y 2 2 ) > = ( x 1 x 2 + y 1 y 2 ) 2 = ( < v 1 , v 2 > ) 2 < p(v_1), p(v_2) > = < (x_1^2, \sqrt 2x_1y_1, y_1^2), (x_2^2, \sqrt 2x_2y_2, y_2^2) > = (x_1x_2 + y_1y_2)^2 = (<v_1, v_2>)^2 <p(v1),p(v2)>=<(x12,2 x1y1,y12),(x22,2 x2y2,y22)>=(x1x2+y1y2)2=(<v1,v2>)2



经过推导可以看到,两个数据点在映射后的向量内积等于映射前向量内积的平方。如果我们引入核函数: K ( v 1 , v 2 ) = ( < v 1 , v 2 > ) 2 K(v_1, v_2) = (<v_1, v_2>)^2 K(v1,v2)=(<v1,v2>)2,那么就可以通过核函数的计算来等价于映射后的向量内积,实现了高维向量运算转换为低维向量计算(本例中是2维向量运算代替了3维向量运算)。

核函数相当于把原来的分类函数:
f ( x ) = ∑ i = 1 n α i y i < x i , x > + b f(x)=\sum_{i=1}^{n}\alpha_iy_i<x_i,x>+b f(x)=i=1nαiyi<xi,x>+b
映射成:
f ( x ) = ∑ i = 1 n α i y i < ϕ ( x i ) , ϕ ( x ) > + b f(x)=\sum_{i=1}^{n}\alpha_iy_i<\phi(x_i),\phi(x)>+b f(x)=i=1nαiyi<ϕ(xi),ϕ(x)>+b
而其中的 α \alpha α可以通过求解如下的dual问题而得到的:
max ⁡ α ∑ i = 1 n α i − 1 2 ∑ i , j = 1 n α i α j y i y j < ϕ ( x i ) , ϕ ( x j ) > \max\limits_{\alpha}\sum_{i=1}^{n}{\alpha_i}-\frac{1}{2}\sum_{i,j=1}^{n}{\alpha_i}{\alpha_j}y_iy_j<\phi(x_i),\phi(x_j)> αmaxi=1nαi21i,j=1nαiαjyiyj<ϕ(xi),ϕ(xj)>
s . t . , α i > = 0 , i = 1 , . . . , n s.t.,\alpha_i>=0,i=1,...,n s.t.,αi>=0,i=1,...,n
∑ i = 1 n α i y i = 0 \sum_{i=1}^{n}\alpha_iy_i=0 i=1nαiyi=0
举个简单的例子,设两个向量 x 1 = ( η 1 , η 2 ) T 和 x 2 = ( ζ 1 . ζ 2 ) T , ϕ ()为映射关系。 x_1={(\eta_1,\eta_2)}^T和x_2={(\zeta_1.\zeta_2)}^T,\phi()为映射关系。 x1=(η1,η2)Tx2=(ζ1.ζ2)Tϕ()为映射关系。映射后的内积为:
< ϕ ( x 1 ) , ϕ ( x 2 ) > = η 1 ζ 1 + η 1 2 ζ 1 2 + η 2 ζ 2 + η 2 2 ζ 2 2 + η 1 η 2 ζ 1 ζ 2 <\phi(x_1),\phi(x_2)>=\eta_1\zeta_1+\eta_1^2\zeta_1^2+\eta_2\zeta_2+\eta_2^2\zeta_2^2+\eta_1\eta_2\zeta_1\zeta_2 <ϕ(x1),ϕ(x2)>=η1ζ1+η12ζ12+η2ζ2+η22ζ22+η1η2ζ1ζ2
另外,我们注意到:
( < x 1 , x 2 > + 1 ) 2 = 2 η 1 ζ 1 + η 1 2 ζ 1 2 + 2 η 2 ζ 2 + η 2 2 ζ 2 2 + 2 η 1 η 2 ζ 1 ζ 2 + 1 {(<x_1,x_2>+1)}^2=2\eta_1\zeta_1+\eta_1^2\zeta_1^2+2\eta_2\zeta_2+\eta_2^2\zeta_2^2+2\eta_1\eta_2\zeta_1\zeta_2+1 (<x1,x2>+1)2=2η1ζ1+η12ζ12+2η2ζ2+η22ζ22+2η1η2ζ1ζ2+1
二者有很多相似的地方,实际上,我们只需要把某几个维度线性缩放一下,然后再加上一个常数维度,具体来说,上面这个式子的计算结果实际上和映射 φ ( x 1 , x 2 ) = ( 2 x 1 , x 1 2 + 2 x 2 , x 2 2 , 2 x 1 x 2 , 1 ) T \varphi(x_1,x_2)={(\sqrt2x_1,x_1^2+\sqrt2x_2,x_2^2,\sqrt2x_1x_2,1)}^T φ(x1,x2)=(2 x1,x12+2 x2,x22,2 x1x2,1)T之后的内存 < φ ( x 1 ) , φ ( x 2 ) > <\varphi(x_1),\varphi(x_2)> <φ(x1),φ(x2)>的结果是相等的。区别在于一个是是映射到高维空间中,然后根据内积的公式进行计算;而另一个则是直接在原来的低维空间中进行计算,而不需要显示地写出映射后的结果。

我们把这里的计算两个向量在隐式映射过后的空间中的内积的函数叫做核函数,核函数能简化映射空间的内积运算。现在我们的分类函数为:
f ( x ) = ∑ i = 1 n α i y i K < x i , x > + b f(x)=\sum_{i=1}^{n}\alpha_iy_iK<x_i,x>+b f(x)=i=1nαiyiK<xi,x>+b
而其中的 α \alpha α可以通过求解如下的dual问题而得到的:
max ⁡ α ∑ i = 1 n α i − 1 2 ∑ i , j = 1 n α i α j y i y j K ( x i , x j ) \max\limits_{\alpha}\sum_{i=1}^{n}{\alpha_i}-\frac{1}{2}\sum_{i,j=1}^{n}{\alpha_i}{\alpha_j}y_iy_jK(x_i,x_j) αmaxi=1nαi21i,j=1nαiαjyiyjK(xi,xj)
s . t . , α i > = 0 , i = 1 , . . . , n s.t.,\alpha_i>=0,i=1,...,n s.t.,αi>=0,i=1,...,n
∑ i = 1 n α i y i = 0 \sum_{i=1}^{n}\alpha_iy_i=0 i=1nαiyi=0

八 SMO算法

在上面我们得到了最后的目标函数:
max ⁡ α ∑ i = 1 n α i − 1 2 ∑ i , j = 1 n α i α j y i y j < x i , x j > \max\limits_{\alpha}\sum_{i=1}^{n}\alpha_i-\frac{1}{2}\sum_{i,j=1}^{n}\alpha_i\alpha_jy_iy_j<x_i,x_j> αmaxi=1nαi21i,j=1nαiαjyiyj<xi,xj>
s . t . , 0 < = α i < = C , i = 1 , . . . , n s.t.,0<=\alpha_i<=C,i=1,...,n s.t.,0<=αi<=C,i=1,...,n
∑ i = 1 n α i y i = 0 \sum_{i=1}^{n}\alpha_iy_i=0 i=1nαiyi=0

等价于求:
min ⁡ α Ψ ( α ⃗ ) = min ⁡ α 1 2 ∑ i = 1 n ∑ j = 1 n y i y j K < x i , x j > α i α j − ∑ i = 1 n α i \min\limits_\alpha\Psi\left(\vec{\alpha}\right)=\min\limits_{\alpha}\frac{1}{2}\sum_{i=1}^{n}\sum_{j=1}^{n}y_iy_jK\left<x_i,x_j\right>\alpha_i\alpha_j-\sum_{i=1}^{n}\alpha_i αminΨ(α )=αmin21i=1nj=1nyiyjKxi,xjαiαji=1nαi
0 < = α i < = C , i = 1 , . . . , n 0<=\alpha_i<=C,i=1,...,n 0<=αi<=C,i=1,...,n
∑ i = 1 n y i α i = 0 \sum_{i=1}^{n}y_i\alpha_i=0 i=1nyiαi=0
这里得到的min函数与我们之前的max函数实质是一样的。

下面要解决的问题是:在 α ⃗ = α 1 , α 2 , . . . α n \vec{\alpha}={\alpha_1,\alpha_2,...\alpha_n} α =α1,α2,...αn上求解目标函数的最小值。为了求解这些乘子,每次从中任意抽取两个乘子 α 1 \alpha_1 α1 α 2 \alpha_2 α2,然后固定 α 1 \alpha_1 α1 α 2 \alpha_2 α2以外的其它乘子 α 3 , . . . , α n {\alpha_3,...,\alpha_n} α3,...,αn,使得目标函数只是关于 α 1 \alpha_1 α1 α 2 \alpha_2 α2的函数。这样,不断的从一堆乘子中任意抽取两个求解,不断迭代求解子问题,最终达到求解原问题的目的。
而原对偶问题的子问题的目标函数可以表达为:
Ψ = 1 2 K 11 α 1 2 + 1 2 K 22 α 2 2 + s K 12 α 1 α 2 + y 1 α 1 ν 1 + y 2 α 2 ν 2 − α 1 − α 2 + Ψ c o n s t a n t \Psi=\frac{1}{2}K_{11}{\alpha_1}^2+\frac{1}{2}K_{22}{\alpha_2}^2+sK_{12}\alpha_1\alpha_2+y_1{\alpha}_1\nu_1+y_2\alpha_2\nu_2-\alpha_1-\alpha_2+\Psi_{constant} Ψ=21K11α12+21K22α22+sK12α1α2+y1α1ν1+y2α2ν2α1α2+Ψconstant
其中:
K i j = K ( x i , x j ) K_{ij}=K(x_i,x_j) Kij=K(xi,xj)
ν i = ∑ j = 3 n y j α j ∗ K i j = u i + b ∗ − y 1 α 1 ∗ K 1 i − y 2 α 2 ∗ K 2 i \nu_i=\sum_{j=3}^{n}y_j{\alpha_j}^*K_{ij}=u_i+b^*-y_1{\alpha_1}^*K_{1i}-y_2{\alpha_2}^*K_{2i} νi=j=3nyjαjKij=ui+by1α1K1iy2α2K2i
u i = w T x i + b u_i=w^Tx_i+b ui=wTxi+b

为了解决这个子问题,首要问题便是每次如何选取 α 1 \alpha_1 α1 α 2 \alpha_2 α2。实际上,其中一个乘子是违反KKT条件最严重的,另外一个乘子则由另一个约束条件选取。
根据KKT条件可以得出目标函数中 α i \alpha_i αi取值的意义:
α i = 0 ⇔ y i u i > = 1 \alpha_i=0{\Leftrightarrow}y_iu_i>=1 αi=0yiui>=1
0 < α i < C ⇔ y i u i = 1 0<\alpha_i<C{\Leftrightarrow}y_iu_i=1 0<αi<Cyiui=1
α i = C ⇔ y i u i < = 1 \alpha_i=C{\Leftrightarrow}y_iu_i<=1 αi=Cyiui<=1
这里的 α i \alpha_i αi还是拉格朗日乘子:
1.对于第一种情况,表明 α i \alpha_i αi是正常分类,在间隔边界内部(我们知道正确分类的点 y i ∗ f ( x i ) > = 0 y_i*f(x_i)>=0 yif(xi)>=0
2.对于第二种情况,表明了 α i \alpha_i αi是支持向量,在间隔边界上;
3.对于第三种情况,表明了 α i \alpha_i αi是在两条间隔边界之间;

而最优解需要满足KKT条件,既满足3个条件都得满足,以下几种情况出现将会出现不满足:
y i u i y_iu_i yiui<=1但是 α i \alpha_i αi<C则是不满足的,而原本 α i \alpha_i αi<C则是不满足的,而原本 α i \alpha_i αi=C
y i u i y_iu_i yiui>=1但是 α i \alpha_i αi>0则是不满的,而原本 α i \alpha_i αi=0
y i u i y_iu_i yiui=1但是 α i \alpha_i αi=0或者 α i \alpha_i αi=C则表明不满足,而原本应该是0< α i \alpha_i αi<C

也就是说,如果存在不满足KKT条件的 α i \alpha_i αi,那么需要更新这些 α i \alpha_i αi,这是第一个约束条件。此外,更新的同时还要受到第二个约束条件的限制,即:
∑ i = 1 n y i α i = 0 \sum_{i=1}^{n}y_i\alpha_i=0 i=1nyiαi=0
因此,如果假设选择的两个乘子 α 1 \alpha_1 α1 α 2 \alpha_2 α2,它们在更新之前分别是 α 1 o l d {\alpha_1}^{old} α1old α 2 o l d {\alpha_2}^{old} α2old,更新之后分别是 α 1 n e w {\alpha_1}^{new} α1new α 2 n e w {\alpha_2}^{new} α2new,那么更新前后的值需要满足以下等式才能保证和为0的约束:
α 1 n e w y 1 + α 2 n e w y 2 = α 1 o l d y 1 + α 2 o l d y 2 = ζ {\alpha_1}^{new}y_1+{\alpha_2}^{new}y_2={\alpha_1}^{old}y_1+{\alpha_2}^{old}y_2=\zeta α1newy1+α2newy2=α1oldy1+α2oldy2=ζ
其中 ζ \zeta ζ是常数。
两个因子不好同时求解,所以可先求第二个乘子 α 2 \alpha_2 α2的解( α 2 n e w {\alpha_2}^{new} α2new),得到 α 2 \alpha_2 α2的解之后,再利用 α 2 \alpha_2 α2的解表示 α 1 \alpha_1 α1的解( α 1 n e w {\alpha_1}^{new} α1new
为了求解 α 2 n e w {\alpha_2}^{new} α2new,得先确定 α 2 n e w {\alpha_2}^{new} α2new取值范围。假设它的上下边界分别为H和L,那么有:
L < = α 2 n e w < = H L<={\alpha_2}^{new}<=H L<=α2new<=H
接下来,综合 0 < = α i < = C , i = 1 , . . . , n 和 α 1 n e w y 1 + α 2 n e w y 2 = α 1 o l d y 1 + α 2 o l d y = ζ 0<=\alpha_i<=C,i=1,...,n和{\alpha_1}^{new}y_1+{\alpha_2}^{new}y_2={\alpha_1}^{old}y_1+{\alpha_2}^{old}y_=\zeta 0<=αi<=C,i=1,...,nα1newy1+α2newy2=α1oldy1+α2oldy=ζ这两个约束条件,求取 α 2 n e w {\alpha_2}^{new} α2new值范围。
y 1 ! = y 2 y_1!=y_2 y1!=y2,根据 α 1 n e w y 1 + α 2 n e w y 2 = α 1 o l d y 1 + α 2 o l d y = ζ {\alpha_1}^{new}y_1+{\alpha_2}^{new}y_2={\alpha_1}^{old}y_1+{\alpha_2}^{old}y_=\zeta α1newy1+α2newy2=α1oldy1+α2oldy=ζ可得 α 1 o l d − α 2 o l d = ζ {\alpha_1}^{old}-{\alpha_2}^{old}=\zeta α1oldα2old=ζ,所以 L = max ⁡ ( 0 , − ζ ) , H = min ⁡ ( C , C − ζ ) L=\max(0,-\zeta),H=\min(C,C-\zeta) L=max(0,ζ),H=min(C,Cζ)如下图所示:
在这里插入图片描述

y 1 = y 2 y_1=y_2 y1=y2时,同样根据 α 1 n e w y 1 + α 2 n e w y 2 = α 1 o l d y 1 + α 2 o l d y = ζ {\alpha_1}^{new}y_1+{\alpha_2}^{new}y_2={\alpha_1}^{old}y_1+{\alpha_2}^{old}y_=\zeta α1newy1+α2newy2=α1oldy1+α2oldy=ζ可得: α 1 o l d + α 2 o l d = ζ {\alpha_1}^{old}+{\alpha_2}^{old}=\zeta α1old+α2old=ζ,所以有 L = max ⁡ ( 0 , ζ − C ) , H = min ⁡ ( C , ζ ) L=\max(0,\zeta-C),H=\min(C,\zeta) L=max(0,ζC),H=min(C,ζ),如下图所示:
在这里插入图片描述

如此,根据 y 1 y_1 y1 y 2 y_2 y2异号或同号,可得出 α 2 n e w {\alpha_2}^{new} α2new的上下界分别为:
L = max ⁡ ( 0 , − ζ ) , H = min ⁡ ( C , C − ζ ) i f y 1 ! = y 2 L=\max(0,-\zeta),H=\min(C,C-\zeta) ify_1 != y_2 L=max(0,ζ),H=min(C,Cζ)ify1!=y2
L = max ⁡ ( 0 , ζ − C ) , H = min ⁡ ( C , ζ ) i f y 1 = y 2 L=\max(0,\zeta-C),H=\min(C,\zeta) if y_1 = y_2 L=max(0,ζC),H=min(C,ζ)ify1=y2

回顾下第二个约束条件 α 1 n e w y 1 + α 2 n e w y 2 = α 1 o l d y 1 + α 2 o l d y = ζ {\alpha_1}^{new}y_1+{\alpha_2}^{new}y_2={\alpha_1}^{old}y_1+{\alpha_2}^{old}y_=\zeta α1newy1+α2newy2=α1oldy1+α2oldy=ζ,令上式两边分别乘以 y 1 y_1 y1,可得 α 1 + s α 2 = α 1 ∗ + s α 2 ∗ = w \alpha_1+s\alpha_2={\alpha_1}^*+s{\alpha_2}^*=w α1+sα2=α1+sα2=w,其中:
w = − y 1 ∑ i = 3 n y i α i ∗ w=-y_1\sum_{i=3}^{n}y_i{\alpha_i}^* w=y1i=3nyiαi
因此 α 1 \alpha_1 α1可以用 α 2 \alpha_2 α2表示, α 1 = w − s α 2 \alpha_1=w-s\alpha_2 α1=wsα2,从而把子问题的目标函数转换为只含 α 2 \alpha_2 α2的问题:
Ψ = 1 2 K 11 ( w − s α 2 ) 2 + 1 2 K 22 α 2 2 + s K 12 ( w − s α 2 ) α 2 + y 1 ( w − s α 2 ) ν 1 − w + s α 2 + y 2 α 2 ν 2 − α 2 + Ψ c o n s t a n t \Psi=\frac{1}{2}K_{11}{(w-s\alpha_2)}^2+\frac{1}{2}K_{22}{\alpha_2}^2+sK_{12}(w-s\alpha2)\alpha_2+y_1(w-s\alpha_2)\nu_1-w+s\alpha_2+y_2\alpha_2\nu_2-\alpha_2+\Psi_{constant} Ψ=21K11(wsα2)2+21K22α22+sK12(wsα2)α2+y1(wsα2)ν1w+sα2+y2α2ν2α2+Ψconstant
α 2 \alpha_2 α2求导可得:
d Ψ d α 2 = − s K 11 ( w − s α 2 ) + K 22 α 2 − K 12 α 2 + s K 12 ( w − s α 2 ) − y 2 ν 1 + s + y 2 ν 2 − 1 = 0 \frac{\mathrm{d}\Psi}{\mathrm{d}\alpha_2}=-sK_{11}(w-s\alpha_2)+K_{22}\alpha_2-K_{12}\alpha_2+sK_{12}(w-s\alpha_2)-y_2\nu_1+s+y_2\nu_2-1=0 dα2dΨ=sK11(wsα2)+K22α2K12α2+sK12(wsα2)y2ν1+s+y2ν21=0

化简如下:
α 2 ( K 11 + K 22 − 2 K 11 ) = s ( K 11 − K 12 ) w + y 2 ( ν 1 − ν 2 ) + 1 − s \alpha2(K_{11}+K_{22}-2K_{11})=s(K_{11}-K_{12})w+y_2(\nu_1-\nu_2)+1-s α2(K11+K222K11)=s(K11K12)w+y2(ν1ν2)+1s
K i j = K ( x i , x j ) K_{ij}=K(x_i,x_j) Kij=K(xi,xj)
然后将 s = y 1 ∗ y 2 s=y_1*y_2 s=y1y2 α 1 + s α 2 = α 1 ∗ + s α 2 ∗ = w \alpha_1+s\alpha_2={\alpha_1}^*+s{\alpha_2}^*=w α1+sα2=α1+sα2=w ν i = ∑ j = 3 n y j α j ∗ K i j = u i + b ∗ − y 1 α 1 ∗ K 1 i − y 2 α 2 ∗ K 2 i \nu_i=\sum_{j=3}^{n}y_j{\alpha_j}^*K_{ij}=u_i+b^*-y_1{\alpha_1}^*K_{1i}-y_2{\alpha_2}^*K_{2i} νi=j=3nyjαjKij=ui+by1α1K1iy2α2K2i代入上式可得:
α 2 n e w , w n c ( K 11 + K 22 − 2 K 12 ) = α 2 o l d ( K 11 + K 22 − 2 K 12 ) + y 2 ( u 1 − u 2 + y 2 − y 1 ) {\alpha_2}^{new,wnc}(K_{11}+K_{22}-2K_{12})={\alpha_2}^{old}(K_{11}+K_{22}-2K_{12})+y_2(u_1-u_2+y_2-y_1) α2new,wnc(K11+K222K12)=α2old(K11+K222K12)+y2(u1u2+y2y1)

E i = u i − y i E_i=u_i-y_i Ei=uiyi(表示预测值与真实值之差), η = K < x 1 , x 1 ) + K ( x 2 , x 2 ) − 2 K ( x 1 , x 2 ) \eta=K<x_1,x_1)+K(x_2,x_2)-2K(x_1,x_2) η=K<x1,x1)+K(x2,x2)2K(x1,x2)上式两边同时除以 η \eta η,得到一个关于单变量 α 2 \alpha_2 α2的解:
α 2 n e w , w n c = α 2 o l d + y 2 ( E 1 − E 2 ) η {\alpha_2}^{new,wnc}={\alpha_2}^{old}+\frac{y_2(E_1-E_2)}{\eta} α2new,wnc=α2old+ηy2(E1E2)

这个解没有考虑约束条件 0 < = α 2 < = C 0<=\alpha_2<=C 0<=α2<=C。考虑约束条件经过剪辑 α 2 n e w \alpha_2^{new} α2new的解为:
1 α 2 n e w , w n c > H {\alpha_2}^{new,wnc}>H α2new,wnc>H
α 2 n e w = H {\alpha_2}^{new}=H α2new=H
2 L < = α 2 n e w , w n c < = H L<={\alpha_2}^{new,wnc}<=H L<=α2new,wnc<=H
α 2 n e w = α 2 n e w , w n c {\alpha_2}^{new}={\alpha_2}^{new,wnc} α2new=α2new,wnc
3 α 2 n e w , w n c < L {\alpha_2}^{new,wnc}<L α2new,wnc<L
α 2 n e w = L {\alpha_2}^{new}=L α2new=L
求出了 α 2 n e w 后,便可求出 α 1 n e w , 得 α 1 n e w = α 1 o l d + y 1 y 2 ( α 2 o l d − α 2 n e w ) {\alpha_2}^{new}后,便可求出\alpha_1^{new}, 得\alpha_1^{new}=\alpha_1^{old}+y_1y_2(\alpha_2^{old}-\alpha_2^{new}) α2new后,便可求出α1new,α1new=α1old+y1y2(α2oldα2new)
如何选择乘子 α 1 和 α 2 \alpha_1和\alpha_2 α1α2呢?
对于 α 1 , 即第一个乘子 , 可以通过刚刚说的那三种不满足 K K T 的条件来找 \alpha_1,即第一个乘子,可以通过刚刚说的那三种不满足KKT的条件来找 α1,即第一个乘子,可以通过刚刚说的那三种不满足KKT的条件来找
而对于第二个乘子 α 2 可以寻找满足条件 : max ⁡ ∣ E i − E j ∣ 的乘子。 \alpha_2可以寻找满足条件:\max|E_i-Ej|的乘子。 α2可以寻找满足条件:maxEiEj的乘子。
而b在满足下述条件下更新b:

1 0 < α 1 n e w < C 0<\alpha_1^{new}<C 0<α1new<C
b = b 1 b=b_1 b=b1
2 0 < α 2 n e w < C 0<\alpha_2{new}<C 0<α2new<C
b = b 2 b=b_2 b=b2
3 o t h e r w i s e otherwise otherwise
b = b 1 + b 2 2 b=\frac{b_1+b_2}{2} b=2b1+b2

b 1 n e w = b o l d − E 1 − y 1 ( α 1 n e w − α 1 o l d k ( x 1 , x 1 ) − y 2 ( α 2 n e w − α 2 o l d ) k ( x 1 , x 2 ) b_1^{new}=b^{old}-E_1-y_1(\alpha_1^{new}-\alpha_1^{old}k(x_1,x_1)-y_2(\alpha_2^{new}-\alpha_2^{old})k(x_1,x_2) b1new=boldE1y1(α1newα1oldk(x1,x1)y2(α2newα2old)k(x1,x2)

b 2 n e w = b o l d − y 1 ( α 1 n e w − α 1 o l d ) k ( x 1 , x 2 ) − y 2 ( α 2 n e w − α 2 o l d ) k ( x 2 , x 2 ) − E 2 b_2^{new}=b^{old}-y_1(\alpha_1^{new}-\alpha_1^{old})k(x_1,x_2)-y_2(\alpha_2^{new}-\alpha_2^{old})k(x_2,x_2)-E_2 b2new=boldy1(α1newα1old)k(x1,x2)y2(α2newα2old)k(x2,x2)E2
且每次更新完两个乘子的优化后,都需要再重新计算b,以及对应的 E i E_i Ei值。
最后更新所有的 α i , y 和 b , 这样模型就训练出来了 , 从而即可求出我们开头提出的分类函数 : \alpha_i,y和b,这样模型就训练出来了,从而即可求出我们开头提出的分类函数: αi,yb,这样模型就训练出来了,从而即可求出我们开头提出的分类函数:
f ( x ) = ∑ i = 1 n α i y i < x i , x > + b f(x)=\sum_{i=1}^{n}\alpha_iy_i<x_i,x>+b f(x)=i=1nαiyi<xi,x>+b

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

湘粤Ian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值