回归和分类的线性模型

由于后面会有专门的一章来讲贝叶斯理论下的模型推导,故本章的所有推导将仅限于最大似然理论。需要掌握的内容可以简单的罗列为:

  • 回归:线性回归模型(损失函数及其求解);
  • 回归:判别式模型、概率生成式模型、概率判别式模型。

由于不涉及贝叶斯理论的模型都比较容易推导,故忽略了一些公式的具体推导。而对于一些重要的推导,我们用引用格式作为补充,如下所示:

written by XDU微积冯

如果不感兴趣或者已经了解的,可以自动忽略这些补充。

1. 回归的线性模型

重点掌握式(3)(6)(11),以及最优解w的表达式(会推导最好)。

1.1 线性回归的输入和损失函数的定义

设单个数据表示为 x = { x 1 , x 2 , . . . , x D } ∈ R D \pmb{x}=\{x_1,x_2,...,x_D\}\in\R^D xxx={x1,x2,...,xD}RD,数据集 X = { x 1 , . . . , x N } X=\{\pmb{x_1},...,\pmb{x_N} \} X={x1x1x1,...,xNxNxN},目标变量 t = { t 1 , . . . , t N } \pmb{t}=\{t_1,...,t_N \} ttt={t1,...,tN}则用简单的线性回归,预测值可以表示为:
y ( x , w ) = w 0 + w 1 x 1 + . . . + w D x D = w 0 + ∑ i = 1 D w i x i = w T x (1) y(\pmb{x},\pmb{w}) = w_0+w_1x_1+...+w_Dx_D = w_0+\sum_{i=1}^Dw_ix_i=\pmb{w}^T\pmb{x} \tag{1} y(xxx,www)=w0+w1x1+...+wDxD=w0+i=1Dwixi=wwwTxxx(1)
由于简单的变量线性组合会给模型造成局限性,我们引入基函数 ϕ ( x ) \phi(\pmb{x}) ϕ(xxx),将多个基函数进行线性组合,有:
y ( x , w ) = w 0 + ∑ i = 1 M − 1 w i ϕ i ( x ) = ∑ j = 0 M − 1 w j ϕ j ( x ) = w T ϕ ( x ) (2) y(\pmb{x},\pmb{w}) = w_0+\sum_{i=1}^{M-1}w_i\phi_i(\pmb{x}) = \sum_{j=0}^{M-1}w_j\phi_j(\pmb{x}) =\pmb{w}^T\pmb{\phi}(\pmb{x}) \tag{2} y(xxx,www)=w0+i=1M1wiϕi(xxx)=j=0M1wjϕj(xxx)=wwwTϕϕϕ(xxx)(2)
其中 ϕ ∈ R M \pmb{\phi}\in \R^M ϕϕϕRM。式(2)将作为模型方程在下文中应用。

对于损失函数,我们采用平方和损失
E D ( w ) = 1 2 ∑ n = 1 N ( t n − y ( w , x n ) ) = 1 2 ∑ n = 1 N ( t n − w T ϕ ( x n ) ) 2 (3) E_D(\pmb{w}) = \frac{1}{2}\sum_{n=1}^N(t_n-y(\pmb{w},\pmb{x}_n))=\frac{1}{2}\sum_{n=1}^N(t_n-\pmb{w}^T\pmb{\phi}(\pmb{x_n}))^2 \tag{3} ED(www)=21n=1N(tny(www,xxxn))=21n=1N(tnwwwTϕϕϕ(xnxnxn))2(3)

我们可以用最大似然的理论解释平方和损失,首先我们假设目标变量 t t t由确定的函数 y ( x , w ) y(\pmb{x},\pmb{w}) y(xxx,www)给出,并添加一个均值为0,方差为 β − 1 \beta^{-1} β1的高斯噪声 ϵ \epsilon ϵ,即
t = y ( x , w ) + ϵ = N ( t ∣ y ( x , w ) , β − 1 ) (4) t = y(\pmb{x},\pmb{w})+\epsilon = \mathcal{N}(t|y(\pmb{x},\pmb{w}),\beta^{-1}) \tag{4} t=y(xxx,www)+ϵ=N(ty(xxx,www),β1)(4)
我们构造似然函数:
ln ⁡ p ( t ∣ X , w , β ) = ln ⁡ ∏ n = 1 N N ( t n ∣ y ( x n , w ) , β − 1 ) = − β 2 ∑ n = 1 N { t n − w T ϕ ( x n ) } 2 − N 2 ln ⁡ ( 2 π ) + N 2 ln ⁡ β = − β E D ( w ) − N 2 ln ⁡ ( 2 π ) + N 2 ln ⁡ β (5) \begin{aligned} \ln p(\pmb{t}|X,\pmb{w},\beta) &= \ln \prod_{n=1}^N\mathcal{N}(t_n|y(\pmb{x}_n,\pmb{w}),\beta^{-1})\\ &= -\frac{\beta}{2}\sum_{n=1}^N \{t_n-\pmb{w}^T\pmb{\phi}(\pmb{x}_n) \}^2-\frac{N}{2}\ln(2\pi) + \frac{N}{2}\ln \beta\\ &= -\beta E_D(\pmb{w}) -\frac{N}{2}\ln(2\pi) + \frac{N}{2}\ln\beta \end{aligned}\tag{5} lnp(tttX,www,β)=lnn=1NN(tny(xxxn,www),β1)=2βn=1N{tnwwwTϕϕϕ(xxxn)}22Nln(2π)+2Nlnβ=βED(www)2Nln(2π)+2Nlnβ(5)
可以看到与参数 w w w相关的项即为平方和损失表达式。

1.2 线性回归的最优参数

由于平方和损失代表了似然函数中与 w w w有关的项,故我们直接对平方和损失求偏导:
∇ ln ⁡ p ( t ∣ X , w , β ) = − β ∑ n = 1 N { t n − w T ϕ ( x n ) } ϕ ( x n ) T (6) \nabla\ln p(\pmb{t}|X,\pmb{w},\beta) = -\beta\sum_{n=1}^N\{t_n-\pmb{w}^T\pmb{\phi}(\pmb{x}_n) \}\pmb{\phi}(\pmb{x}_n)^T \tag{6} lnp(tttX,www,β)=βn=1N{tnwwwTϕϕϕ(xxxn)}ϕϕϕ(xxxn)T(6)
我们令偏导为零,可以得到:
0 = ∑ n = 1 N t n ϕ ( x n ) − w T ∑ n = 1 N ϕ ( x n ) ϕ ( x n ) T (7) 0 = \sum_{n=1}^N t_n\pmb{\phi}(\pmb{x}_n) - \pmb{w}^T\sum_{n=1}^N \pmb{\phi}(\pmb{x}_n)\pmb{\phi}(\pmb{x}_n)^T \tag{7} 0=n=1Ntnϕϕϕ(xxxn)wwwTn=1Nϕϕϕ(xxxn)ϕϕϕ(xxxn)T(7)
求解得:
w M A P = ( Φ T Φ ) − 1 Φ t if 不使用基函数 ϕ , w M A P = ( X T X ) − 1 X t (8) \pmb{w}_{MAP} = (\pmb{\Phi}^T\pmb{\Phi})^{-1}\pmb{\Phi}\pmb{\text{t}}\\ \text{if 不使用基函数}\phi,\quad \pmb{w}_{MAP}=(X^TX)^{-1}X\pmb{t} \tag{8} wwwMAP=(ΦΦΦTΦΦΦ)1ΦΦΦtttif 不使用基函数ϕ,wwwMAP=(XTX)1Xttt(8)
这里 Φ ∈ R N × M \pmb{\Phi}\in \R^{N\times M} ΦΦΦRN×M,具体含义很好理解,这里不再赘述。

这里如果使用飞桨PPT中的平均平方和损失,是不能得出式(8)的结果的,由于存在m,这里提出更正。

在飞桨中,还使用梯度下降方法迭代得到最优的权重参数 w w w,我们可以看一下它的表达式:
w j = w j − α 1 N ∑ i = 1 M ( y ( x i , w ) − t i ) ⋅ x i (9) w_j = w_j - \alpha\frac{1}{N}\sum_{i=1}^M(y(\pmb{x}_i,\pmb{w})-t_i)\cdot x_i \tag{9} wj=wjαN1i=1M(y(xxxi,www)ti)xi(9)
最终应该可以迭代出和式(8)相同的结果。

1.3 正则化损失函数

为控制最大似然方法带来的过拟合,我们在损失函数中加入正则化项,如
E ( w ) = ∑ n = 1 N { t n − w T ϕ ( x n ) } 2 + λ 2 w T w (10) E(\pmb{w}) = \sum_{n=1}^N \{t_n-\pmb{w}^T\pmb{\phi}(\pmb{x}_n) \}^2 + \frac{\lambda}{2}\pmb{w}^T\pmb{w}\tag{10} E(www)=n=1N{tnwwwTϕϕϕ(xxxn)}2+2λwwwTwww(10)
类似于式(7),我们对上式对 w w w求偏导,有
− ∑ n = 1 N t n ϕ ( x n ) + w T ∑ n = 1 N ϕ ( x n ) ϕ ( x n ) T + λ w = 0 (11) -\sum_{n=1}^Nt_n\pmb{\phi}(\pmb{x}_n) + \pmb{w}^T\sum_{n=1}^N \pmb{\phi}(\pmb{x}_n)\pmb{\phi}(\pmb{x}_n)^T + \lambda\pmb{w} = 0\tag{11} n=1Ntnϕϕϕ(xxxn)+wwwTn=1Nϕϕϕ(xxxn)ϕϕϕ(xxxn)T+λwww=0(11)
可得
w M A P = ( λ I + Φ T Φ ) − 1 Φ t (12) \pmb{w}_{MAP} = (\lambda\pmb{I} + \pmb{\Phi}^T\pmb{\Phi})^{-1}\pmb{\Phi}\pmb{\text{t}} \tag{12} wwwMAP=(λIII+ΦΦΦTΦΦΦ)1ΦΦΦttt(12)
相应地,梯度下降时也需要考虑正则化项
w j = w j o l d − α { 1 N ∑ i = 1 N ( y ( x i , w ) − t i ) ⋅ x i + λ N w j o l d } (13) w_j = w_j^{old} - \alpha\{\frac{1}{N}\sum_{i=1}^N(y(\pmb{x}_i,\pmb{w})-t_i)\cdot\pmb{x}_i+\frac{\lambda}{N}w_j^{old} \}\tag{13} wj=wjoldα{N1i=1N(y(xxxi,www)ti)xxxi+Nλwjold}(13)

2. 分类的线性模型

2.1 判别式模型(构造判别函数)

2.1.1 简单的线性函数

考虑二分类问题,设类别为 C 1 , C 2 C_1,C_2 C1,C2,我们使用最简单的线性函数:
y ( x ) = w T x + w 0 (14) y(\pmb{x}) = \pmb{w}^T\pmb{x}+w_0\tag{14} y(xxx)=wwwTxxx+w0(14)
我们设当 y ( x ) ≥ 0 y(\pmb{x})\geq 0 y(xxx)0 x \pmb{x} xxx属于 C 1 C_1 C1,反之属于 C 2 C_2 C2。因此决策边界由 y ( x ) = 0 y(\pmb{x})=0 y(xxx)=0确定,其中 w \pmb{w} www确定了决策面的方向。

  • 原点到决策面的距离可以由下图中的公式计算:

在这里插入图片描述

我们考虑任何一点 x \pmb{x} xxx和它在决策面上的投影 x ⊥ \pmb{x}_\bot xxx,有
x = x ⊥ + r w ∥ w ∥ (15) \pmb{x} = \pmb{x}_\bot + r\frac{\pmb{w}}{\lVert \pmb{w}\rVert}\tag{15} xxx=xxx+rwwwwww(15)
左右同乘 w T \pmb{w}^T wwwT,再加上 w 0 w_0 w0,可以得到点到直线距离公式:
y ( x ) = r ∥ w ∥ r = y ( x ) ∥ w ∥ (16) y(\pmb{x}) = r \lVert \pmb{w}\rVert\\ r = \frac{y(\pmb{x})}{\Vert \pmb{w}\Vert}\tag{16} y(xxx)=rwwwr=wwwy(xxx)(16)

现在我们再考虑多分类问题。在多分类问题中判别函数的设计可以是"一对其他"(即分类结果是属于该类或不属于该类)、“一对一”(即每次取两类,分类结果是两类中的一个),这样的两种设计会造成有空间无法判断类别的情况。于是我们采用K类判别函数,避免上述情况发生:
y k ( x ) = w k T x + w k 0 (17) y_k(\pmb{x}) = \pmb{w}_k^T\pmb{x} + w_{k0}\tag{17} yk(xxx)=wwwkTxxx+wk0(17)
判别条件为
if y k ( x ) > y i ( x ) , ∀ i ≠ k , then  x ∈ C k (18) \text{if} \qquad y_k(\pmb{x})>y_i(\pmb{x}),\quad\forall i\neq k,\qquad \text{then } \pmb{x}\in C_k \tag{18} ifyk(xxx)>yi(xxx),i=k,then xxxCk(18)
任意两类的决策面为
( w k − w j ) T x + ( w k 0 − w j 0 ) = 0 (19) (\pmb{w}_k-\pmb{w}_j)^T\pmb{x} + (w_{k0}-w_{j0}) = 0\tag{19} (wwwkwwwj)Txxx+(wk0wj0)=0(19)

2.1.2 最小平方方法(求解2.1.1)

我们还是使用K类判别函数式(17)作为判别函数,那么对于每个数据 x \pmb{x} xxx,都会有K个判别函数,我们将其组合在一起,有:
y ( x ) = W ~ T x ~ (20) \pmb{y}(\pmb{x}) = \tilde W^T \tilde{\pmb{x}}\tag{20} yyy(xxx)=W~Txxx~(20)
其中 W ~ ∈ R K × ( D + 1 ) \tilde{W}\in \R^{K\times (D+1)} W~RK×(D+1),D+1表示的 x ~ = ( x , 1 ) \tilde{\pmb{x}}=(\pmb{x},1) xxx~=(xxx,1)的维度。

另外,我们再设 X ~ ∈ R N × ( D + 1 ) \tilde X\in \R^{N\times (D+1)} X~RN×(D+1)中第i行代表数据 x i \pmb{x}_i xxxi T ∈ R N T\in\R^{N} TRN代表所有目标变量(即输出集合)。则根据平方和损失公式,我们有
E D ( W ~ ) = 1 2 Tr { ( X ~ W ~ − T ) T ( X ~ W ~ − T ) } (21) E_D(\tilde{W}) = \frac{1}{2}\text{Tr}\{(\tilde X\tilde{W}-T)^T(\tilde X\tilde W-T) \}\tag{21} ED(W~)=21Tr{(X~W~T)T(X~W~T)}(21)
类似于式(8),我们得到最优解
W ~ = ( X ~ T X ~ ) − 1 X ~ T = X ~ † T (22) \tilde W = (\tilde X^T\tilde X)^{-1}\tilde XT = \tilde X^{\dagger}T\tag{22} W~=(X~TX~)1X~T=X~T(22)
其中 X ~ † \tilde X^{\dagger} X~被称为伪逆矩阵。

2.1.3 感知器算法

感知器算法是二分类模型。设有两个类别 C 1 , C 2 C_1,C_2 C1,C2,目标变量分别为+1,-1,则其判别函数形式为
y ( x ) = f ( w T ϕ ( x ) ) (23) y(\pmb{x}) = f(\pmb{w}^T\pmb{\phi}(\pmb{x})) \tag{23} y(xxx)=f(wwwTϕϕϕ(xxx))(23)
其中非线性激活函数 f f f满足:
f ( a ) = { + 1 , a ≥ 0 − 1 , a < 0 (24) f(a) = \begin{cases} +1,\quad a\geq 0\\ -1,\quad a< 0 \end{cases} \tag{24} f(a)={+1,a01,a<0(24)
现在,我们使用感知器准则来得出它的损失函数:设 t = + 1 t=+1 t=+1表示类别 C 1 C_1 C1 t = − 1 t=-1 t=1表示类别 C 2 C_2 C2,由(2)可得
w T ϕ ( x n ) t n ≥ 0 , ∀ n = 1 , 2 , . . . , N (25) \pmb{w}^T\pmb{\phi}(\pmb{x}_n)t_n\geq 0,\quad \forall n=1,2,...,N\tag{25} wwwTϕϕϕ(xxxn)tn0,n=1,2,...,N(25)
于是感知器准则将分类正确的样本,给予损失为0,若分类错误,即 w T ϕ ( x n ) t n < 0 \pmb{w}^T\pmb{\phi}(\pmb{x}_n)t_n< 0 wwwTϕϕϕ(xxxn)tn<0,损失为 − w T ϕ ( x n ) t n -\pmb{w}^T\pmb{\phi}(\pmb{x}_n)t_n wwwTϕϕϕ(xxxn)tn,于是损失为:
E P ( w ) = − ∑ n ∈ M w T ϕ ( x n ) t n (26) E_P(\pmb{w}) = -\sum_{n\in \mathcal{M}}\pmb{w}^T\pmb{\phi}(\pmb{x}_n)t_n \tag{26} EP(www)=nMwwwTϕϕϕ(xxxn)tn(26)
其中 M \mathcal{M} M表示错分的样本集。我们可以对误差函数(26)使用梯度下降法更新:
w τ + 1 = w τ − η ∇ E P ( w ) = w τ + η   ϕ n t n (27) \pmb{w}^{\tau+1} = \pmb{w}^{\tau}-\eta\nabla E_P(\pmb{w}) = \pmb{w}^{\tau} + \eta\ \pmb{\phi}_nt_n\tag{27} wwwτ+1=wwwτηEP(www)=wwwτ+η ϕϕϕntn(27)

  • 感知器收敛定理表明,对于线性可分数据,感知器算法保证在有限步内收敛(找到精确解)。但其余情况则不保证收敛。
  • 感知器算法无法以概率形式输出。
  • 无法直接推广到K>2的情况。

2.2 概率判别式模型

2.2.1 Logistic回归

Logistic回归使用了具有如下性质的激活函数:
在这里插入图片描述

该函数被称为logistic sigmoid函数,用符号 σ ( ⋅ ) \sigma(\cdot) σ()表示。可以看到该函数的值域为 [ 0 , 1 ] [0,1] [0,1]

针对二分类问题和类别 C 1 , C 2 C_1,C_2 C1,C2,由上述函数作激活函数,对输入的非线性变换 ϕ ( x ) \pmb{\phi}(\pmb{x}) ϕϕϕ(xxx)(简写为 ϕ \pmb{\phi} ϕϕϕ),有:
p ( C 1 ∣ ϕ ) = y ( ϕ ) = σ ( w T ϕ ) y ( C 2 ∣ ϕ ) = 1 − p ( C 1 ∣ ϕ ) (28) p(C_1|\pmb{\phi}) = y(\pmb{\phi})=\sigma(\pmb{w}^T\pmb{\phi})\\ y(C_2|\pmb{\phi}) = 1-p(C_1|\pmb{\phi})\tag{28} p(C1ϕϕϕ)=y(ϕϕϕ)=σ(wwwTϕϕϕ)y(C2ϕϕϕ)=1p(C1ϕϕϕ)(28)
对于数据集 X = { x 1 , . . . , x n } , t = { t 1 , . . . , t n } ( t i ∈ { 0 , 1 } ) X=\{\pmb{x_1},...,\pmb{x}_n \},\pmb{t}=\{t_1,...,t_n\}(t_i\in\{0,1\}) X={x1x1x1,...,xxxn},ttt={t1,...,tn}(ti{0,1}),似然函数可写为:
p ( t ∣ w ) = ∏ n = 1 N y n t n ( 1 − y n ) 1 − t n , y n = σ ( w T ϕ n ) (29) p(\pmb{t}|\pmb{w}) = \prod_{n=1}^N y_n^{t_n}(1-y_n)^{1-t_n},\qquad y_n=\sigma(\pmb{w}^T\pmb{\phi}_n)\tag{29} p(tttwww)=n=1Nyntn(1yn)1tn,yn=σ(wwwTϕϕϕn)(29)
我们把损失函数定义为似然函数的负对数(交叉熵损失),有
E ( w ) = − ln ⁡ p ( t ∣ w ) = − ∑ n = 1 N { t n ln ⁡ y n + ( 1 − t n ) ln ⁡ ( 1 − y n ) } (30) E(\pmb{w}) = -\ln p(\pmb{t}|\pmb{w}) = -\sum_{n=1}^N \{t_n\ln y_n + (1-t_n)\ln (1-y_n)\}\tag{30} E(www)=lnp(tttwww)=n=1N{tnlnyn+(1tn)ln(1yn)}(30)
对参数 w w w求偏导有:

∇ E ( w ) = ∑ j = 1 N ∂ E ∂ y j ∂ y j ∂ w = − ∑ n = 1 N { t n ( 1 − y n ) ϕ n − ( 1 − t n ) y n ϕ n } = ∑ n = 1 N ( y n − t n ) ϕ n (31) \begin{aligned} \nabla E(\pmb{w}) &= \sum_{j=1}^N\frac{\partial E}{\partial y_j}\frac{\partial y_j}{\partial \pmb{w}} \\ &= -\sum_{n=1}^N \{t_n(1-y_n)\pmb{\phi}_n-(1-t_n)y_n\pmb{\phi}_n \}\\ &= \sum_{n=1}^N (y_n-t_n)\pmb{\phi}_n \end{aligned}\tag{31} E(www)=j=1NyjEwwwyj=n=1N{tn(1yn)ϕϕϕn(1tn)ynϕϕϕn}=n=1N(yntn)ϕϕϕn(31)

其中, y n ′ = σ ( w T ϕ ) = σ ( 1 − σ ) ϕ y_n' = \sigma(\pmb{w}^T\pmb{\phi})=\sigma(1-\sigma)\pmb{\phi} yn=σ(wwwTϕϕϕ)=σ(1σ)ϕϕϕ,使用了Logistic sigmoid函数的导数性质。

PPT中使用梯度下降法更新得到收敛的最优参数 w M A P \pmb{w}_{MAP} wwwMAP,但我们采用Newton-Raphson法:
w n e w = w o l d − H − 1 ∇ E ( w ) (32) \pmb{w}^{new} = \pmb{w}^{old}-H^{-1}\nabla E(\pmb{w}) \tag{32} wwwnew=wwwoldH1E(www)(32)
由(31)可得,
∇ E ( w ) = ∑ n = 1 N ( y n − t n ) ϕ n = Φ T ( y − t ) H = ∇ ∇ E ( w ) = ∑ n = 1 N y n ( 1 − y n ) ϕ n ϕ n T = Φ T R Φ (33) \nabla E(\pmb{w}) = \sum_{n=1}^N(y_n-t_n)\pmb{\phi}_n=\pmb{\Phi}^T(\pmb{y}-\pmb{t}) \\ H=\nabla\nabla E(\pmb{w}) = \sum_{n=1}^N y_n(1-y_n)\pmb{\phi}_n\pmb{\phi}_n^T = \pmb{\Phi}^TR\pmb{\Phi} \tag{33} E(www)=n=1N(yntn)ϕϕϕn=ΦΦΦT(yyyttt)H=E(www)=n=1Nyn(1yn)ϕϕϕnϕϕϕnT=ΦΦΦTRΦΦΦ(33)
其中R为对角矩阵, R n n = y n ( 1 − y n ) R_{nn}=y_n(1-y_n) Rnn=yn(1yn)

公式(32)可更新为:
w n e w = w o l d − ( Φ T R Φ ) − 1 Φ T ( y − t ) = ( Φ T R Φ ) − 1 { Φ T R Φ w o l d − Φ T ( y − t ) = ( Φ T R Φ ) − 1 Φ T R z (34) \begin{aligned} \pmb{w}^{new} &= \pmb{w}^{old} - (\pmb{\Phi}^TR\pmb{\Phi})^{-1}\pmb{\Phi}^T(\pmb{y}-\pmb{t})\\ &= (\pmb{\Phi}^TR\pmb{\Phi})^{-1}\{\pmb{\Phi}^TR\pmb{\Phi}\pmb{w}^{old}-\pmb{\Phi}^T(\pmb{y}-\pmb{t}) \\ &= (\pmb{\Phi}^TR\pmb{\Phi})^{-1}\pmb{\Phi}^TR\pmb{z}\\ \end{aligned}\tag{34} wwwnew=wwwold(ΦΦΦTRΦΦΦ)1ΦΦΦT(yyyttt)=(ΦΦΦTRΦΦΦ)1{ΦΦΦTRΦΦΦwwwoldΦΦΦT(yyyttt)=(ΦΦΦTRΦΦΦ)1ΦΦΦTRzzz(34)
其中
z = Φ w o l d − R − 1 ( y − t ) (35) \pmb{z} = \pmb{\Phi}\pmb{w}^{old}-R^{-1}(\pmb{y}-\pmb{t})\tag{35} zzz=ΦΦΦwwwoldR1(yyyttt)(35)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值