EM算法原理和推导

EM算法简介

EM(expectation maximization algorithm)算法是一种迭代的算法,用于含有隐变量的极大似然估计。通常而言,EM算法分为E步和M步,先通过E步来求期望,然后再通过M步求期望的极大值,通过后反复迭代来寻找最优值。

狭义EM算法

EM算法的导出

ELBO+KL散度

从极大似然函数入手,极大似然是通过求 arg ⁡ max ⁡ θ log ⁡ P ( X ∣ θ ) \mathop{\arg\max}\limits_ {\theta}\log P(X|\theta) θargmaxlogP(Xθ)来求使得概率密度乘积最大时的 θ \theta θ值,在此我们可以引入隐变量 z z z,即将目标函数改为在 X X X z z z可观测的前提下,求目标函数最大时的 θ \theta θ值,故变换为
log ⁡ P ( X ∣ θ ) = log ⁡ P ( X , z ∣ θ ) − log ⁡ P ( z ∣ X , θ ) \log P(X|\theta)=\log P(X,z|\theta)-\log P(z|X,\theta) logP(Xθ)=logP(X,zθ)logP(zX,θ)
接下来在引入隐变量的分布函数 q ( z ) q(z) q(z)
log ⁡ P ( X ∣ θ ) = log ⁡ P ( X , z ∣ θ ) q ( z ) − log ⁡ P ( z ∣ X , θ ) q ( z ) \log P(X|\theta)=\log \frac{P(X,z|\theta)}{q(z)}-\log \frac{P(z|X,\theta)}{q(z)} logP(Xθ)=logq(z)P(X,zθ)logq(z)P(zX,θ)
此处的 q ( z ) q(z) q(z)是通过对数函数的变换加入的,具体如下
log ⁡ P ( X , z ∣ θ ) − log ⁡ P ( z ∣ X , θ ) = ( log ⁡ P ( X , z ∣ θ ) − log ⁡ q ( z ) ) − ( log ⁡ P ( z ∣ X , θ ) − log ⁡ q ( z ) ) = log ⁡ P ( X , z ∣ θ ) q ( z ) − log ⁡ P ( z ∣ X , θ ) q ( z ) \log P(X,z|\theta)-\log P(z|X,\theta)=(\log P(X,z|\theta)-\log q(z))-(\log P(z|X,\theta)-\log q(z))=\log \frac{P(X,z|\theta)}{q(z)}-\log \frac{P(z|X,\theta)}{q(z)} logP(X,zθ)logP(zX,θ)=(logP(X,zθ)logq(z))(logP(zX,θ)logq(z))=logq(z)P(X,zθ)logq(z)P(zX,θ)

接下来可以对分布函数 q ( z ) q(z) q(z)做个积分,具体如下
∫ z q ( z ) log ⁡ P ( X ∣ θ ) d z = ∫ z q ( z ) log ⁡ P ( X , z ∣ θ ) q ( z ) d z − ∫ z q ( z ) log ⁡ P ( z ∣ X , θ ) q ( z ) d z \int^{}_{z}q(z) \log P(X|\theta) dz=\int_{z}q(z)\log \frac{P(X,z|\theta)}{q(z)}dz-\int_{z}q(z)\log \frac{P(z|X,\theta)}{q(z)}dz zq(z)logP(Xθ)dz=zq(z)logq(z)P(X,zθ)dzzq(z)logq(z)P(zX,θ)dz

等式左边的积分仅与 q ( z ) q(z) q(z)有关,即
∫ z q ( z ) log ⁡ P ( X ∣ θ ) d z = log ⁡ P ( X ∣ θ ) ∫ z q ( z ) d z = log ⁡ P ( X ∣ θ ) \int^{}_{z}q(z) \log P(X|\theta) dz=\log P(X|\theta)\int^{}_{z}q(z)dz=\log P(X|\theta) zq(z)logP(Xθ)dz=logP(Xθ)zq(z)dz=logP(Xθ)
其中 q ( z ) q(z) q(z)是概率密度函数,所以积分和为1

等式右边的积分可以分为俩个部分,具体如下
E L B O = ∫ z q ( z ) log ⁡ P ( X , z ∣ θ ) q ( z ) d z ELBO = \int_{z}q(z)\log \frac{P(X,z|\theta)}{q(z)}dz ELBO=zq(z)logq(z)P(X,zθ)dz
K L ( q ( z ) ∣ ∣ P ( z ∣ X , θ ) ) = ∫ z q ( z ) log ⁡ q ( z ) P ( z ∣ X , θ ) d z = − ∫ z q ( z ) log ⁡ P ( z ∣ X , θ ) q ( z ) d z KL(q(z)||P(z|X,\theta))=\int_{z}q(z)\log \frac{q(z)}{P(z|X,\theta)}dz=-\int_{z}q(z)\log \frac{P(z|X,\theta)}{q(z)}dz KL(q(z)∣∣P(zX,θ))=zq(z)logP(zX,θ)q(z)dz=zq(z)logq(z)P(zX,θ)dz

这样就可以推出
P ( X ∣ θ ) = E L B O + K L ( q ( z ) ∣ ∣ P ( z ∣ X , θ ) ) P(X|\theta)=ELBO+KL(q(z)||P(z|X,\theta)) P(Xθ)=ELBO+KL(q(z)∣∣P(zX,θ))
根据KL散度的性质可以知道,KL散度是大于等于0的,所以有
P ( X ∣ θ ) ≥ E L B O P(X|\theta)\geq ELBO P(Xθ)ELBO
如果在这里我们使 P ( X ∣ θ ) = E L B O P(X|\theta)= ELBO P(Xθ)=ELBO,则后续仅需通过求 arg ⁡ max ⁡ θ E L B O \mathop{\arg\max}\limits_ {\theta}ELBO θargmaxELBO,就可以使 P ( X ∣ θ ) P(X|\theta) P(Xθ)的下界不断提高,从而达到最大;所以从狭义的角度,我们可以在这里使 K L KL KL散度达到最小值0,即 q ( z ) = P ( z ∣ X , θ ( t ) ) q(z) = P(z|X,\theta^{(t)}) q(z)=P(zX,θ(t))

注:这里 θ \theta θ θ ( t ) \theta^{(t)} θ(t)是因为我们在当前时刻 θ \theta θ已知的前提下,使得 K L KL KL散度达到了最小,然而 E L B O ELBO ELBO中的 θ \theta θ仍视为变量

接下来我们可以将这个 q ( z ) = P ( z ∣ X , θ ( t ) ) q(z) = P(z|X,\theta^{(t)}) q(z)=P(zX,θ(t))代入 E L B O ELBO ELBO中,消去变量 z z z,从而只关注变量 θ \theta θ,变换后
P ( X ∣ θ ) = E L B O = ∫ z P ( z ∣ X , θ ( t ) ) log ⁡ P ( X , z ∣ θ ) P ( z ∣ X , θ ( t ) ) d z P(X|\theta)=ELBO= \int_{z} P(z|X,\theta^{(t)})\log \frac{P(X,z|\theta)}{ P(z|X,\theta^{(t)})}dz P(Xθ)=ELBO=zP(zX,θ(t))logP(zX,θ(t))P(X,zθ)dz
arg ⁡ max ⁡ θ P ( X ∣ θ ) = arg ⁡ max ⁡ θ ∫ z P ( z ∣ X , θ ( t ) ) log ⁡ P ( X , z ∣ θ ) P ( z ∣ X , θ ( t ) ) d z = arg ⁡ max ⁡ θ ∫ z P ( z ∣ X , θ ( t ) ) log ⁡ P ( X , z ∣ θ ) d z − ∫ z P ( z ∣ X , θ ( t ) ) log ⁡ P ( z ∣ X , θ ( t ) ) d z \mathop{\arg\max}\limits_ {\theta}P(X|\theta)=\mathop{\arg\max}\limits_ {\theta} \int_{z} P(z|X,\theta^{(t)})\log \frac{P(X,z|\theta)}{ P(z|X,\theta^{(t)})}dz=\mathop{\arg\max}\limits_ {\theta} \int_{z} P(z|X,\theta^{(t)})\log {P(X,z|\theta)}dz-\int_{z} P(z|X,\theta^{(t)})\log{ P(z|X,\theta^{(t)})}dz θargmaxP(Xθ)=θargmaxzP(zX,θ(t))logP(zX,θ(t))P(X,zθ)dz=θargmaxzP(zX,θ(t))logP(X,zθ)dzzP(zX,θ(t))logP(zX,θ(t))dz
此时可以发现 log ⁡ \log log函数中的分母与变量 θ \theta θ无关,则
θ ( t + 1 ) = arg ⁡ max ⁡ θ P ( X ∣ θ ) = arg ⁡ max ⁡ θ ∫ z P ( z ∣ X , θ ( t ) ) log ⁡ P ( X , z ∣ θ ) d z \theta^{(t+1)}=\mathop{\arg\max}\limits_ {\theta}P(X|\theta)=\mathop{\arg\max}\limits_ {\theta}\int_{z} P(z|X,\theta^{(t)})\log {P(X,z|\theta)}dz θ(t+1)=θargmaxP(Xθ)=θargmaxzP(zX,θ(t))logP(X,zθ)dz
至此我们就推导出了关于 θ ( t ) → θ ( t + 1 ) \theta^{(t)}\rightarrow\theta^{(t+1)} θ(t)θ(t+1)的公式
θ ( t + 1 ) = arg ⁡ max ⁡ θ ∫ z P ( z ∣ X , θ ( t ) ) log ⁡ P ( X , z ∣ θ ) d z \theta^{(t+1)} =\mathop{\arg\max}\limits_ {\theta}\int_{z} P(z|X,\theta^{(t)})\log {P(X,z|\theta)}dz θ(t+1)=θargmaxzP(zX,θ(t))logP(X,zθ)dz

ELBO+Jesson不等式

log ⁡ P ( X ∣ θ ) \log P(X|\theta) logP(Xθ)入手,引入隐变量 z z z,从而有
log ⁡ P ( X ∣ θ ) = log ⁡ ∫ z P ( X , z ∣ θ ) d z \log P(X|\theta) =\log \int_{z}P(X,z|\theta)dz logP(Xθ)=logzP(X,zθ)dz
再引入分布函数 q ( z ) q(z) q(z),有
log ⁡ P ( X ∣ θ ) = log ⁡ ∫ z P ( X , z ∣ θ ) q ( z ) q ( z ) d z = l o g E q ( z ) ( P ( X , z ∣ θ ) q ( z ) ) \log P(X|\theta) =\log \int_{z}\frac{P(X,z|\theta)}{q(z)}q(z)dz = log E_{q(z)}(\frac{P(X,z|\theta)}{q(z)}) logP(Xθ)=logzq(z)P(X,zθ)q(z)dz=logEq(z)(q(z)P(X,zθ))
又函数 log ⁡ \log log是凸函数,根据Jesson不等式,有
log ⁡ E ( x ) ≥ E log ⁡ ( x ) \log E(x)\geq E \log(x) logE(x)Elog(x)
同理得到
l o g E q ( z ) ( P ( X , z ∣ θ ) q ( z ) ) ≥ E q ( z ) log ⁡ ( P ( X , z ∣ θ ) q ( z ) ) log E_{q(z)}(\frac{P(X,z|\theta)}{q(z)}) \geq E_{q(z)}\log (\frac{P(X,z|\theta)}{q(z)}) logEq(z)(q(z)P(X,zθ))Eq(z)log(q(z)P(X,zθ))

E q ( z ) log ⁡ ( P ( X , z ∣ θ ) q ( z ) ) = ∫ z log ⁡ ( P ( X , z ∣ θ ) q ( z ) ) q ( z ) d z E_{q(z)}\log (\frac{P(X,z|\theta)}{q(z)}) = \int_{z}\log (\frac{P(X,z|\theta)}{q(z)})q(z)dz Eq(z)log(q(z)P(X,zθ))=zlog(q(z)P(X,zθ))q(z)dz
所以就得到了
log ⁡ P ( X ∣ θ ) = l o g E q ( z ) ( P ( X , z ∣ θ ) q ( z ) ) ≥ ∫ z log ⁡ ( P ( X , z ∣ θ ) q ( z ) ) q ( z ) d z \log P(X|\theta) = log E_{q(z)}(\frac{P(X,z|\theta)}{q(z)})\geq\int_{z}\log (\frac{P(X,z|\theta)}{q(z)})q(z)dz logP(Xθ)=logEq(z)(q(z)P(X,zθ))zlog(q(z)P(X,zθ))q(z)dz
在狭义的角度,我们关注一下取等号的条件,当 P ( X , z ∣ θ ) q ( z ) = c \frac{P(X,z|\theta)}{q(z)}=c q(z)P(X,zθ)=c(其中 c c c为常数)时,可以使得 l o g E ( c ) = E l o g ( c ) logE(c)=Elog(c) logE(c)=Elog(c),接下来我们先关注 q ( z ) = 1 c P ( X , z ∣ θ ) q(z)=\frac{1}{c}P(X,z|\theta) q(z)=c1P(X,zθ),在这里对做积分可以得到
∫ z q ( z ) d z = ∫ z 1 c P ( X , z ∣ θ ) d z \int_{z} q(z)dz=\int_{z} \frac{1}{c}P(X,z|\theta) dz zq(z)dz=zc1P(X,zθ)dz
1 = 1 c P ( X ∣ θ ) 1=\frac{1}{c}P(X|\theta) 1=c1P(Xθ)
P ( X ∣ θ ) = c P(X|\theta) =c P(Xθ)=c,代回 P ( X , z ∣ θ ) q ( z ) = c \frac{P(X,z|\theta)}{q(z)}=c q(z)P(X,zθ)=c中,可以得到
q ( z ) = P ( X , z ∣ θ ) P ( X ∣ θ ) = P ( z ∣ X , θ ) q(z)=\frac{P(X,z|\theta)}{P(X|\theta) }=P(z|X,\theta) q(z)=P(Xθ)P(X,zθ)=P(zX,θ)
这里的 θ \theta θ也是在已知情况下取得的等价条件,所以就得到了 q ( z ) = P ( z ∣ X , θ ( t ) ) q(z)=P(z|X,\theta^{(t)}) q(z)=P(zX,θ(t))

接下来将其代入 ∫ z log ⁡ ( P ( X , z ∣ θ ) q ( z ) ) q ( z ) d z \int_{z}\log (\frac{P(X,z|\theta)}{q(z)})q(z)dz zlog(q(z)P(X,zθ))q(z)dz中有
∫ z log ⁡ ( P ( X , z ∣ θ ) q ( z ) ) q ( z ) d z = ∫ z log ⁡ ( P ( X , z ∣ θ ) P ( z ∣ X , θ ( t ) ) ) P ( z ∣ X , θ ( t ) ) d z = ∫ z log ⁡ ( P ( X , z ∣ θ ) P ( z ∣ X , θ ( t ) ) d z − ∫ z log ⁡ ( P ( z ∣ X , θ ) P ( z ∣ X , θ ( t ) ) d z \int_{z}\log (\frac{P(X,z|\theta)}{q(z)})q(z)dz=\int_{z}\log (\frac{P(X,z|\theta)}{P(z|X,\theta^{(t)})})P(z|X,\theta^{(t)})dz=\int_{z}\log (P(X,z|\theta)P(z|X,\theta^{(t)})dz-\int_{z}\log (P(z|X,\theta)P(z|X,\theta^{(t)})dz zlog(q(z)P(X,zθ))q(z)dz=zlog(P(zX,θ(t))P(X,zθ))P(zX,θ(t))dz=zlog(P(X,zθ)P(zX,θ(t))dzzlog(P(zX,θ)P(zX,θ(t))dz
所以就有
θ ( t + 1 ) = arg ⁡ max ⁡ θ log ⁡ P ( X ∣ θ ) = arg ⁡ max ⁡ θ ∫ z log ⁡ ( P ( X , z ∣ θ ) P ( z ∣ X , θ ( t ) ) d z \theta^{(t+1)}=\mathop{\arg\max}\limits_ {\theta} \log P(X|\theta) = \mathop{\arg\max}\limits_ {\theta}\int_{z}\log (P(X,z|\theta)P(z|X,\theta^{(t)})dz θ(t+1)=θargmaxlogP(Xθ)=θargmaxzlog(P(X,zθ)P(zX,θ(t))dz
至此我们就推导出了关于 θ ( t ) → θ ( t + 1 ) \theta^{(t)}\rightarrow\theta^{(t+1)} θ(t)θ(t+1)的公式
θ ( t + 1 ) = arg ⁡ max ⁡ θ ∫ z P ( z ∣ X , θ ( t ) ) log ⁡ P ( X , z ∣ θ ) d z \theta^{(t+1)} =\mathop{\arg\max}\limits_ {\theta}\int_{z} P(z|X,\theta^{(t)})\log {P(X,z|\theta)}dz θ(t+1)=θargmaxzP(zX,θ(t))logP(X,zθ)dz

广义EM算法

狭义EM算法实际上是广义EM算法的一种特殊情况,所以接下来我们分析一下广义上的EM算法

这里我们从狭义EM算法中推出的 P ( X ∣ θ ) = E L B O + K L ( q ( z ) ∣ ∣ P ( z ∣ X , θ ) ) P(X|\theta)=ELBO+KL(q(z)||P(z|X,\theta)) P(Xθ)=ELBO+KL(q(z)∣∣P(zX,θ))入手,将 E L B O ELBO ELBO看作 F ( q ( z ) , θ ) F(q(z),\theta) F(q(z),θ),然后根据 K L KL KL散度大于等于0,得到
P ( X ∣ θ ) ≥ F ( q ( z ) , θ ) P(X|\theta)\geq F(q(z),\theta) P(Xθ)F(q(z),θ)
在这里 q ( z ) q(z) q(z)是不固定的,所以我们需要求出使函数 F F F达到最大时的 θ \theta θ

这里我们从E步开始,先固定 θ \theta θ,即在 θ ( t ) \theta^{(t)} θ(t)已知的前提下,求 q ^ \hat{q} q^,即E-step为
q ^ ( t + 1 ) = arg ⁡ max ⁡ q F ( q , θ ( t ) ) \hat{q}^{(t+1)}=\mathop{\arg\max}\limits_ {q}F(q,\theta^{(t)}) q^(t+1)=qargmaxF(q,θ(t))
然后接下来开始M步,即固定了 q ^ \hat{q} q^来求 θ ( t + 1 ) \theta^{(t+1)} θ(t+1),即M-step为
θ ( t + 1 ) = arg ⁡ max ⁡ θ F ( q ( t + 1 ) , θ ) \theta^{(t+1)}=\mathop{\arg\max}\limits_ {\theta}F(q^{(t+1)},\theta) θ(t+1)=θargmaxF(q(t+1),θ)
然后通过反复迭代,不断地使 F F F变大,从而提高 P ( X ∣ θ ) P(X|\theta) P(Xθ)的下界,最终求出最优的 θ \theta θ

EM算法的收敛性证明

我们可以发现 P ( X ∣ θ ) P(X|\theta) P(Xθ)是概率所以其上界为1,而函数收敛的充分条件为单调有界,所以只要证明 log ⁡ P ( X ∣ θ ) \log P(X|\theta) logP(Xθ)是单调递增的

首先引入隐变量
log ⁡ P ( X ∣ θ ) = log ⁡ P ( X , z ∣ θ ) − log ⁡ P ( z ∣ X , θ ) \log P(X|\theta) = \log P(X,z|\theta)-\log P(z|X,\theta) logP(Xθ)=logP(X,zθ)logP(zX,θ)

由于ELBO每次迭代都增大,所以我们可以将 log ⁡ P ( X , z ∣ θ ) \log P(X,z|\theta) logP(X,zθ)凑成ELBO的形式,即等式左右乘以 P ( z ∣ X , θ ( t ) ) P(z|X,\theta^{(t)}) P(zX,θ(t)),并同时对 z z z做积分,有
log ⁡ P ( X ∣ θ ) = ∫ z log ⁡ P ( X , z ∣ θ ) P ( z ∣ X , θ ( t ) ) d z − ∫ z log ⁡ P ( z ∣ X , θ ) P ( z ∣ X , θ ( t ) ) d z \log P(X|\theta) = \int_{z} \log P(X,z|\theta) P(z|X,\theta^{(t)}) dz-\int_{z}\log P(z|X,\theta) P(z|X,\theta^{(t)}) dz logP(Xθ)=zlogP(X,zθ)P(zX,θ(t))dzzlogP(zX,θ)P(zX,θ(t))dz

这里我们令
Q ( θ , θ ( t ) ) = ∫ z log ⁡ P ( X , z ∣ θ ) P ( z ∣ X , θ ( t ) ) d z H ( θ , θ ( t ) ) = ∫ z log ⁡ P ( z ∣ X , θ ) P ( z ∣ X , θ ( t ) ) d z Q(\theta,\theta^{(t)})=\int_{z} \log P(X,z|\theta) P(z|X,\theta^{(t)}) dz \\ H(\theta,\theta^{(t)})=\int_{z}\log P(z|X,\theta) P(z|X,\theta^{(t)}) dz Q(θ,θ(t))=zlogP(X,zθ)P(zX,θ(t))dzH(θ,θ(t))=zlogP(zX,θ)P(zX,θ(t))dz

所以 l o g P ( X ∣ θ ( t ) ) = Q ( θ ( t ) , θ ( t ) ) − H ( θ ( t ) , θ ( t ) ) log P(X|\theta^{(t)})=Q(\theta^{(t)},\theta^{(t)})-H(\theta^{(t)},\theta^{(t)}) logP(Xθ(t))=Q(θ(t),θ(t))H(θ(t),θ(t)),由于ELBO是不断增大的,所以 Q ( θ ( t + 1 ) , θ ( t ) ) > Q ( θ ( t ) , θ ( t ) ) Q(\theta^{(t+1)},\theta^{(t)})>Q(\theta^{(t)},\theta^{(t)}) Q(θ(t+1),θ(t))>Q(θ(t),θ(t))(此处不严谨),接下来我们仅需证明 H ( θ ( t ) , θ ( t ) ) ≥ H ( θ ( t + 1 ) , θ ( t ) ) H(\theta^{(t)},\theta^{(t)})\geq H(\theta^{(t+1)},\theta^{(t)}) H(θ(t),θ(t))H(θ(t+1),θ(t))

H ( θ ( t + 1 ) , θ ( t ) ) − H ( θ ( t ) , θ ( t ) ) = ∫ z log ⁡ P ( z ∣ X , θ ( t + 1 ) ) P ( z ∣ X , θ ( t ) ) d z − ∫ z log ⁡ P ( z ∣ X , θ ( t ) ) P ( z ∣ X , θ ( t ) ) d z = ∫ z log ⁡ P ( z ∣ X , θ ( t + 1 ) ) P ( z ∣ X , θ ( t ) ) P ( z ∣ X , θ ( t ) ) d z ≤ log ⁡ ∫ z P ( z ∣ X , θ ( t + 1 ) ) P ( z ∣ X , θ ( t ) ) P ( z ∣ X , θ ( t ) ) d z = log ⁡ ∫ z P ( z ∣ X , θ ( t + 1 ) ) d z = log ⁡ 1 = 0 H(\theta^{(t+1)},\theta^{(t)})-H(\theta^{(t)},\theta^{(t)})=\int_{z}\log P(z|X,\theta^{(t+1)}) P(z|X,\theta^{(t)}) dz-\int_{z}\log P(z|X,\theta^{(t)}) P(z|X,\theta^{(t)}) dz\\ =\int_{z}\log \frac{P(z|X,\theta^{(t+1)})}{P(z|X,\theta^{(t)})} P(z|X,\theta^{(t)}) dz \\ \leq \log \int_{z}\frac{P(z|X,\theta^{(t+1)})}{P(z|X,\theta^{(t)})} P(z|X,\theta^{(t)}) dz \\= \log \int_{z} P(z|X,\theta^{(t+1)}) dz = \log1 = 0 H(θ(t+1),θ(t))H(θ(t),θ(t))=zlogP(zX,θ(t+1))P(zX,θ(t))dzzlogP(zX,θ(t))P(zX,θ(t))dz=zlogP(zX,θ(t))P(zX,θ(t+1))P(zX,θ(t))dzlogzP(zX,θ(t))P(zX,θ(t+1))P(zX,θ(t))dz=logzP(zX,θ(t+1))dz=log1=0

所以可以得到 H ( θ ( t + 1 ) , θ ( t ) ) ≤ H ( θ ( t ) , θ ( t ) ) H(\theta^{(t+1)},\theta^{(t)})\leq H(\theta^{(t)},\theta^{(t)}) H(θ(t+1),θ(t))H(θ(t),θ(t)),这样就可以得到 log ⁡ P ( X ∣ θ ) \log P(X|\theta) logP(Xθ)是单调递增且有上界,即 log ⁡ P ( X ∣ θ ) \log P(X|\theta) logP(Xθ)收敛得证

以上总结是个人的学习理解,若有错误,请指出。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值