SVM(Support Vector Machine)分类器详解

本文详细介绍了拉格朗日乘子法求解条件极值问题,并探讨了KKT条件下的极值问题,包括软间隔的支持向量机(SVM)及核函数的应用。

1. 拉格朗日乘子(Lagrange multiplier)法求解条件极值

1.1 拉格朗日乘子的简单描述

简单的条件极值问题可以描述为:求函数z=f(x,y)z=f(x,y)z=f(x,y)的最大值,且x,yx,yx,y满足约束条件φ(x,y)=M\varphi (x,y)=Mφ(x,y)=M(MMM已知)。
拉格朗日乘子的求解步骤为:

  • 设置一个联合函数,令:
    F(x,y,λ)=f(x,y)+λ(M−φ(x,y)) F(x,y,\lambda)=f(x,y)+\lambda (M-\varphi (x,y)) F(x,y,λ)=f(x,y)+λ(Mφ(x,y))

  • F(x,y,λ)F(x,y,\lambda)F(x,y,λ)分别对变量x,y,λx, y, \lambdax,y,λ求偏导,然后令偏导数为0
    ∂F(x,y,λ)∂x=0 \frac {\partial F(x,y,\lambda)}{\partial x}=0 xF(x,y,λ)=0
    ∂F(x,y,λ)∂y=0 \frac {\partial F(x,y,\lambda)}{\partial y}=0 yF(x,y,λ)=0
    ∂F(x,y,λ)∂λ=0 \frac {\partial F(x,y,\lambda)}{\partial \lambda}=0 λF(x,y,λ)=0

  • 根据上式分别求解出所有满足条件的(x,y,λ)(x,y,\lambda)(x,y,λ),然后将所有的(x,y)(x,y)(x,y)值对代入函数f(x,y)f(x,y)f(x,y)中,取其最大最小值分别为函数在满足约束条件下的最大最小值。

简单的求解例子:

  1. 给定椭球x2a2+y2b2+z2c2=1\frac {x^2}{a^2}+\frac {y^2}{b^2}+\frac {z^2}{c^2}=1a2x2+b2y2+c2z2=1,求椭球的最大内接长方体体积。
    椭球内接长方体体积为f(x,y,z)=xyzf(x,y,z)=xyzf(x,y,z)=xyz,因此可以转换为求函数f(x,y,z)f(x,y,z)f(x,y,z)的最大值。通过拉格朗日乘子法转化为:
    F(x,y,z,λ)=f(x,y,z)+λ(M−φ(x,y,z))=8xyz+λ(1−x2a2+y2b2+z2c2) \begin{align} F(x,y,z,\lambda)&=f(x,y,z)+\lambda (M-\varphi (x,y,z))\\ &=8xyz+\lambda(1-\frac {x^2}{a^2}+\frac {y^2}{b^2}+\frac {z^2}{c^2}) \end{align} F(x,y,z,λ)=f(x,y,z)+λ(Mφ(x,y,z))=8xyz+λ(1a2x2+b2y2+c2z2)
    分别对x,y,z,λx,y,z,\lambdax,y,z,λ求偏导,得:
    ∂F(x,y,z,λ)∂x=8yz−2λxa2=0∂F(x,y,z,λ)∂y=8xz−2λya2=0∂F(x,y,z,λ)∂z=8xy−2λza2=0∂F(x,y,z,λ)∂λ=1−x2a2+y2b2+z2c2=0 \begin{align} &\frac {\partial F(x,y,z,\lambda)}{\partial x}=8yz-\frac {2\lambda x}{a^2}=0 \\ &\frac {\partial F(x,y,z,\lambda)}{\partial y}=8xz-\frac {2\lambda y}{a^2}=0 \\ &\frac {\partial F(x,y,z,\lambda)}{\partial z}=8xy-\frac {2\lambda z}{a^2}=0 \\ &\frac {\partial F(x,y,z,\lambda)}{\partial \lambda}=1-\frac {x^2}{a^2}+\frac {y^2}{b^2}+\frac {z^2}{c^2}=0 \end{align} xF(x,y,z,λ)=8yza22λx=0yF(x,y,z,λ)=8xza22λy=0zF(x,y,z,λ)=8xya22λz=0λF(x,y,z,λ)=1a2x2+b2y2+c2z2=0
    最后解得:
    x=33ay=33bz=33cλ=433abcfmax(x,y,z)=39abc \begin{align} x=\frac {\sqrt 3}{3}a \hspace{0.5cm} &y=\frac {\sqrt 3}{3}b \hspace{0.5cm} z=\frac {\sqrt 3}{3}c \hspace{0.5cm} \lambda=\frac {4\sqrt 3}{3}abc\\ &f_{max}(x,y,z)=\frac {\sqrt 3}{9}abc \end{align} x=33ay=33bz=33cλ=343abcfmax(x,y,z)=93abc

  2. 求抛物旋转面z=x2+y2z=x^2+y^2z=x2+y2与平面x+y+z=1x+y+z=1x+y+z=1的交线到坐标原点的最近最远点。
    目标函数为f(x,y,z)=x2+y2+z2f(x,y,z)=x^2+y^2+z^2f(x,y,z)=x2+y2+z2,限制条件为φ1(x,y,z)=z−x2−y2\varphi_1(x,y,z)=z-x^2-y^2φ1(x,y,z)=zx2y2φ2(x,y,z)=1−x−y−z\varphi_2(x,y,z)=1-x-y-zφ2(x,y,z)=1xyz
    F(x,y,z,λ1,λ2)=x2+y2+z2+λ1(z−x2−y2)+λ2(1−x−y−z) F(x,y,z,\lambda_1,\lambda_2)=x^2+y^2+z^2+\lambda_1(z-x^2-y^2)+\lambda_2(1-x-y-z) F(x,y,z,λ1,λ2)=x2+y2+z2+λ1(zx2y2)+λ2(1xyz)
    分别对x,y,z,λ1,λ2x,y,z,\lambda_1,\lambda_2x,y,z,λ1,λ2求偏导,得:
    ∂F(x,y,z,λ1,λ2)∂x=2x−2λ1x−λ2=0∂F(x,y,z,λ1,λ2)∂y=2y−2λ1y−λ2=0∂F(x,y,z,λ1,λ2)∂z=2z−2λ1z−λ2=0∂F(x,y,z,λ1,λ2)∂λ1=z−x2−y2=0∂F(x,y,z,λ1,λ2)∂λ2=1−x−y−z=0 \begin{align} &\frac {\partial F(x,y,z,\lambda_1,\lambda_2)}{\partial x}=2x-2\lambda_1 x-\lambda_2=0 \\ &\frac {\partial F(x,y,z,\lambda_1,\lambda_2)}{\partial y}=2y-2\lambda_1 y-\lambda_2=0 \\ &\frac {\partial F(x,y,z,\lambda_1,\lambda_2)}{\partial z}=2z-2\lambda_1 z-\lambda_2=0 \\ &\frac {\partial F(x,y,z,\lambda_1,\lambda_2)}{\partial \lambda_1}=z-x^2-y^2=0 \\ &\frac {\partial F(x,y,z,\lambda_1,\lambda_2)}{\partial \lambda_2}=1-x-y-z=0 \\ \end{align} xF(x,y,z,λ1,λ2)=2x2λ1xλ2=0yF(x,y,z,λ1,λ2)=2y2λ1yλ2=0zF(x,y,z,λ1,λ2)=2z2λ1zλ2=0λ1F(x,y,z,λ1,λ2)=zx2y2=0λ2F(x,y,z,λ1,λ2)=1xyz=0
    解得两个候选点为:
    M1(−1+32,−1+32,2+3)M2(3−12,3−12,2−3) \begin{align} &M_1(-\frac {1+\sqrt 3}{2},-\frac {1+\sqrt 3}{2},2+\sqrt 3)\\ &M_2(\frac {\sqrt 3-1}{2},\frac {\sqrt 3-1}{2},2-\sqrt 3) \end{align} M1(21+3,21+3,2+3)M2(231,231,23)
    求得
    OM1=9+53OM2=9−53 OM_1=\sqrt {9+5\sqrt 3} \hspace{2cm} OM_2=\sqrt {9-5\sqrt 3} OM1=9+53OM2=953
    因此f(x,y,z)f(x,y,z)f(x,y,z)的最大值为9+53\sqrt {9+5\sqrt 3}9+53,最小值为9−53\sqrt {9-5\sqrt 3}953

1.2 拉格朗日乘子法的一般性描述

x⃗=(x1,x2,⋯ ,xm)\vec x=(x_1,x_2,\cdots,x_m)x=(x1,x2,,xm)满足约束条件:
hi(x⃗)=Hii=1,2,⋯ ,n h_i(\vec x)=H_i \hspace{1cm} i=1,2,\cdots,n hi(x)=Hii=1,2,,n
f(x⃗)f(\vec x)f(x)的极值问题。
此时,令:
F(x⃗,λ1,λ2,⋯ ,λn)=f(x⃗)+λ1(H1−h1(x⃗))−λ2(H2−h2(x⃗))−⋯−λn(Hn−hn(x⃗)) F(\vec x,\lambda_1,\lambda_2,\cdots,\lambda_n)=f(\vec x)+\lambda_1(H_1-h_1(\vec x))-\lambda_2(H_2-h_2(\vec x))-\cdots-\lambda_n(H_n-h_n(\vec x)) F(x,λ1,λ2,,λn)=f(x)+λ1(H1h1(x))λ2(H2h2(x))λn(Hnhn(x))
然后F(x⃗,λ1,λ2,⋯ ,λn)F(\vec x,\lambda_1,\lambda_2,\cdots,\lambda_n)F(x,λ1,λ2,,λn)分别对x1,x2,⋯ ,xn,λ1,λ2,⋯ ,λnx_1,x_2,\cdots,x_n,\lambda_1,\lambda_2,\cdots,\lambda_nx1,x2,,xn,λ1,λ2,,λn求偏导,得:
∂F(x⃗,λ⃗)xi=0i=1,2⋯ ,m∂F(x⃗,λ⃗)λj=0j=1,2⋯ ,n \frac {\partial F(\vec x, \vec \lambda)}{x_i} =0 \hspace{1cm} i=1,2\cdots,m \\ \frac {\partial F(\vec x, \vec \lambda)}{\lambda_j} =0 \hspace{1cm} j=1,2\cdots,n xiF(x,λ)=0i=1,2,mλjF(x,λ)=0j=1,2,n
最后求出x⃗\vec xx的候选值,代入f(x⃗)f(\vec x)f(x)取其最小值即可。

2. 具有不等式约束条件(Karush–Kuhn–Tucker conditions KKT)下的极值问题

x⃗\vec xx满足不等式约束条件时,求f(x⃗)f(\vec x)f(x)的极值,即当xxx满足gk(x⃗)≤0g_k(\vec x) \le 0gk(x)0f(x)f(x)f(x)的极值,k=1,2,⋯ ,nk=1,2,\cdots,nk=1,2,,n
下面先定义一个函数L(x,μ)L(x,\mu)L(x,μ)来将f(x)f(x)f(x)gk(x)g_k(x)gk(x)结合到一起:
L(x,μ)=f(x)+∑k=1nμkgk(x) L(x, \mu)=f(x)+\sum_{k=1}^n\mu_kg_k(x) L(x,μ)=f(x)+k=1nμkgk(x)
注意x,μx, \mux,μ都是向量,其满足如下两个约束条件:
{uk≥0gk(x)≤0=>μkgk(x)≤0k=1,2,⋯ ,n \begin{equation} \left\{ \begin{aligned} &u_k\ge 0\\ &g_k(x)\le 0\\ \end{aligned} \right. \hspace{1cm}=> \mu_kg_k(x)\le 0 \hspace{1cm} k=1,2,\cdots,n \end{equation} {uk0gk(x)0=>μkgk(x)0k=1,2,,n
因此
max⁡uL(x,μ)=f(x) \max \limits_uL(x,\mu)=f(x) umaxL(x,μ)=f(x)
则:
min⁡xf(x)=min⁡xmax⁡μL(x,μ) \min\limits_xf(x)=\min\limits_x\max\limits_\mu L(x,\mu) xminf(x)=xminμmaxL(x,μ)
接下来,先求max⁡μmin⁡xL(x,μ)\max\limits_\mu\min\limits_xL(x,\mu)μmaxxminL(x,μ)的值。
max⁡μmin⁡xL(x,μ)=max⁡μ[min⁡xf(x)+min⁡x∑k=1nμkgk(x)]=max⁡μmin⁡xf(x)+max⁡μmin⁡x∑k=1nμkgk(x)=min⁡xf(x)+max⁡μmin⁡x∑k=1nμkgk(x) \begin{align} \max\limits_\mu\min\limits_xL(x,\mu)&=\max\limits_\mu[\min\limits_xf(x)+\min\limits_x\sum_{k=1}^n\mu_kg_k(x)]\\ &=\max\limits_\mu\min\limits_xf(x)+\max\limits_\mu\min\limits_x\sum_{k=1}^n\mu_kg_k(x)\\ &=\min\limits_xf(x)+\max\limits_\mu\min\limits_x\sum_{k=1}^n\mu_kg_k(x) \end{align} μmaxxminL(x,μ)=μmax[xminf(x)+xmink=1nμkgk(x)]=μmaxxminf(x)+μmaxxmink=1nμkgk(x)=xminf(x)+μmaxxmink=1nμkgk(x)
又由于:
{uk≥0gk(x)≤0=>min⁡xukgk(x)={0uk=0orgk(x)=0−∞uk>0andgk(x)<0 \begin{equation} \left\{ \begin{aligned} &u_k\ge 0\\ &g_k(x)\le 0\\ \end{aligned} \right. \hspace{1cm}=> \min\limits_xu_kg_k(x)=\{ \begin{aligned} &0 \hspace{2.0cm} u_k=0 \hspace{0.2cm} or \hspace{0.2cm} g_k(x)=0\\ &-\infty \hspace{1.45cm} u_k > 0\hspace{0.2cm} and \hspace{0.2cm} g_k(x)<0 \end{aligned} \end{equation} {uk0gk(x)0=>xminukgk(x)={0uk=0orgk(x)=0uk>0andgk(x)<0
因此:
max⁡μmin⁡x∑k=1nukgk(x)=0 \max\limits_\mu\min\limits_x\sum_{k=1}^nu_kg_k(x)=0 μmaxxmink=1nukgk(x)=0
当且仅当μ=0\mu=0μ=0或者g(x)=0g(x)=0g(x)=0,故:
max⁡μmin⁡xL(x,μ)=min⁡xf(x)+max⁡μmin⁡x∑k=1nμkgk(x)=min⁡xf(x) \begin{align} \max\limits_\mu\min\limits_xL(x,\mu)&=\min\limits_xf(x)+\max\limits_\mu\min\limits_x\sum_{k=1}^n\mu_kg_k(x)\\ &=\min\limits_xf(x) \end{align} μmaxxminL(x,μ)=xminf(x)+μmaxxmink=1nμkgk(x)=xminf(x)
由上面的式子可得:
min⁡xf(x)=min⁡xmax⁡μL(x,μ)=max⁡μmin⁡xL(x,μ) \min\limits_xf(x)=\min\limits_x\max\limits_\mu L(x,\mu)=\max\limits_\mu\min\limits_xL(x,\mu) xminf(x)=xminμmaxL(x,μ)=μmaxxminL(x,μ)
因此我们把max⁡μmin⁡xL(x,μ)\max\limits_\mu\min\limits_xL(x,\mu)μmaxxminL(x,μ)称为原问题min⁡xmax⁡μL(x,μ)\min\limits_x\max\limits_\mu L(x,\mu)xminμmaxL(x,μ)对偶问题(dual problem)
更一般的,求min⁡f(x)\min f(x)minf(x),我们同时加上等式约束和不等式约束:
hi(x)=0gj(x)≤0 \begin{align} h_i(x)=0\\ g_j(x)\le0 \end{align} hi(x)=0gj(x)0
令:
L(x,α,β)=f(x)+αhi(x)+βgj(x) L(x,\alpha,\beta)=f(x)+\alpha h_i(x)+\beta g_j(x) L(x,α,β)=f(x)+αhi(x)+βgj(x)
我们对g(x)g(x)g(x)加上一个松弛变量ttt,即令gj′(x)=gj(x)+t2g'_j(x)=g_j(x)+t^2gj(x)=gj(x)+t2,且满足:
gj′(x)=gj(x)+t2=0 g'_j(x)=g_j(x)+t^2=0 gj(x)=gj(x)+t2=0
则:
L(x,α,β,t)=f(x)+αhi(x)+β(gj(x)+t2) L(x,\alpha,\beta,t)=f(x)+\alpha h_i(x)+\beta (g_j(x)+t^2) L(x,α,β,t)=f(x)+αhi(x)+β(gj(x)+t2)
接下来使用拉格朗日乘子法解决之:
∂L(x,α,β,t)∂x=∂f(x)∂x+α∂hi(x)∂x+β∂gi(x)∂x=0∂L(x,α,β,t)∂α=hi(x)=0∂L(x,α,β,t)∂β=gi(x)+t2=0∂L(x,α,β,t)∂t=2tβ=0 \begin{align} \frac {\partial L(x,\alpha,\beta,t)}{\partial x}&=\frac {\partial f(x)}{\partial x}+\alpha \frac{\partial h_i(x)}{\partial x}+\beta \frac{\partial g_i(x)}{\partial x}=0\\ \frac {\partial L(x,\alpha,\beta,t)}{\partial \alpha}&=h_i(x)=0\\ \frac {\partial L(x,\alpha,\beta,t)}{\partial \beta}&=g_i(x)+t^2=0\\ \frac {\partial L(x,\alpha,\beta,t)}{\partial t}&=2t\beta=0 \end{align} xL(x,α,β,t)αL(x,α,β,t)βL(x,α,β,t)tL(x,α,β,t)=xf(x)+αxhi(x)+βxgi(x)=0=hi(x)=0=gi(x)+t2=0=2=0
代入求得:
max⁡μmin⁡xL(x,α,β)=min⁡xf(x)=f(x∗) \max\limits_\mu\min\limits_xL(x,\alpha, \beta)=\min\limits_xf(x)=f(x^*) μmaxxminL(x,α,β)=xminf(x)=f(x)
x∗x^*x满足条件:
hi(x)=0βgj(x)=0 h_i(x)=0\\ \beta g_j(x)=0 hi(x)=0βgj(x)=0
又由于gj(x)≤0g_j(x)\le 0gj(x)0,则必须要满足β=0\beta=0β=0或者gj(x)=0g_j(x)=0gj(x)=0

3. 为何拉格朗日乘子法和KKTKKTKKT条件能够得到最优值

设目标函数z=f(x)z=f(x)z=f(x)xxx是向量,先将f(x)f(x)f(x)投影到xxx所在的平面上,因此可以得到一系列等高线:
这里写图片描述
其中虚线是等高线,现假设红线是约束g(x)=Mg(x)=Mg(x)=M,其中红线与等高线的交点就是满足约束条件的所有xxx,但交点肯定不是最优值,因为相交意味着肯定还存在其它的等高线在该条等高线的内部或者外部,使得新的等高线与目标函数的交点的值更大或者更小,只有到等高线与目标函数的曲线相切的时候,可能取得最优值,即等高线和目标函数的曲线在该点的法向量必须有相同方向,所以最优值必须满足:∂f(x)x=α∂gi(x)x\frac {\partial f(x)}{x}=\alpha \frac {\partial g_i(x)}{x}xf(x)=αxgi(x)α\alphaα是常数,表示左右两边同向。这个等式就是L(x,α)L(x,\alpha)L(x,α)对参数求导的结果。
至于KKTKKTKKT由于可以使用朗格朗日法求解,方法同上。

4. 求解supportvectorsupport\hspace{0.1cm}vectorsupportvector和超平面hyperplanehyperplanehyperplane

在样本空间中,超平面上的点都满足以下条件:
wTx+b=0 w^Tx+b=0 wTx+b=0
其中www是一个向量,表示超平面的方向,bbb是一个标量,决定超平面和坐标原点之间的距离,因此超平面可以被wwwbbb唯一确定。空间中xxx到超平面的距离为:
d=∣wTx+b∣∣w∣ d=\frac {|w^Tx+b|}{|w|} d=wwTx+b
详情请见高中数学课本^_^
假设超平面可对样本正确分类,则对于正类y(i)=1y^{(i)}=1y(i)=1的情况,有wTx+b≥γ1w^Tx+b\ge\gamma_1wTx+bγ1,对于负类y(i)=−1y^{(i)}=-1y(i)=1的情况,有wTx+b≤−γ2w^Tx+b \le -\gamma_2wTx+bγ2。由于超平面到两边样本的正中间,所以γ1=γ2=γ\gamma_1=\gamma_2=\gammaγ1=γ2=γ。故:
{wTx+b≥+γy(i)=+1wTx+b≤−γy(i)=−1i=1,2,⋯ ,n \begin{equation} \left\{ \begin{aligned} &w^Tx+b\ge +\gamma \hspace{1cm} y^{(i)}=+1\\ &w^Tx+b\le -\gamma \hspace{1cm} y^{(i)}=-1\\ \end{aligned} \right. \hspace{1cm} \hspace{1cm} i=1,2,\cdots,n \end{equation} {wTx+b+γy(i)=+1wTx+bγy(i)=1i=1,2,,n
距离超平面最近的几个训练样本使得上面的式子取等号,这些样本被称为支持向量(support vector)。两类样本到超平面的距离之和为:
d=2γ∣w∣ d=\frac {2\gamma}{|w|} d=w2γ
要求最大间隔ddd,就是要求最小的|w|,为了计算方便,将问题归结为求解:
min⁡w,b12∣w∣2s.t.y(i)(wTx+b)≥1 \min\limits_{w,b}\frac 12|w|^2\\ s.t. \hspace{0.5cm}y^{(i)}(w^Tx+b) \ge 1 w,bmin21w2s.t.y(i)(wTx+b)1
此处将常数项γ\gammaγ进行了缩放,不会影响组后的结果。

f(w)=12w2 f(w)=\frac 12 w^2 f(w)=21w2
满足约束条件
1−y(i)(wTx+b)≤0 1-y^{(i)}(w^Tx+b) \le 0 1y(i)(wTx+b)0
注意,此处自变量是www而非xxx,且www是向量。
利用上面的KKTKKTKKT和拉格朗日乘子,令:
L(w,b,α)=f(w)+∑i=1mαi(1−y(i)(wTx+b))=12w2+∑i=1mαi(1−y(i)(wTx+b)) \begin{align} L(w,b,\alpha)&=f(w)+\sum_{i=1}^m\alpha_i(1-y^{(i)}(w^Tx+b))\\ &=\frac 12 w^2+\sum_{i=1}^m\alpha_i(1-y^{(i)}(w^Tx+b)) \end{align} L(w,b,α)=f(w)+i=1mαi(1y(i)(wTx+b))=21w2+i=1mαi(1y(i)(wTx+b))
分别对w,b,αw,b,\alphaw,b,α求偏导数,得:
∂L(w,b,α)∂w=w−∑i=1mαiyixi=0∂L(w,b,α)∂b=∑i=1n−(αiyi)=0∂L(w,b,α)∂α=∑i=1n(1−y(i)(wTx+b))=0 \begin{align} \frac {\partial L(w,b,\alpha)}{\partial w}&=w-\sum_{i=1}^m\alpha_iy_ix_i=0\\ \frac {\partial L(w,b,\alpha)}{\partial b}&=\sum_{i=1}^n-(\alpha_iy_i)=0\\ \frac {\partial L(w,b,\alpha)}{\partial \alpha}&=\sum_{i=1}^n(1-y^{(i)}(w^Tx+b))=0 \end{align} wL(w,b,α)bL(w,b,α)αL(w,b,α)=wi=1mαiyixi=0=i=1n(αiyi)=0=i=1n(1y(i)(wTx+b))=0
最后解得:
L(w,b,α)=12∑i=1m∑j=1my(i)y(j)αiαjx(i)Tx(j)−∑i=1m∑j=1my(i)y(j)αiαjx(i)Tx(j)+∑i=1mαiy(i)b+∑i=1nαi=∑i=1nαi−12∑i=1n∑j=1ny(i)y(j)αiαjx(i)Tx(j) \begin{align} L(w,b,\alpha)&=\frac 12\sum_{i=1}^m\sum_{j=1}^my^{(i)}y^{(j)}\alpha_i\alpha_jx^{(i)^T}x^{(j)}-\sum_{i=1}^m\sum_{j=1}^my^{(i)}y^{(j)}\alpha_i\alpha_jx^{(i)^T}x^{(j)}+\sum_{i=1}^m\alpha_iy^{(i)}b+\sum_{i=1}^n\alpha_i\\ &=\sum_{i=1}^n\alpha_i-\frac 12\sum_{i=1}^n\sum_{j=1}^ny^{(i)}y^{(j)}\alpha_i\alpha_jx^{(i)^T}x^{(j)} \end{align} L(w,b,α)=21i=1mj=1my(i)y(j)αiαjx(i)Tx(j)i=1mj=1my(i)y(j)αiαjx(i)Tx(j)+i=1mαiy(i)b+i=1nαi=i=1nαi21i=1nj=1ny(i)y(j)αiαjx(i)Tx(j)
根据上面的定理,有:
min⁡xf(x)=min⁡xmax⁡μL(x,μ)=max⁡μmin⁡xL(x,μ) \min\limits_xf(x)=\min\limits_x\max\limits_\mu L(x,\mu)=\max\limits_\mu\min\limits_xL(x,\mu) xminf(x)=xminμmaxL(x,μ)=μmaxxminL(x,μ)
因此现在要求的是max⁡μmin⁡xL(x,μ)\max\limits_\mu\min\limits_xL(x,\mu)μmaxxminL(x,μ),即求L(w,b,α)L(w,b,\alpha)L(w,b,α)的最大值,w,b,αw,b,\alphaw,b,α满足下面的约束条件(详情见2中说明):
{αi≥0αi(1−y(i)(wTx(i)+b))=01−y(i)(wTx(i)+b)≤0i=1,2,⋯ ,n \begin{equation} \left\{ \begin{aligned} &\alpha_i\ge 0\\ &\alpha_i(1-y^{(i)}(w^Tx^{(i)}+b))=0\\ &1-y^{(i)}(w^Tx^{(i)}+b)\le 0 \end{aligned} \right. \hspace{1cm} \hspace{1cm} i=1,2,\cdots,n \end{equation} αi0αi(1y(i)(wTx(i)+b))=01y(i)(wTx(i)+b)0i=1,2,,n
最后还可以求得:
b=max⁡y(i)=−1wTx(i)+min⁡y(i)=1wTx(i)2 b= \frac {\max\limits_{y^{(i)}=-1}w^Tx^{(i)}+\min\limits_{y^{(i)}=1}w^Tx^{(i)}}2 b=2y(i)=1maxwTx(i)+y(i)=1minwTx(i)
最后解得的超平面为:
f(x)=b+∑i=1mαiyix(i)Tx(i) f(x)=b+\sum_{i=1}^m\alpha_iy_ix^{(i)^T}x^{(i)} f(x)=b+i=1mαiyix(i)Tx(i)
对于训练样本(x(i),y(i))(x^{(i)},y^{(i)})(x(i),y(i)),总有αi=0\alpha_i=0αi=0或者1−yi(wTx+b)=01-y_i(w^Tx+b)=01yi(wTx+b)=0(注意,此处有多少训练样本,就有多少个α\alphaα参数)。若αi=0\alpha_i=0αi=0,则第iii个样本不是支持向量,也不会在上面的求和公式中出现。若αi>0\alpha_i>0αi>0,此时(x(i),y(i))(x^{(i)},y^{(i)})(x(i),y(i))是一个支持向量,必有y(i)(wTx(i)+b)=1y^{(i)}(w^Tx^{(i)}+b)=1y(i)(wTx(i)+b)=1。这表示,最终的模型仅与支持向量有关。
至此完成的超平面的全部计算。

5. 核函数(kernels)

由于SVM的核心工作是找到一个超平面来正确地将正负样本分开,这就要求原来的数据本来就应该是线性可分的(可有少量误分类)。但是对于某些线性不可分问题,就不能直接这样求解,因此就需要用到核函数(kernel function)。核函数的功能是:将数据从原来的维度映射到一个更高的维度,在这个维度里面,数据是线性可分的。如果不考虑过拟合问题,对于任何数据,总能找到一个高维的空间,使得映射后的数据完全线性可分(准确率达到100%)。
根据上面的推导,SVM的目标函数为:
L(w,b,α)=∑i=1nαi−12∑i=1n∑j=1ny(i)y(j)αiαjx(i)Tx(j) L(w,b,\alpha)=\sum_{i=1}^n\alpha_i-\frac 12\sum_{i=1}^n\sum_{j=1}^ny^{(i)}y^{(j)}\alpha_i\alpha_jx^{(i)^T}x^{(j)} L(w,b,α)=i=1nαi21i=1nj=1ny(i)y(j)αiαjx(i)Tx(j)
由于(x(i),y(i))(x^{(i)}, y^{(i)})(x(i),y(i))都是已知值,因此上式是一个关于αi\alpha_iαi的函数,记为:
W(α⃗)=∑i=1nαi−12∑i=1n∑j=1ny(i)y(j)αiαjx(i)Tx(j) W(\vec \alpha)=\sum_{i=1}^n\alpha_i-\frac 12\sum_{i=1}^n\sum_{j=1}^ny^{(i)}y^{(j)}\alpha_i\alpha_jx^{(i)^T}x^{(j)} W(α)=i=1nαi21i=1nj=1ny(i)y(j)αiαjx(i)Tx(j)
为了方便,记x(i)Tx(j)x^{(i)^T}x^{(j)}x(i)Tx(j)为:⟨x(i),x(j)⟩\langle x^{(i)} , x^{(j)} \ranglex(i),x(j),表示向量内积。
假设我们需要将向量a⃗\vec aa映射为a⃗′\vec a'a,其中a⃗∈Rm,b⃗∈Rn,n>m\vec a \in R^m, \vec b \in R^n, n>maRm,bRn,n>m,令这个映射为:
Φ(x):{x∣x∈Rm}−>{x′∣x′∈Rn} \Phi(x): \{x|x\in R^m\}->\{x'|x' \in R^n\} Φ(x):{xxRm}>{xxRn}
那么加入这种映射以后,目标函数为:
W(α⃗)=∑i=1nαi−12∑i=1n∑j=1ny(i)y(j)αiαj⟨Φ(x(i)),Φ(x(j))⟩ W(\vec \alpha)=\sum_{i=1}^n\alpha_i-\frac 12\sum_{i=1}^n\sum_{j=1}^ny^{(i)}y^{(j)}\alpha_i\alpha_j\langle \Phi(x^{(i)}),\Phi(x^{(j)})\rangle W(α)=i=1nαi21i=1nj=1ny(i)y(j)αiαjΦ(x(i)),Φ(x(j))⟩
在高维空间中,要想计算⟨Φ(x(i)),Φ(x(j))⟩\langle \Phi(x^{(i)}),\Phi(x^{(j)}) \rangleΦ(x(i)),Φ(x(j))⟩,我们就需要核函数:Kernel。
定义:
Kernel(x,z)=⟨Φ(x),Φ(z)⟩ Kernel(x,z)=\langle \Phi(x),\Phi(z)\rangle Kernel(x,z)=Φ(x),Φ(z)⟩
核函数是一个非常抽象的东西,一般情况下,我们只需要将W(α⃗)W(\vec \alpha)W(α)计算出来即可,并不需要深入到那个映射以后的高维空间中去看看映射后的数据是什么样子,某些情况下这甚至是不可能的。打个比方,你要计算a1+b1+c1+d1+...−(a1+b1+c1+d1+...)a_1+b_1+c_1+d_1+...-(a_1+b_1+c_1+d_1+...)a1+b1+c1+d1+...(a1+b1+c1+d1+...),你不需要深入到把前后两个加法全算出来,相反,只需要计算其中部分即可(事实上结果为0)。虽然不太贴切,但是思想差不多,就是通过x,zx,zx,z直接计算出⟨Φ(x),Φ(z)⟩\langle \Phi(x),\Phi(z)\rangleΦ(x),Φ(z)⟩,但你却并不需要知道Φ(x)\Phi(x)Φ(x)Φ(z)\Phi(z)Φ(z)到底是什么。事实上,如果最后的计算涉及到求⟨x(i),x(j)⟩\langle x^{(i)},x^{(j)}\ranglex(i),x(j),都可以使用核函数。
下面来计算一个式子:
K(x,z)=(xT,z)2=(∑i=1nxizi)(∑j=1nxjzj)=∑i=1n∑j=1n(xixj)(zizj) \begin{align} K(x,z)=(x^T,z)^2&=(\sum_{i=1}^nx_iz_i)(\sum_{j=1}^nx_jz_j)\\ &=\sum_{i=1}^n\sum_{j=1}^n(x_ix_j)(z_iz_j) \end{align} K(x,z)=(xT,z)2=(i=1nxizi)(j=1nxjzj)=i=1nj=1n(xixj)(zizj)
因此令
Φ(x)=[x1x1x1x2x1x3x2x1x2x2x2x3x3x1x3x2x3x3] \Phi(x)= \begin{bmatrix} x_1x_1\\ x_1x_2\\ x_1x_3 \\ x_2x_1\\ x_2x_2\\ x_2x_3\\ x_3x_1\\ x_3x_2\\ x_3x_3 \end{bmatrix} Φ(x)=x1x1x1x2x1x3x2x1x2x2x2x3x3x1x3x2x3x3
假设K(x,z)=(xTz+c)2K(x,z)=(x^Tz+c)^2K(x,z)=(xTz+c)2,则:
K(x,z)=∑i=1n∑j=1n(xixj)(zizj)+∑i=1n(2cxi)(2czi)+c2=⟨Φ(x),Φ(z)⟩ \begin{align} K(x,z)&=\sum_{i=1}^n\sum_{j=1}^n(x_ix_j)(z_iz_j)+\sum_{i=1}^n(\sqrt {2c}x_i)(\sqrt {2c}z_i)+c^2\\ &=\langle \Phi(x),\Phi(z) \rangle \end{align} K(x,z)=i=1nj=1n(xixj)(zizj)+i=1n(2cxi)(2czi)+c2=Φ(x),Φ(z)⟩
则:
Φ(x)=[x1x1x1x2x1x3x2x1x2x2x2x3x3x1x3x2x3x32cx12cx22cx3c]Φ(z)=[z1z1z1z2z1z3z2z1z2z2z2z3z3x1z3z2z3z32cz12cz22cz3c] \Phi(x)= \begin{bmatrix} x_1x_1\\ x_1x_2\\ x_1x_3 \\ x_2x_1\\ x_2x_2\\ x_2x_3\\ x_3x_1\\ x_3x_2\\ x_3x_3\\ \sqrt{2c}x1\\ \sqrt{2c}x2\\ \sqrt{2c}x3\\ c \end{bmatrix} \Phi(z)= \begin{bmatrix} z_1z_1\\ z_1z_2\\ z_1z_3 \\ z_2z_1\\ z_2z_2\\ z_2z_3\\ z_3x_1\\ z_3z_2\\ z_3z_3\\ \sqrt{2c}z1\\ \sqrt{2c}z2\\ \sqrt{2c}z3\\ c \end{bmatrix} Φ(x)=x1x1x1x2x1x3x2x1x2x2x2x3x3x1x3x2x3x32cx12cx22cx3cΦ(z)=z1z1z1z2z1z3z2z1z2z2z2z3z3x1z3z2z3z32cz12cz22cz3c
假设
K(x,z)=e−∣∣x⃗−z⃗∣∣2 K(x,z)=e^{-||\vec x-\vec z||^2} K(x,z)=e∣∣xz2
泰勒展开,得:
K(x,z)=e−x2e−z2∑k=1∞2k(x)k(z)kk! K(x,z)=e^{-x^2}e^{-z^2}\sum_{k=1}^\infty \frac{2^k(x)^k(z)^k}{k!} K(x,z)=ex2ez2k=1k!2k(x)k(z)k
这样得到的Φ(x)\Phi(x)Φ(x)是一个无穷维度:
Φ(x)=[2e−x2x2e−x2x2⋮2kk!e−x2xk] \Phi(x)= \begin{bmatrix} \sqrt 2e^{-x^2}x\\ \sqrt 2e^{-x^2}x^2\\ \vdots\\ \sqrt{\frac {2^k}{k!}}e^{-x^2}x^k \end{bmatrix} Φ(x)=2ex2x2ex2x2k!2kex2xk
此时Φ(x)\Phi(x)Φ(x)是一个无穷维的向量(当然这里x,kx,kx,k假设只是一个一维的,更高维度的情况复杂,此处不列举)。对于一般的K(x,z)=(xTz+c)dK(x,z)=(x^Tz+c)^dK(x,z)=(xTz+c)d,此处xxx的维度将会由nnn变成∑i=1nid\sum_{i=1}^ni^di=1nid维度,将会呈现爆炸性增长。

判断一个KernelKernelKernel是一个合法的KernelKernelKernel:
假设数据点为{x(1),⋯ ,x(m)}\{x^{(1)},\cdots,x^{(m)}\}{x(1),,x(m)}设计矩阵:
M=[k(x(1),x(2)),k(x(1),x(3)),⋯ ,k(x(1),x(m))k(x(2),x(1)),k(x(2),x(2)),⋯ ,k(x(2),x(m))⋮k(x(i),x(j))⋮k(x(m),x(1)),k(x(m),x(2)),⋯ ,k(x(m),x(m))] M= \begin{bmatrix} k(x^{(1)},x^{(2)}),k(x^{(1)},x^{(3)}),\cdots,k(x^{(1)},x^{(m)})\\ k(x^{(2)},x^{(1)}),k(x^{(2)},x^{(2)}),\cdots,k(x^{(2)},x^{(m)})\\ \vdots \\ k(x^{(i)},x^{(j)})\\ \vdots\\ k(x^{(m)},x^{(1)}),k(x^{(m)},x^{(2)}),\cdots,k(x^{(m)},x^{(m)}) \end{bmatrix} M=k(x(1),x(2)),k(x(1),x(3)),,k(x(1),x(m))k(x(2),x(1)),k(x(2),x(2)),,k(x(2),x(m))k(x(i),x(j))k(x(m),x(1)),k(x(m),x(2)),,k(x(m),x(m))

则:
zTMz=∑i=1m∑j=1mzikijzj=∑i=1m∑j=1mziΦ(x(i)T)Φ(x(j)T)zj=∑t=1n(∑i=1mΦ(x(i))zi)2≥0 \begin{align} z^TMz&=\sum_{i=1}^m\sum_{j=1}^mz_ik_{ij}z_j\\ &=\sum_{i=1}^m\sum_{j=1}^mz_i\Phi(x^{(i)^T})\Phi(x^{(j)^T})z_j\\ &=\sum_{t=1}^n(\sum_{i=1}^m\Phi(x^{(i)})z_i)^2 \ge 0 \end{align} zTMz=i=1mj=1mzikijzj=i=1mj=1mziΦ(x(i)T)Φ(x(j)T)zj=t=1n(i=1mΦ(x(i))zi)20
因此ValidKernelValid \hspace{0.1cm}KernelValidKernel的充要条件是:矩阵M(由m个点中的任意个点组成的矩阵)是一个半正定矩阵,即k(x,x)≥0k(x,x)\ge 0k(x,x)0
常用的核函数有:

  • Linear Kernel(线性核)
    k(x,z)=xTy+c k(x,z)=x^Ty+c k(x,z)=xTy+c
  • Polynomial Kernel(多项式核)
    k(x,z)=(axTy+c)d k(x,z)=(ax^Ty+c)^d k(x,z)=(axTy+c)d
  • RBF(Radial Basis Function 径向基核函数)
    k(x,z)=e−γ∣∣x−z∣∣2 k(x,z)=e^{-\gamma||x-z||^2} k(x,z)=eγ∣∣xz2
  • Gaussian Kernel(高斯核)
    k(x,z)=e−∣∣x−z∣∣22σ2 k(x,z)=e^{-\frac {||x-z||^2}{2\sigma^2}} k(x,z)=e2σ2∣∣xz2
  • Laplacian Kernel(拉普拉斯核)
    k(x,z)=e−∣∣x−z∣∣σ k(x,z)=e^{-\frac {||x-z||}{\sigma}} k(x,z)=eσ∣∣xz∣∣
  • sigmod核
    k(x,z)=tanh⁡(axT+c) k(x,z)=\tanh(ax^T+c) k(x,z)=tanh(axT+c)

6. 允许误差的SoftmarginSoft \hspace{0.1cm} marginSoftmargin

原问题为:
min⁡12∣w∣2s.t.y(i)(wT+b)≥1 \min \frac 12|w|^2 \hspace{1.0cm} s.t.\hspace{0.4cm}y^{(i)}(w^T+b)\ge 1 min21w2s.t.y(i)(wT+b)1
假设我们允许某些样本被错误分类,在每个样本点后面加上了一个宽松条件,允许这个点违反一点点ξi\xi_iξi大小的误差,对于没有违反的点,则ξi\xi_iξi为0。同时为了最优化,需要最小化所有误差的和,因此在最小化的项后面加上了误差和。因此加上一个惩罚因子:
min⁡12∣w∣2+C∑i=1mξis.t.y(i)(wT+b)≥1−ξiξi≥0 \begin{align} \min \frac 12|w|^2+C\sum_{i=1}^m\xi_i\hspace{1.0cm}s.t.\hspace{0.4cm}&y^{(i)}(w^T+b)\ge 1-\xi_i\\ &\xi_i \ge 0 \end{align} min21w2+Ci=1mξis.t.y(i)(wT+b)1ξiξi0
上式子中,在ξi\xi_iξi前面加了权重C,这个可以由使用SVM的用户指定,可以看出,如果C很大,对错误的惩罚越大,模型会倾向于尽量将样本分割开;如果C越小,则会有更多的违反边界的点存在。
类似于下图:
这里写图片描述
因此上面的拉格朗日函数变为:
L(w,b,ξ,α,β)=12wTw+C∑i=1nξi−∑i=1nαi(yi(wTxi+b)−1+ξi)−∑i=1nβiξi L(w,b,\xi,\alpha,\beta)=\frac 12w^Tw+C\sum_{i=1}^n\xi_i-\sum_{i=1}^n\alpha_i(y_i(w^Tx_i+b)-1+\xi_i)-\sum_{i=1}^n\beta_i\xi_i L(w,b,ξ,α,β)=21wTw+Ci=1nξii=1nαi(yi(wTxi+b)1+ξi)i=1nβiξi
求偏导:
∂L∂w=w−∑i=1nαiyixi=0∂L∂b=∑i=1nαiyi=0∂L∂ξi=C−αi−βi=0=>αi≤C \begin{align} \frac {\partial L}{\partial w}&=w-\sum_{i=1}^n\alpha_iy_ix_i=0\\ \frac {\partial L}{\partial b}&=\sum_{i=1}^n\alpha_iy_i=0\\ \frac {\partial L}{\partial \xi_i}&=C-\alpha_i-\beta_i=0 \hspace{1.0cm} =>\alpha_i \le C \end{align} wLbLξiL=wi=1nαiyixi=0=i=1nαiyi=0=Cαiβi=0=>αiC
βi=C−αi\beta_i=C-\alpha_iβi=Cαi代入到上面的式子可以把βi,ξi\beta_i,\xi_iβi,ξi全部消掉,得:
L=max⁡0≤αi≤C(min⁡b,w,ξ12wTw+∑i=1nαi(1−yi(wTxi+b))) L=\max_{0\le\alpha_i\le C}(\min_{b,w,\xi}\frac 12w^Tw+\sum_{i=1}^n\alpha_i(1-y_i(w^Tx_i+b))) L=0αiCmax(b,w,ξmin21wTw+i=1nαi(1yi(wTxi+b)))
Hard margin的KKT条件为:αi(1−yi(wTxi+b))=0\alpha_i(1-y_i(w^Tx_i+b))=0αi(1yi(wTxi+b))=0,而Soft Margin的KKT条件根据前面的最大最小化两个过程得出(具体过程见周志华西瓜书P404页):
αi(1−ξi−yi(wTxi+b))=0βiξi=0 \alpha_i(1-\xi_i-y_i(w^Tx_i+b))=0\\ \beta_i\xi_i=0 αi(1ξiyi(wTxi+b))=0βiξi=0
由上面的式子得出:0≤αi≤C0\le \alpha_i \le C0αiC。如果αi=0\alpha_i=0αi=0,则该样本不是支持向量,不参与计算。若αi<C\alpha_i< Cαi<C,则βi>0\beta_i>0βi>0。由于βiξi=0\beta_i\xi_i=0βiξi=0,因此ξi=0\xi_i=0ξi=0,此时向量刚好落在边界上。如果:αi=C\alpha_i=Cαi=C,则如果ξi≤1\xi_i\le1ξi1,此时样本落在最大间隔内部,如果ξi≥1\xi_i\ge1ξi1,则样本被错误分类。

7. SMO算法求解αi\alpha_iαi

7.1 SMO算法的基本原理

由上面的式子可知,目标函数为:
W(α⃗)=∑i=1nαi−12∑i=1n∑j=1ny(i)y(j)αiαjx(i)Tx(j) W(\vec \alpha)=\sum_{i=1}^n\alpha_i-\frac 12\sum_{i=1}^n\sum_{j=1}^ny^{(i)}y^{(j)}\alpha_i\alpha_jx^{(i)^T}x^{(j)} W(α)=i=1nαi21i=1nj=1ny(i)y(j)αiαjx(i)Tx(j)
约束条件为:
∑i=1nαiy(i)=00≤αi≤C \sum_{i=1}^n\alpha_iy^{(i)}=0\\ 0\le \alpha_i \le C i=1nαiy(i)=00αiC
SMO算法的核心思想是:

  1. 用启发式方法(heuristic method)选出两个变量αs,αt\alpha_s, \alpha_tαs,αt,并保持其他的α\alphaα不变。此时有:
    αsy(s)+αty(t)=−∑k=1,k≠s,k≠tnαky(k)=ξ0≤αi≤C \alpha_sy^{(s)}+\alpha_ty^{(t)}=-\sum_{k=1, k\not=s,k\not=t}^n\alpha_ky^{(k)}=\xi\\ 0\le \alpha_i \le C αsy(s)+αty(t)=k=1,k=s,k=tnαky(k)=ξ0αiC
    此时我们求得:
    αt=ξ−αsy(s)y(t) \alpha_t=\frac {\xi-\alpha_sy^{(s)}}{y^{(t)}} αt=y(t)ξαsy(s)
  2. 然后将其带入W(α⃗)W(\vec \alpha)W(α)中,可以看出,W(α⃗)W(\vec \alpha)W(α)是一个关于αs\alpha_sαs的二次函数。为:
    W(αs)=aαs2+bαs+c W(\alpha_s)=a\alpha_s^2+b\alpha_s+c W(αs)=aαs2+bαs+c
    限制条件是:0≤αs≤C0\le \alpha_s \le C0αsC,因此很容易就能求出αs,αt\alpha_s,\alpha_tαs,αt的值。虽然此算法需要迭代次数比较多,但是每次迭代的计算量很小,因此速度很快。
  3. 不断重复1、2步骤,直到再也选不出任意的αs,αt\alpha_s,\alpha_tαs,αt满足限制条件却又为到达最优为止(算法收敛)。
    ###7.2 每次迭代变量αs,αt\alpha_s,\alpha_tαs,αt的选择
  • 第一个变量αs\alpha_sαs的选择:

    第一个变量的选择称为外循环,首先遍历整个样本集,选择违反KKTKKTKKT条件的αi\alpha_iαi作为第一个变量,接着依据相关规则选择第二个变量(见下面分析),对这两个变量采用上述方法进行优化。当遍历完整个样本集后,遍历非边界样本集( $ 0<\alpha_i < C$ 中违反KKTKKTKKTαi\alpha_iαi作为第一个变量,同样依据相关规则选择第二个变量,对此两个变量进行优化。当遍历完非边界样本集后,再次回到遍历整个样本集中寻找,即在整个样本集与非边界样本集上来回切换,寻找违反KKTKKTKKT条件的αi\alpha_iαi作为第一个变量。直到遍历整个样本集后,没有违反KKTKKTKKT条件αi\alpha_iαi,然后退出。 KKT条件为:

    这里写图片描述

    边界上的样本对应的αi\alpha_iαi或者αi=C\alpha_i=Cαi=C,在优化过程中很难变化,然而非边界样本0<αi<C0<\alpha_i< C0<αi<C会随着对其他变量的优化会有大的变化。

  • 第二个变量αt\alpha_tαt的选择:

    SMO称第二个变量的选择过程为内循环,假设在外循环中找个第一个变量记为αi\alpha_iαi,第二个变量的选择希望能使αj\alpha_jαj有较大的变化,由于αj\alpha_jαj是依赖于∣E1−E2∣|E_1−E_2|E1E2(E1E_1E1E2E_2E2分别为预测值和实际值之间的误差),当E1E_1E1为正时,那么选择最小的EiE_iEi作为E2E_2E2,如果E1E_1E1为负,选择最大EiE_iEi作为E2E_2E2,通常为每个样本的EiE_iEi保存在一个列表中,选择最大的∣E1−E2∣|E_1−E_2|E1E2来近似最大化步长。
    有时按照上述的启发式选择第二个变量,不能够使得函数值有足够的下降,这时按下述步骤:

    • 首先在非边界集上选择能够使函数值足够下降的样本作为第二个变量,
    • 如果非边界集上没有,则在整个样本集上选择第二个变量,
    • 如果整个样本集依然不存在,则重新选择第一个变量。

7.2 b值的计算

这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值