【机器学习入门】一文读懂线性可分支持向量机(一)

一 引言

在机器学习领域,支持向量机(SVM)是一种监督学习模型,用于分类和回归分析。SVM 最初由 Vladimir Vapnik 于 1963 年提出,并在随后的几十年里得到了极大的发展和完善。由于其强大的泛化能力、灵活性以及对高维数据的有效处理,SVM 已经成为许多实际问题中的首选方法之一。

支持向量机(SVM,Support Vecor Machine)是一种二分类算法,在集成学习和深度学习火起来之前支持向量机的使用非常广泛,其分类效果好、适用性广(线性、非线性都可用),功能真的是很棒棒,下来我们就来梳理一下支持向量机的原理。

二 支持向量机原理

2.1 背景

从上一篇文章 【技术干货】一文搞懂感知机算法:从理论到Python实战 中我们可以知道,感知机的目标是找到一个将线性可分的数据一分为二的决策超平面:

如上图所示,决策超平面的一侧为正样本,另一侧为负样本,但是我们可以发现,满足这个特性的决策超平面并不是唯一的,在有限的线性可分样本中,正负样本点之间的间隔使得不同的决策超平面存在,那么如果样本点继续增加,这些决策超平面中那个分类效果最好呢?也就是说谁的泛华效果最好呢?——这就是支持向量机要解决的主要问题,也是支持向量机与感知机的主要区别。

2.2 支持向量

就上面的图来说,主观上看哪个超平面的分类泛化能力最强呢?我们认为红色的那条可能会比较好,这条线距离最近的红点区域和最近的蓝点区域都比较远,无论是红点还是蓝点,再向靠近超平面的方向增加一些点都没问题,还可以被这条超平面分的比较开,那两条虚线就没有这么好的效果,如下图所示,我们新增几个点,可以看出其分类效果的差别:

似乎可以得出这样的结论:超平面离直线两边的数据的间隔越大,对训练集的数据的局限性或噪声有最大的容忍能力,也就是所谓的鲁棒性

所以,如果所有的样本点不只是可以被决策超平面分开,还和超平面保持一定的距离间隔,那么这样的分类超平面是更优的,支持向量机就是要找到使这个间隔最大的决策超平面(即最大化下图中的margin)。训练样本中和这个超平面距离最近的样本点被称为支持向量,如下图虚线所经过的样本点即为支持向量:

2.3 函数间隔与几何间隔

最大化间隔的思想我们大概了解了,不过要最大化这个间隔首先得量化,怎么量化呢?

对于二分类学习,假设现在的数据是线性可分的,这时分类学习最基本的想法就是找到一个合适的超平面,该超平面能够将不同类别的样本分开,类似二维平面使用ax+by+c=0来表示,超平面实际上表示的就是高维的平面,如下图所示:

对数据点进行划分时,易知:当超平面距离与它最近的数据点的间隔越大,分类的鲁棒性越好,即当新的数据点加入时,超平面对这些点的适应性最强,出错的可能性最小。因此需要让所选择的超平面能够最大化这个间隔Gap(如下图所示), 常用的间隔定义有两种,一种称之为函数间隔,一种为几何间隔,下面将分别介绍这两种间隔,并对SVM为什么会选用几何间隔做了一些阐述。

2.3.1 函数间隔

在决策超平面 w T x + b = 0 w^Tx+b=0 wTx+b=0确定的情况下, ∣ w T x + b ∣ |w^Tx+b| wTx+b能够表示点 x x x到超平面的距离远近; w T x + b w^Tx+b wTx+b y y y是否同号能够表示分类是否正确,所以可用 y ( w T x + b ) y(w^Tx+b) y(wTx+b)来表示分类的正确性及确定性,我们在感知机中就有类似的用法,这就是函数间隔的概念,定义函数间隔 γ ′ \gamma^{'} γ为:
γ ′ = y ( w T x + b ) \gamma^{'} = y(w^Tx + b) γ=y(wTx+b)

2.3.2 几何间隔

函数间隔虽然可以表示分类的正确性和确定性,但其缺点是只能在一个确定的超平面 w T x + b = 0 w^Tx+b=0 wTx+b=0下比较样本点到超平面的相对距离,不同参数的超平面条件下计算的距离是不能比较大小的,比如超平面 2 w T x + 2 b = 0 2w^Tx+2b=0 2wTx+2b=0 w T x + b = 0 w^Tx+b=0 wTx+b=0是同一个超平面,样本点与其真实距离没有变化,但是函数距离却翻了一倍,因此我们需要将参数加以约束,使其具备可比性,我们定义几何间隔:
γ = y ( w T x + b ) ∣ ∣ w ∣ ∣ 2 = γ ′ ∣ ∣ w ∣ ∣ 2 \gamma = \frac{y(w^Tx + b)}{||w||_2} = \frac{\gamma^{'}}{||w||_2} γ=∣∣w2y(wTx+b)=∣∣w2γ

可见,几何间隔才是点到超平面的真正距离,对于公式 y i ( w T x i + b ) {{y_i}({w^T}{x_i} + b)} yi(wTxi+b),许多教材中定义了一个专门的概念,那就是函数距离,当参数 w w w b b b固定时,点与超平面间的间隔越大,函数间隔越大。但函数间隔有一个不好的地方,当参数 w w w b b b按比例缩放时,所描述的超平面不会发生变化,但是函数距离却会跟着按比例缩放。为了克服这一不足,我们可以将函数距离固定为一个确定值,例如缩放到函数距离为1,这样求解出来的 w w w b b b虽然不是原来的 w w w b b b,但是所确定的超平面却是一样的,所以并不会对我们求解支持向量机最优超平面造成影响。那么,几何间隔就再次化简为: max ⁡ 1 ∥ w ∥ \max \frac{1}{{\left\| w \right\|}} maxw1

因为我们刚假设支持向量到超平面的函数距离为1,所以,对于数据集中任意样本到超平面的函数距离都至少为1,求解时必须考虑上这一约束条件。另外,最大化 1 ∥ w ∥ \frac{1}{{\left\| w \right\|}} w1和最小化 1 2 ∥ w ∥ 2 {\frac{1}{2}{{\left\| w \right\|}^2}} 21w2是等价的,所以,支持向量机最大化间隔可以表示为如下优化问题:
min ⁡ w , b 1 2 ∥ w ∥ 2 s . t .   y i ( w T x i + b ) ⩾ 1 ,   i = 1 , 2 , ⋯   , N \mathop {\min }\limits_{w,b}\frac{1}{2}{\left\| w \right\|^2} \\ s.t.{\text{ }}{y_i}({w^T}{x_i} + b) \geqslant 1,{\text{ }}i = 1,2, \cdots ,N w,bmin21w2s.t. yi(wTxi+b)1, i=1,2,,N

2.4 线性可分支持向量机

综合上述内容可知,线性可分支持向量机可以表示为:
f ( x ) = s i g n ( w ∗ x + b ∗ ) f(x)=sign(w^*x+b^*) f(x)=sign(wx+b)
式中, w ∗ x + b ∗ = 0 w^*x+b^*=0 wx+b=0为与支持向量间隔最大化的分类超平面,可见与感知机是基本一样的,就多了个间隔最大化的要求。

三 支持向量机模型求解

3.1 目标函数

通过上述已知,支持向量机是要最大化支持向量与决策超平面之间的几何间隔,所以目标函数为:
max ⁡ w , b      γ = y ( w T x + b ) ∣ ∣ w ∣ ∣ 2      s . t      y i ( w T x i + b ) ∣ ∣ w ∣ ∣ 2 ≥ γ , i = 1 , 2 , . . . m \max_{w,b} \;\; \gamma = \frac{y(w^Tx + b)}{||w||_2} \;\; s.t \;\; \frac{y_i(w^Tx_i + b)}{||w||_2} \geq \gamma ,i =1,2,...m w,bmaxγ=∣∣w2y(wTx+b)s.t∣∣w2yi(wTxi+b)γ,i=1,2,...m
这个式子表示,最大化训练样本与超平面的几何间隔 γ \gamma γ,同时要保证约束条件每个训练样本与超平面的几何距离不小于 γ \gamma γ,目标函数可以改写为:
max ⁡ w , b      γ = γ ′ ∣ ∣ w ∣ ∣ 2      s . t      y i ( w T x i + b ) ≥ γ ′ , i = 1 , 2 , . . . m \max_{w,b} \;\; \gamma=\frac{\gamma^{'}}{||w||_2}\;\; s.t \;\; y_i(w^Tx_i + b) \geq \gamma^{'} ,i =1,2,...m w,bmaxγ=∣∣w2γs.tyi(wTxi+b)γ,i=1,2,...m
一般我们都取函数间隔 γ ′ \gamma^{'} γ为1,为什么呢,因为 γ ′ \gamma^{'} γ的取值不影响最优化问题的解,假设 γ ′ \gamma^{'} γ不为1,就相当于 w w w b b b变为了 γ ′ w \gamma^{'}w γw γ ′ b \gamma^{'}b γb,对目标函数和约束不等式都没有影响,都是可以约掉的,所以 γ ′ \gamma^{'} γ为1完全没问题,此时最优化问题变为:
max ⁡ w , b      1 ∣ ∣ w ∣ ∣ 2      s . t      y i ( w T x i + b ) ≥ 1 , i = 1 , 2 , . . . m \max_{w,b} \;\; \frac{1}{||w||_2} \;\; s.t \;\; y_i(w^Tx_i + b) \geq 1 ,i =1,2,...m w,bmax∣∣w21s.tyi(wTxi+b)1,i=1,2,...m
可以转变为:
min ⁡ w , b      1 2 ∣ ∣ w ∣ ∣ 2 2      s . t      y i ( w T x i + b ) ≥ 1 , i = 1 , 2 , . . . m \min_{w,b} \;\; \frac{1}{2}||w||_2^2 \;\; s.t \;\; y_i(w^Tx_i + b) \geq 1 ,i =1,2,...m w,bmin21∣∣w22s.tyi(wTxi+b)1,i=1,2,...m
(有的地方说要最大化margin同时保证两类的支持向量到超平面的距离相等,所以有 m a x 2 ∣ ∣ w ∣ ∣ 2 max\frac{2}{||w||_2} max∣∣w22,个人认为这个解释很牵强,明明优化 γ \gamma γ的过程中两类就会互相博弈找到这个最优的超平面)根据下面定义的描述发现,这个凸最优化问题是一个凸二次规划问题(convex quadratic programming)。

目标函数和约束条件都为变量的线性函数——线性规划问题;
目标函数为变量的二次函数和约束条件为变量的线性函数——二次规划问题;
目标函数和约束条件都为非线性函数——非线性规划问题。

3.2 对偶问题转化及求解

在感知机中我们说过,利用对偶问题可以从不同角度看待同一个问题,可能会引入新的参数来帮助我们优化,在约束最优化问题中,常常利用拉格朗日对偶性(Lagrange duality)将原始问题转换为对偶问题,通过解对偶问题得到原始问题的解。

首先我们的优化目标函数可以使用拉格朗日乘子法转变成拉格朗日函数:
L ( w , b , λ ) = 1 2 ∣ ∣ w ∣ ∣ 2 2 + ∑ i m λ i [ 1 − y i ( w T x i + b ) ] ,    λ i ≥ 0 L(w,b,\lambda)= \frac{1}{2}||w||_2^2 +\sum_i^m \lambda_i [1-y_i(w^Tx_i + b)], \; \lambda_i\geq0 L(w,b,λ)=21∣∣w22+imλi[1yi(wTxi+b)],λi0
目标函数的优化转变为:
min ⁡ w , b    max ⁡ λ    L ( w , b , λ ) \min_{w,b}\;\max_{\lambda}\; L(w,b,\lambda) w,bminλmaxL(w,b,λ)
这一步是什么意思呢,因为约束不等式 1 − y i ( w T x i + b ) ≤ 0 , λ i ≥ 0 1-y_i(w^Tx_i + b)\leq 0,\lambda_i\geq 0 1yi(wTxi+b)0,λi0,所以加号后面整体小于等于0,只有当其取最大值是为0,此时 max ⁡ λ    L ( w , b , λ ) = 1 2 ∣ ∣ w ∣ ∣ 2 2 \max_{\lambda}\; L(w,b,\lambda)= \frac{1}{2}||w||_2^2 maxλL(w,b,λ)=21∣∣w22,即为原目标函数,这个变形称为广义拉格朗日函数的极小极大问题,它与原问题是完全等价的,在对偶性中,这个问题被称为原始问题(Primal problem)

这个优化函数满足KKT条件,可以实现强对偶,即可以通过**拉格朗日对偶(Lagrange duality)**将其转化为等价的对偶问题:
max ⁡ λ    min ⁡ w , b    L ( w , b , λ ) \max_{\lambda}\;\min_{w,b}\; L(w,b,\lambda) λmaxw,bminL(w,b,λ)
所以我们可以先求优化函数极小值对应的 w w w b b b,再求的极大值对应的拉格朗日乘子系数 λ \lambda λ
∂ L ∂ w = 0    → w + ∑ i m λ i y i x i = 0    → w = ∑ i = 1 m λ i y i x i \frac{\partial L}{\partial w} = 0 \;\rightarrow w+\sum_i^m \lambda_iy_ix_i=0 \;\rightarrow w = \sum_{i=1}^{m}\lambda_iy_ix_i wL=0w+imλiyixi=0w=i=1mλiyixi

∂ L ∂ b = 0    → ∑ i m λ i y i = 0 \frac{\partial L}{\partial b} = 0 \;\rightarrow \sum_i^m \lambda_iy_i=0 bL=0imλiyi=0

优化函数取得极小值时, w w w可以用 λ \lambda λ,而 b b b无所谓,取什么值都不影响优化函数取得极小值,所以可得:
J ( λ ) = min ⁡ w , b    L ( w , b , λ ) = 1 2 ∣ ∣ w ∣ ∣ 2 2 + ∑ i m λ i [ 1 − y i ( w T x i + b ) ] = 1 2 w T w − ∑ i = 1 m λ i y i w T x i − ∑ i = 1 m λ i y i b + ∑ i = 1 m λ i = 1 2 ∑ i = 1 m ( λ i y i x i ) T ∑ i = 1 m λ i y i x i − ( λ i y i x i ) T ∑ i = 1 m λ i y i x i − ∑ i = 1 m λ i y i b + ∑ i = 1 m λ i = − 1 2 ∑ i = 1 m ( λ i y i x i ) T ∑ i = 1 m λ i y i x i − b ∑ i = 1 m λ i y i + ∑ i = 1 m λ i = − 1 2 ∑ i = 1 m λ i y i x i T ∑ i = 1 m λ i y i x i + ∑ i = 1 m λ i = − 1 2 ∑ i = 1 , j = 1 m λ i y i x i T λ j y j x j + ∑ i = 1 m λ i \begin{align} J(\lambda)&=\min_{w,b}\; L(w,b,\lambda)\\&= \frac{1}{2}||w||_2^2 +\sum_i^m \lambda_i [1-y_i(w^Tx_i + b)]\\ &= \frac{1}{2}w^Tw-\sum_{i=1}^{m}\lambda_iy_iw^Tx_i - \sum_{i=1}^{m}\lambda_iy_ib + \sum_{i=1}^{m}\lambda_i\\ &= \frac{1}{2}\sum_{i=1}^{m}(\lambda_iy_ix_i)^T\sum_{i=1}^{m}\lambda_iy_ix_i-(\lambda_iy_ix_i)^T\sum_{i=1}^{m}\lambda_iy_ix_i- \sum_{i=1}^{m}\lambda_iy_ib + \sum_{i=1}^{m}\lambda_i\\ &=-\frac{1}{2}\sum_{i=1}^{m}(\lambda_iy_ix_i)^T\sum_{i=1}^{m}\lambda_iy_ix_i- b\sum_{i=1}^{m}\lambda_iy_i + \sum_{i=1}^{m}\lambda_i\\ &=-\frac{1}{2}\sum_{i=1}^{m}\lambda_iy_ix_i^T\sum_{i=1}^{m}\lambda_iy_ix_i+ \sum_{i=1}^{m}\lambda_i\\ &=-\frac{1}{2}\sum_{i=1,j=1}^{m}\lambda_iy_ix_i^T\lambda_jy_jx_j+ \sum_{i=1}^{m}\lambda_i \end{align} J(λ)=w,bminL(w,b,λ)=21∣∣w22+imλi[1yi(wTxi+b)]=21wTwi=1mλiyiwTxii=1mλiyib+i=1mλi=21i=1m(λiyixi)Ti=1mλiyixi(λiyixi)Ti=1mλiyixii=1mλiyib+i=1mλi=21i=1m(λiyixi)Ti=1mλiyixibi=1mλiyi+i=1mλi=21i=1mλiyixiTi=1mλiyixi+i=1mλi=21i=1,j=1mλiyixiTλjyjxj+i=1mλi
J ( λ ) J(\lambda) J(λ)完全是关于参数 λ \lambda λ的函数,因此:
max ⁡ λ    min ⁡ w , b    L ( w , b , λ ) = max ⁡ λ    J ( λ ) = max ⁡ λ    − 1 2 ∑ i = 1 , j = 1 m λ i y i x i T λ j y j x j + ∑ i = 1 m λ i \max_{\lambda}\;\min_{w,b}\; L(w,b,\lambda)=\max_{\lambda}\;J(\lambda)=\max_{\lambda}\;-\frac{1}{2}\sum_{i=1,j=1}^{m}\lambda_iy_ix_i^T\lambda_jy_jx_j+ \sum_{i=1}^{m}\lambda_i λmaxw,bminL(w,b,λ)=λmaxJ(λ)=λmax21i=1,j=1mλiyixiTλjyjxj+i=1mλi

s . t . ∑ i m λ i y i = 0 ,    λ i ≥ 0 s.t. \sum_i^m \lambda_iy_i=0,\;\lambda_i\geq0 s.t.imλiyi=0,λi0

转化为:
min ⁡ λ    1 2 ∑ i = 1 , j = 1 m λ i y i x i T λ j y j x j − ∑ i = 1 m λ i \min_{\lambda}\;\frac{1}{2}\sum_{i=1,j=1}^{m}\lambda_iy_ix_i^T\lambda_jy_jx_j-\sum_{i=1}^{m}\lambda_i λmin21i=1,j=1mλiyixiTλjyjxji=1mλi

s . t . ∑ i m λ i y i = 0 ,    λ i ≥ 0 s.t. \sum_i^m \lambda_iy_i=0,\;\lambda_i\geq0 s.t.imλiyi=0,λi0

求出上式取得极小值时对应的 λ \lambda λ向量就可以求出 w w w b b b了,这里一般需要用到SMO(Sequential Minimal Optimization,序列最小优化算法) 算法,还是比较复杂的,下面来看看怎么做。

3.3 序列最小优化算法(SMO)

上述最优化问题是要求解 m m m个参数 ( λ 1 , λ 2 , λ 3 , . . . , λ m ) (λ_1,λ_2,λ_3,...,λ_m) (λ1,λ2,λ3,...,λm),其他参数均为已知,有多种算法可以对上述问题求解,比如之前介绍过的次梯度下降应该就可以,但是算法复杂度均很大。序列最小最优化算法(SMO)可以高效的求解上述SVM问题,它把原始求解N个参数二次规划问题分解成很多个子二次规划问题分别求解,每个子问题只需要求解两个参数,方法类似于坐标上升,节省时间成本和降低了内存需求。每次启发式选择两个变量进行优化,不断循环,直到达到函数最优值。

为什么每次优化两个参数呢?像坐标下降不是每次只优化一个参数吗?因为我们这里有个约束, ∑ i m λ i y i = 0 \sum_i^m \lambda_iy_i=0 imλiyi=0,如果认为m-1个都是固定值,那么剩下的那个也就确定了,所以选择每次优化两个。因为SMO比较复杂,本篇文章就不细说了,这里先这样提一下SMO,大家知道上面的优化是用SMO计算的就好。

使用SMO算法,我们得到了 max ⁡ λ    J ( λ ) \max_{λ}\;J(λ) maxλJ(λ)对应的 λ ∗ λ^* λ,所以:
w = ∑ i = 1 m λ i ∗ y i x i w = \sum_{i=1}^{m}λ_i^*y_ix_i w=i=1mλiyixi
因为对支持向量有: y i ( w T x i + b ) = 1 y_i(w^Tx_i+b)=1 yi(wTxi+b)=1,所以要根据这个等式解出 b b b需要将支持向量样本点代入,怎么获得支持向量呢?KKT条件中的对偶互补条件 λ i ( y i ( w T x i + b ) − 1 ) = 0 λ_i(y_i(w^Tx_i+b)−1)=0 λi(yi(wTxi+b)1)=0,我们已经求出了 λ ∗ λ^* λ,如果 λ i > 0 λ_i>0 λi>0则有 y i ( w T x i + b ) = 1 y_i(w^Tx_i+b)=1 yi(wTxi+b)=1 ,即样本点为支持向量,求解 b b b
y i 2 ( w T x i + b ) = y i y_i^2(w^Tx_i+b)=y_i yi2(wTxi+b)=yi

b = y i − w T x i = y i − ∑ i = 1 m λ i ∗ y i x i T x i b=y_i-w^Tx_i= y_i-\sum_{i=1}^{m}λ_i^*y_ix_i^Tx_i b=yiwTxi=yii=1mλiyixiTxi

显然,支持向量大多不止一个,对线性可分支持向量机来说,可以证明分类超平面是存在且唯一的, b b b的解也就只有一个,此时用不同的支持向量求出来的 b b b都是相同的,如果数据有噪声,并不是完全线性可分的,那么为了增加模型的鲁棒性, b b b取所有值的平均值,即假设有n个支持向量,则:
b = 1 n ∑ i n ( y i − w T x i ) b=\frac{1}{n}\sum_i^n (y_i-w^Tx_i) b=n1in(yiwTxi)
至此,线性可分支持向量机的模型参数就求出来了,模型也就确定了。

四 线性可分支持向量机算法流程

综合以上全部内容,可以得到线性可分支持向量机的算法流程:

  • **输入:**线性可分的样本 T = ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) T=(x_1,y_1),(x_2,y_2),...,(x_m,y_m) T=(x1,y1),(x2,y2),...,(xm,ym) x x x n n n维特征向量, y ∈ [ + 1 , − 1 ] y\in[+1,-1] y[+1,1]
  • 输出: w , b w,b w,b,支持向量机模型 f ( x ) = s i g n ( w T x + b ) f(x)=sign(w^Tx+b) f(x)=sign(wTx+b)
  1. 确定目标函数:

min ⁡ λ    1 2 ∑ i = 1 , j = 1 m λ i y i x i T λ j y j x j − ∑ i = 1 m λ i \min_{\lambda}\;\frac{1}{2}\sum_{i=1,j=1}^{m}\lambda_iy_ix_i^T\lambda_jy_jx_j-\sum_{i=1}^{m}\lambda_i λmin21i=1,j=1mλiyixiTλjyjxji=1mλi

s . t . ∑ i m λ i y i = 0 ,    λ i ≥ 0 s.t. \sum_i^m \lambda_iy_i=0,\;\lambda_i\geq0 s.t.imλiyi=0,λi0

  1. 使用SMO优化目标函数,得到对应的 λ ∗ λ^* λ

  2. 根据 λ ∗ λ^* λ找到样本中的共k=1个支持向量,计算参数 w , b w,b w,b

w ∗ = ∑ i = 1 m λ i ∗ y i x i w^* = \sum_{i=1}^{m}λ_i^*y_ix_i w=i=1mλiyixi

b ∗ = 1 k ∑ i k ( y i − w T x i ) b^*=\frac{1}{k}\sum_i^k (y_i-w^Tx_i) b=k1ik(yiwTxi)

  1. 得到支持向量机模型 f ( x ) = s i g n ( w ∗ T x + b ∗ ) f(x)=sign(w^{*T}x+b^*) f(x)=sign(wTx+b)

五 总结

本文总结了在数据集线性可分情况下,使用支持向量机算法进行分类的思想——硬间隔最大化。然而,在多数应用中,数据集并非线性可分,如果只是在分类边界附近少数点造成线性不可分,这种情况下需要在硬间隔最大化目标函数基础上,引入松弛变量和惩罚因子,然后通过拉格朗日对偶性求解,这种方法称为软间隔最大化。如果大量样本线性不可分,则需要引入核技巧,往高维空间映射,转化为线性可分。对于这两部分内容,在后续博客中在总结了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大数据AI

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

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

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

打赏作者

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

抵扣说明:

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

余额充值