【机器学习】支持向量机原理(四)SMO算法原理

   在SVM的前三篇里,我们优化的目标函数最终都是一个关于  α   α 向量的函数。而怎么极小化这个函数,求出对应的  α   α 向量,进而求出分离超平面我们没有讲。本篇就对优化这个关于  α   α 向量的函数的SMO算法做一个总结。


回顾SVM优化目标函数

   我们首先回顾下我们的优化目标函数:

minα12i=1mj=1mαiαjyiyjK(xi,xj)i=1mαis.t.i=1mαiyi=00αiC m i n ⏟ α 1 2 ∑ i = 1 m ∑ j = 1 m α i α j y i y j K ( x i , x j ) − ∑ i = 1 m α i s . t . ∑ i = 1 m α i y i = 0 0 ≤ α i ≤ C
 
   我们的解要满足的KKT条件的对偶互补条件为:
αi(yi(wTxi+b)1)=0(1) (1) α i ∗ ( y i ( w T x i + b ) − 1 ) = 0

   根据这个KKT条件的对偶互补条件,我们有:
αi=0yi(wϕ(xi)+b)1)10<αi<Cyi(wϕ(xi)+b)1)=1αi=Cyi(wϕ(xi)+b)1)1(2) (2) α i ∗ = 0 ⇒ y i ( w ∗ ∙ ϕ ( x i ) + b ) − 1 ) ≥ 1 0 < α i ∗ < C ⇒ y i ( w ∗ ∙ ϕ ( x i ) + b ) − 1 ) = 1 α i ∗ = C ⇒ y i ( w ∗ ∙ ϕ ( x i ) + b ) − 1 ) ≤ 1

   由于  w=j=1mαjyjϕ(xj)   w ∗ = ∑ j = 1 m α j ∗ y j ϕ ( x j ) ,我们令  g(x)=wϕ(x)+b=j=1mαiyjK(x,xj)+b   g ( x ) = w ∗ ∙ ϕ ( x ) + b = ∑ j = 1 m α i ∗ y j K ( x , x j ) + b ∗ ,则有:
αi=0yig(xi)10<αi<Cyig(xi)=1αi=Cyig(xi)1(3) (3) α i ∗ = 0 ⇒ y i g ( x i ) ≥ 1 0 < α i ∗ < C ⇒ y i g ( x i ) = 1 α i ∗ = C ⇒ y i g ( x i ) ≤ 1
   


SMO算法的基本思想

   上面这个优化式子比较复杂,里面有m个变量组成的向量  α   α 需要在目标函数极小化的时候求出。直接优化时很难的。SMO算法则采用了一种启发式的方法。它每次只优化两个变量,将其他的变量都视为常数。由于  i=1mαiyi=0   ∑ i = 1 m α i y i = 0 .假如将  α3,α4,...,αm   α 3 , α 4 , . . . , α m 固定,那么  α1,α2   α 1 , α 2 之间的关系也确定了。这样SMO算法将一个复杂的优化算法转化为一个比较简单的两变量优化问题。
   
   为了后面表示方便,我们定义  Kij=ϕ(xi)ϕ(xj)   K i j = ϕ ( x i ) ∙ ϕ ( x j )
   
   由于  α3,α4,...,αm   α 3 , α 4 , . . . , α m 都成了常量,所有的常量我们都从目标函数去除,这样我们上一节的目标优化函数变成下式:

minα1,α212K11α21+12K22α22+y1y2K12α1α2(α1+α2)+y1α1i=3myiαiKi1+y2α2i=3myiαiKi2s.t.α1y1+α2y2=i=3myiαi=ς0αiCi=1,2(1)(2)(3) m i n ⏟ α 1 , α 2 1 2 K 11 α 1 2 + 1 2 K 22 α 2 2 + y 1 y 2 K 12 α 1 α 2 − ( α 1 + α 2 ) + y 1 α 1 ∑ i = 3 m y i α i K i 1 (1) + y 2 α 2 ∑ i = 3 m y i α i K i 2 (2) s . t . α 1 y 1 + α 2 y 2 = − ∑ i = 3 m y i α i = 常 数 ς (3) 0 ≤ α i ≤ C i = 1 , 2
   


SMO算法目标函数的优化

   本部分的总体思路:首先将目标函数看作是一个关于  α1,α2   α 1 , α 2 的二元二次函数  W(α1,α2)   W ( α 1 , α 2 ) ,然后通过条件  α1y1+α2y2=ς   α 1 y 1 + α 2 y 2 = ς 将目标函数转化为一个关于  α2   α 2 的一元二次函数  W(α2)   W ( α 2 ) ,我们的最终目标是求出  W(α2)   W ( α 2 ) 在参数  α2   α 2 可行域范围内的函数最小值。
  下文第一部分先求出  W(α2)   W ( α 2 ) 的极值点  αnew,unclipped2   α 2 n e w , u n c l i p p e d 。下文第二部分根据约束条件
(  α1y1+α2y2=ς,0αiCi=1,2   α 1 y 1 + α 2 y 2 = ς , 0 ≤ α i ≤ C i = 1 , 2 )求出  α2   α 2 的可行域。下文第三部分,分类讨论一元二次函数  W(α2)   W ( α 2 ) 的最优解  α2   α 2 ∗  α2   α 2 的可行域边界取得还是在极值点取得。第四部分通过  α1,α2   α 1 , α 2 的关系,由  α2   α 2 求出  α1   α 1 .

1. 不考虑约束条件(  α1y1+α2y2=ς,0αiCi=1,2   α 1 y 1 + α 2 y 2 = ς , 0 ≤ α i ≤ C i = 1 , 2 ),对目标函数求极值点

   首先我们的目标函数是一个二元二次函数:

W(α1,α2)=12K11α21+12K22α22+y1y2K12α1α2(α1+α2)+y1α1i=3myiαiKi1+y2α2i=3myiαiKi2=12K11α21+12K22α22+y1y2K12α1α2(α1+α2)+y1α1v1+y2α2v2(4)(5)(6) (4) W ( α 1 , α 2 ) = 1 2 K 11 α 1 2 + 1 2 K 22 α 2 2 + y 1 y 2 K 12 α 1 α 2 − ( α 1 + α 2 ) (5) + y 1 α 1 ∑ i = 3 m y i α i K i 1 + y 2 α 2 ∑ i = 3 m y i α i K i 2 (6) = 1 2 K 11 α 1 2 + 1 2 K 22 α 2 2 + y 1 y 2 K 12 α 1 α 2 − ( α 1 + α 2 ) + y 1 α 1 v 1 + y 2 α 2 v 2

其中

vi=j=3myjαjKij=g(xi)j=12yjajkijb,i=1,2g(x)=wϕ(x)+b=j=1mαiyjK(x,xj)+b(4) (4) { v i = ∑ j = 3 m y j α j K i j = g ( x i ) − ∑ j = 1 2 y j a j k i j − b , i = 1 , 2 g ( x ) = w ∙ ϕ ( x ) + b = ∑ j = 1 m α i y j K ( x , x j ) + b

   由于  α1y1+α2y2=ς   α 1 y 1 + α 2 y 2 = ς ,并且  y2i=1   y i 2 = 1 ,可以得到用  α2   α 2 表达  α1   α 1 的式子:

α1=y1(ςα2y2)(7) (7) α 1 = y 1 ( ς − α 2 y 2 )
 
   将上式带入我们的目标优化函数,就可以消除  α1   α 1 ,得到仅仅包含  α2   α 2 的式子为:
W(α2)=12K11(ςa2y2)2+12K22α22+y2K12(ςa2y2)α2(y1(ςα2y2)+α2)+(ςa2y2)v1+y2α2v2(8)(9) (8) W ( α 2 ) = 1 2 K 11 ( ς − a 2 y 2 ) 2 + 1 2 K 22 α 2 2 + y 2 K 12 ( ς − a 2 y 2 ) α 2 − ( y 1 ( ς − α 2 y 2 ) + α 2 ) (9) + ( ς − a 2 y 2 ) v 1 + y 2 α 2 v 2
 
 
   显然  W(α2)   W ( α 2 ) 是一个一元二次方程,最优解 α2 α 2 ∗ 只能是约束条件(  0αiC   0 ≤ α i ≤ C )规定的可行域的边界值,或者是  W(α2)   W ( α 2 ) 的极值点。现在我们先对其求极值点,即对  α2   α 2 求导并令为0得:
W(α2)α2=(K11+K222K12)α2K11ςy2+K12ςy2+y1y21v1y2+v2y2=0(10)(5) (10) ∂ W ( α 2 ) ∂ α 2 = ( K 11 + K 22 − 2 K 12 ) α 2 − K 11 ς y 2 + K 12 ς y 2 + y 1 y 2 − 1 (5) − v 1 y 2 + v 2 y 2 = 0
  
   这时候我们定义  Ei   E i 表示预测值  g(xi)   g ( x i ) 与真实值  yi   y i 之差:
Ei=g(xi)yi(6) (6) E i = g ( x i ) − y i
     
   这时我们记优化前的解为  αold1,αold2   α 1 o l d , α 2 o l d ,优化后的解为  αnew1,αnew2   α 1 n e w , α 2 n e w ,由约束条件  i=1myiαi=0   ∑ i = 1 m y i α i = 0 ,有  αold1y1+αold2y2=αnew1y1+αnew1y2=ς   α 1 o l d y 1 + α 2 o l d y 2 = α 1 n e w y 1 + α 1 n e w y 2 = ς ,即
αnew1y1+αnew1y2=ς(7) (7) α 1 n e w y 1 + α 1 n e w y 2 = ς
 
进行下一步化简,将式子(4)(6)(7)代入式子(5),此时求解出的  αnew2   α 2 n e w 未考虑约束条件(  0αiC   0 ≤ α i ≤ C ),先记为  αnew,unclipped2   α 2 n e w , u n c l i p p e d
(K11+K222K12)αnew,unclipped2=(K11+K222K12)αold2+y2(E1E2)(8) (8) ( K 11 + K 22 − 2 K 12 ) α 2 n e w , u n c l i p p e d = ( K 11 + K 22 − 2 K 12 ) α 2 o l d + y 2 ( E 1 − E 2 )
 
   我们终于得到了  αnew,unclipped2   α 2 n e w , u n c l i p p e d 的表达式:
αnew,unclipped2=αold2+y2(E1E2)K11+K222K12(9) (9) α 2 n e w , u n c l i p p e d = α 2 o l d + y 2 ( E 1 − E 2 ) K 11 + K 22 − 2 K 12
 

2. 由约束条件(  α1y1+α2y2=ς,0αiCi=1,2   α 1 y 1 + α 2 y 2 = ς , 0 ≤ α i ≤ C i = 1 , 2 )求出  α2   α 2 的可行域   

   上面求出的  αnew,unclipped2   α 2 n e w , u n c l i p p e d 没考虑到的约束条件为:

{0αi=1,2Cα1y1+α2y2=ς { 0 ≤ α i = 1 , 2 ≤ C α 1 y 1 + α 2 y 2 = ς
  
   在二维平面上直观表达上述两个约束条件 :
    这里写图片描述
   
   根据式子  α1y1+α2y2=ς   α 1 y 1 + α 2 y 2 = ς ,和  y1,y2   y 1 , y 2 只能取值  +11   + 1 或 − 1 ,共有四种情况:
   
(1)当  y1=1,y2=1   y 1 = 1 , y 2 = 1 ,此时的表达式为  α1y1+α2y2=ς   α 1 y 1 + α 2 y 2 = ς ,那么对应上图中的右边情况。根据  ς   ς 的不同取值,我们可以分为下面几种情况来求  α2   α 2 的可行域:

  1.  ς<0   ς < 0 ,因为  0αiC   0 ≤ α i ≤ C ,所以此时  α1y1+α2y2=ς   α 1 y 1 + α 2 y 2 = ς 与方形区域一定没有任何交集,所以此时  α2   α 2 的可行域为空集.
  2.  ς=0   ς = 0 ,此时  α1y1+α2y2=0   α 1 y 1 + α 2 y 2 = 0 ,此时与方形区域的交点就是(0,0),那么可行域就是  α2=0   α 2 = 0 .
  3.  0ςC   0 ≤ ς ≤ C 时,此时对应上图中右边的靠下的那种直线的情况,所以根据直线和方形区域的相交情况,此时可以求出  α2   α 2 的可行区间为  [0,ς]   [ 0 , ς ] ,即  [0,α1+α2]   [ 0 , α 1 + α 2 ] .
  4.  Cς2C   C ≤ ς ≤ 2 C 时,可以求出此时对应上图右边情况靠上的那种直线,所以此时可以求出的可行区间为  [ςC,C][α1+α2C,C]   [ ς − C , C ] , 即 [ α 1 + α 2 − C , C ]
  5.  ς2C   ς ≥ 2 C 时,可行域为空寂,且这种情况也不会发生。

综上所述,当  y1=1y2=1   y 1 = 1 且 y 2 = 1 时,此时的  α2   α 2 可行域在存在的情况下(即不考虑  ς<0ς2C   ς < 0 、 ς ≥ 2 C ),其实可以这样表示它的区间:

[max(0,α1+α2C),min(C,α1+α2)] [ m a x ( 0 , α 1 + α 2 − C ) , m i n ( C , α 1 + α 2 ) ]
 
(2)当  y1=1y2=1   y 1 = − 1 且 y 2 = − 1 时,此时的表达式是  α1+α2=ς   α 1 + α 2 = − ς ,那么首先此时的  ς0   ς ≤ 0 ,此时的各种分类其情况和上面的(1)类似。

(3)当  y1=1y2=1   y 1 = 1 且 y 2 = − 1 时,此时的表达式是  α1α2=ς   α 1 − α 2 = ς ,根据  ς   ς 的不同取值,我们可以分为下面几种情况来求  α2   α 2 的可行域:

  1.  ς>Cς<C   ς > C 或 者 ς < − C 时,此时直线与方形区域没有交点,所以此时  α2   α 2 可行域为空集.
  2.  0<ςC   0 < ς ≤ C 时,此时对应上面的左图中的靠下的那种直线的情况,此时可以计算出  α2[0Cα1+α2]   α 2 的 可 行 域 为 [ 0 , C − α 1 + α 2 ] .
  3.  Cς0   − C ≤ ς ≤ 0 时,此时对应左图中靠上的那种直线的情况,此时可计算出  alpha2[α2α1,C]   a l p h a 2 的 可 行 域 为 [ α 2 − α 1 , C ]

综上所述,  α2[max(0,α1α2),min(C,Cα2+α2)]   α 2 的 可 行 域 为 [ m a x ( 0 , α 1 − α 2 ) , m i n ( C , C − α 2 + α 2 ) ]

(4)当  y1=1y2=1   y 1 = − 1 且 y 2 = 1 时,情况和(3)类似。

我们设  α2   α 2 的可行域为  α2[L,H]   α 2 ∈ [ L , H ] ,结合上述(1)~(4)种情况,我们得出不同情况下  α2   α 2 可行域的边界值L、H:

  1.  y1y2L=max0,αold2αold1H=min(C,C+αold2αold1)   当 y 1 ≠ y 2 时 , L = m a x ( 0 , α 2 o l d − α 1 o l d ) ; H = m i n ( C , C + α 2 o l d − α 1 o l d )
  2.  y1=y2L=max0,αold1+αold2CH=min(C,αold2+αold1)   当 y 1 = y 2 时 , L = m a x ( 0 , α 1 o l d + α 2 o l d − C ) ; H = m i n ( C , α 2 o l d + α 1 o l d )

3. 对  αnew,unclipped2   α 2 n e w , u n c l i p p e d 进行修剪 

   好了,目前为止我们手头上有一元二次函数  W(α2)   W ( α 2 ) 的极值点  αnew,unclipped2   α 2 n e w , u n c l i p p e d ,和  α2   α 2 的可行域的边界值L,H。
   下文根据  α2   α 2 的可行域和一元二次函数  W(α2)   W ( α 2 ) 的开口方向,讨论  W(α2)   W ( α 2 ) 在何处取得最小值,共分为3种情况:

(1)无论一元二次函数  W(α2)   W ( α 2 ) 的开口向上还是向下,只要极值点不在可行域内,该函数的最小值就在可行域的边界值取得,这种情况我们只需要比较  W(L)W(H)   W ( L ) 和 W ( H ) 的大小,然后取小者就是函数的最小值。

(2)如果  W(α2)   W ( α 2 ) 的开口向上,且极值点在可行域内,则函数最小值为极值点。
   
(3)如果  W(α2)   W ( α 2 ) 的开口向下,该函数的最小值就在可行域的边界值取得,这种情况我们只需要比较  W(L)W(H)   W ( L ) 和 W ( H ) 的大小,然后取小者就是函数的最小值。

   综合上述三种情况,就可以对  αnew,unclipped2   α 2 n e w , u n c l i p p e d 进行修剪了,最优解就可以记为  αnew2   α 2 n e w

αnew2=Hαnew,unclipped2Lαnew,unclipped2>HLαnew,unclipped2Hαnew,unclipped2<L α 2 n e w = { H α 2 n e w , u n c l i p p e d > H α 2 n e w , u n c l i p p e d L ≤ α 2 n e w , u n c l i p p e d ≤ H L α 2 n e w , u n c l i p p e d < L

4. 通过  αnew2   α 2 n e w 求解  αnew1   α 1 n e w  

   由  αold1y1+αold2y2=αnew1y1+αnew2y2=ς   α 1 o l d y 1 + α 2 o l d y 2 = α 1 n e w y 1 + α 2 n e w y 2 = ς 得:

αnew1=αold1+y1y2(αold2αnew2)(11) (11) α 1 n e w = α 1 o l d + y 1 y 2 ( α 2 o l d − α 2 n e w )
 


SMO算法两个变量的选择

1.第一个变量的选择

   第一个变量的选择称为外循环,首先遍历整个样本集,选择违反KKT条件的  αi   α i 作为第一个变量,接着依据相关规则选择第二个变量(见下面分析),对这两个变量采用上述方法进行优化。当遍历完整个样本集后,遍历非边界样本集  (0<αi<C)   ( 0 < α i < C ) 中违反KKT的  αi   α i 作为第一个变量,同样依据相关规则选择第二个变量,对此两个变量进行优化。当遍历完非边界样本集后,再次回到遍历整个样本集中寻找,即在整个样本集与非边界样本集上来回切换,寻找违反KKT条件的  αi   α i 作为第一个变量。直到遍历整个样本集后,没有违反KKT条件  αi   α i ,然后退出。
   边界上的样本对应的  αi=0   α i = 0 或者  αi=C   α i = C ,在优化过程中很难变化。然而非边界样本  (0<αi<C)   ( 0 < α i < C ) 会随着对其他变量的优化会有大的变化。
   
这里写图片描述

2.第二个变量的选择

   SMO称第二个变量的选择过程为内循环,假设在外循环中找个第一个变量记为  α1   α 1 ,第二个变量的选择希望能使  α2   α 2 有较大的变化,由于  α1   α 1 是依赖于  |E1E2|   | E 1 − E 2 | ,当  E1   E 1 为正时,那么选择最小的  Ei   E i 作为  E2   E 2 。如果  E1   E 1 为负,选择最大  Ei   E i 作为  E2   E 2 ,通常为每个样本的  Ei   E i 保存在一个列表中,选择最大的  |E1E2|   | E 1 − E 2 | 来近似最大化步长。
   
   有时按照上述的启发式选择第二个变量,不能够使得函数值有足够的下降,这时按下述步骤:

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


计算阈值  bnew   b n e w 、差值  Ei   E i

   每完成对两个变量的优化后,要对b的值进行更新,因为b的值关系到预测值  g(x)   g ( x ) 的计算,即关系到下次优化时  Ei   E i 的计算。 

求解  bnew   b n e w 的4种情况  

   1. 如果  0<αnew1<C   0 < α 1 n e w < C ,由KKT条件  y1(wTx1+b)=1   y 1 ( w T x 1 + b ) = 1 ,且  y2i=1   y i 2 = 1 ,得到  i=1mαiyiKi1+b=yi   ∑ i = 1 m α i y i K i 1 + b = y i ,所有有:

bnew1=y1i=3mαiyiKi1αnew1y1K11αnew2y2K21(12) (12) b 1 n e w = y 1 − ∑ i = 3 m α i y i K i 1 − α 1 n e w y 1 K 11 − α 2 n e w y 2 K 21

将式子(6)代入上式子,得:
bnew1=E1y1K11(αnew1αold1)y2K21(αnew2αold2)+bold(13) (13) b 1 n e w = − E 1 − y 1 K 11 ( α 1 n e w − α 1 o l d ) − y 2 K 21 ( α 2 n e w − α 2 o l d ) + b o l d

   2. 如果  0<αnew2<C   0 < α 2 n e w < C ,则:
bnew2=E2y1K12(αnew1αold1)y2K22(αnew2αold2)+bold(14) (14) b 2 n e w = − E 2 − y 1 K 12 ( α 1 n e w − α 1 o l d ) − y 2 K 22 ( α 2 n e w − α 2 o l d ) + b o l d
   
   3. 如果  α1,α2   α 1 , α 2 同时满足  0<αnewi<C   0 < α i n e w < C ,则:
bnew1=bnew2(15) (15) b 1 n e w = b 2 n e w
    
   4. 如果  α1,α2   α 1 , α 2 同时不满足  0<αnew1,2<C   0 < α 1 , 2 n e w < C ,那么  bnew1   b 1 n e w  bnew2   b 2 n e w 以及它们之间的数都是符合KKT条件的阈值,这时选择它们的中点作为  bnew   b n e w

更新差值  Ei   E i  

   根据式子(4),(6),得到:

Ei=g(xi)yi=j=1mαiyjK(x,xj)+bnewyi(16) (16) E i = g ( x i ) − y i = ∑ j = 1 m α i y j K ( x , x j ) + b n e w − y i
   


SMO算法总结

   输入是m个样本  (x1,y1),(x2,y2),...,(xm,ym)   ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) ,其中  x   x  n   n 维特征向量。y为二元输出,值为+1或-1。精度e.
   输出值是近似解,向量  α   α .
   
   1) 取初值  α0=0,k=0   α 0 = 0 , k = 0  α   α 的上标表示迭代轮数,  k   k 表示当前迭代为第  k   k 轮.
   
   2) 按照上文的方法依次选取两个参数  αk1,αk2   α 1 k , α 2 k ,求出新的  αk+1,unclipped2   α 2 k + 1 , u n c l i p p e d .

αk+1,unclipped2=αk2+y2(E1E2)K11+K222K12 α 2 k + 1 , u n c l i p p e d = α 2 k + y 2 ( E 1 − E 2 ) K 11 + K 22 − 2 K 12
 
   
   3)求出  α2   α 2 可行域的边界值 L,H:
L,H={y1y2L=max0,αk2αk1H=min(C,C+αk2αk1)y1=y2L=max0,αk1+αk2CH=min(C,αk2+αk1) L , H = { 当 y 1 ≠ y 2 时 , L = m a x ( 0 , α 2 k − α 1 k ) ; H = m i n ( C , C + α 2 k − α 1 k ) 当 y 1 = y 2 时 , L = m a x ( 0 , α 1 k + α 2 k − C ) ; H = m i n ( C , α 2 k + α 1 k )

   3)对  αk+1,unclipped2   α 2 k + 1 , u n c l i p p e d 进行修剪:

αk+12=Hαk+1,unclipped2Lαk+1,unclipped2>HLαk+1,unclipped2Hαk+1,unclipped2<L α 2 k + 1 = { H α 2 k + 1 , u n c l i p p e d > H α 2 k + 1 , u n c l i p p e d L ≤ α 2 k + 1 , u n c l i p p e d ≤ H L α 2 k + 1 , u n c l i p p e d < L
   

   4)求出  αk+11   α 1 k + 1

αk+11=αk1+y1y2(αk2αk+12)(17) (17) α 1 k + 1 = α 1 k + y 1 y 2 ( α 2 k − α 2 k + 1 )
 

   5)按照上文的规则,求出  bk+1   b k + 1 ,并更新  Ei   E i

Ei=g(xi)yi=j=1mαiyjK(x,xj)+bk+1yi(18) (18) E i = g ( x i ) − y i = ∑ j = 1 m α i y j K ( x , x j ) + b k + 1 − y i
   
   6)转至步骤2),进入下一轮优化。直到遍历整个样本集后,没有违反KKT条件  αi   α i ,然后退出算法。

   

参考资料

1.支持向量机原理(四)SMO算法原理
2.第三部分:SMO算法的个人理解
3.【机器学习详解】SMO算法剖析

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值