13 MCMC——马尔可夫链蒙特卡洛

13 MCMC——马尔可夫链蒙特卡洛

13.1 MCMC的意义

我们都知道Monte Carlo是一种常用的估计方法,我们经常用这个方法对期望进行随机估计。而Monte Carlo中的一大问题就是采样,要从一个复杂分布中采样是困难的,我们只能通过一些方法,将复杂的分布表示出来,然后进行采样。

我们从三个方面介绍一下MCMC的意义:

  1. 采样的动机:
    • 采样本身:我们经常需要从各种概率分布中取得样本。(例如学习一张图片后生成新的图片)
    • 求和或求积分(期望): E p ( x ) [ f ( x ) ] ≈ 1 N ∑ i = 1 N f ( x ( i ) ) E_{p(x)}[f(x)] \approx \frac{1}{N} \sum_{i=1}^{N} f(x^{(i)}) Ep(x)[f(x)]N1i=1Nf(x(i))
  2. 什么是好的样本:
    • 样本趋向(集中)于高概率区域——能够凸显分布特征
    • 样本之间相互独立
  3. 为什么会采样困难:
    • 无法归一化:Partation funtion is intractable——求不出概率(归一化因子是积分形式,维度过高会无法求解)
    • 维度灾难:高维的稀疏性使得直接判定的方法无法操作

13.2 简单采样方法介绍

首先简单介绍一下Monte Carlo方法:Monte Carlo Method是基于采样的随即近似方法。假如存在 N N N​个样本 Z ( 1 ) , … , Z ( N ) Z^{(1)}, \dots, Z^{(N)} Z(1),,Z(N)​,我们就可以通过代入样本求均值求期望:
P ( Z ∣ X ) → E Z ∣ X [ f ( Z ) ] = ∫ Z f ( Z ) ⋅ P ( Z ∣ X ) d Z ≈ 1 N ∑ i = 1 N f ( Z ( i ) ) P(Z|X) \rightarrow E_{Z|X}[f(Z)] = \int_Z f(Z) \cdot P(Z|X) d_Z \approx \frac{1}{N} \sum_{i=1}^{N} f(Z^{(i)}) P(ZX)EZX[f(Z)]=Zf(Z)P(ZX)dZN1i=1Nf(Z(i))
同时给出一个最基本的条件:我们认为样本 u ∽ U ( 0 , 1 ) u \backsim U(0, 1) uU(0,1)的均匀分布是很好取的。

13.2.1 概率分布采样

条件:我们已知目标分布 p ( x ) p(x) p(x)的pdf,而且可以通过积分求出其cdf。

方法:因为均匀分布 u ∽ U ( 0 , 1 ) u \backsim U(0, 1) uU(0,1)很好取,所以我们随机取 u u u作为cdf的值,通过反函数求出样本。

缺点:大多数分布的积分、反函数求不出来,无法实现

13.2.2 Rejection Sampling——拒绝采样

条件:我们已知目标分布 p ( x ) p(x) p(x)的pdf,用 q ( x ) q(x) q(x)表示一个可以通过概率分布采样的简单的pdf,令 ∀ Z → M ⋅ q ( Z ) ≥ p ( Z ) \forall Z \rightarrow M \cdot q(Z) \geq p(Z) ZMq(Z)p(Z)(带 M M M是因为 q q q p p p的面积相同,不带系数无法实现)

方法:

  • 假定在样本点 Z ( i ) Z^{(i)} Z(i)时, p ( Z ( i ) ) p(Z^{(i)}) p(Z(i))的值为 l 1 l_1 l1 M ⋅ q ( Z ( i ) ) M \cdot q(Z^{(i)}) Mq(Z(i))的值为 l 2 l_2 l2,如图所示

  • 定义一个变量,接受率 α = l 1 l 2 \alpha = \frac{l_1}{l_2} α=l2l1,取值范围为 α ∈ [ 0 , 1 ] \alpha \in [0, 1] α[0,1]

  • 在对 q ( Z ) q(Z) q(Z)采样的时候,随机在均匀分布中采样: u ∽ U ( 0 , 1 ) u \backsim U(0, 1) uU(0,1)。若 u ≤ α u \leq \alpha uα则保留 Z ( i ) Z^{(i)} Z(i),反之则删除。

缺点:若 p ( Z ( i ) ) p(Z^{(i)}) p(Z(i)) M ⋅ q ( Z ( i ) ) M \cdot q(Z^{(i)}) Mq(Z(i))的值相差过大,会增加运算量(可能取好多次样都保留不了几个)

13.2.3 Importance Sampling——重要性采样

原理:对取样分布进行变换:
E p ( Z ) [ f ( Z ) ] = ∫ Z f ( Z ) p ( Z ) d Z = ∫ Z f ( Z ) p ( Z ) q ( Z ) ⋅ q ( Z ) d Z = E q ( Z ) [ f ( Z ) p ( Z ) q ( Z ) ] ≈ 1 N ∑ i = 1 N [ f ( Z ( i ) ) p ( Z ( i ) ) q ( Z ( i ) ) ] \begin{align} E_{p(Z)}[f(Z)] &= \int_Z f(Z)p(Z) {\rm d}_Z \\ &= \int_Z f(Z) \frac{p(Z)}{q(Z)} \cdot q(Z) {\rm d}_Z \\ &= E_{q(Z)} \left[ f(Z) \frac{p(Z)}{q(Z)} \right] \\ &\approx \frac{1}{N} \sum_{i=1}^N \left[ f(Z^{(i)}) \frac{p(Z^{(i)})}{q(Z^{(i)})} \right] \end{align} Ep(Z)[f(Z)]=Zf(Z)p(Z)dZ=Zf(Z)q(Z)p(Z)q(Z)dZ=Eq(Z)[f(Z)q(Z)p(Z)]N1i=1N[f(Z(i))q(Z(i))p(Z(i))]
我们将 q ( Z ) q(Z) q(Z)​定义为一个简单分布。通过对 q ( Z ) q(Z) q(Z)​进行采样,可以求出 f ( Z ( i ) ) p ( Z ( i ) ) q ( Z ( i ) ) f(Z^{(i)}) \frac{p(Z^{(i)})}{q(Z^{(i)})} f(Z(i))q(Z(i))p(Z(i))​,我们将 p ( Z ( i ) ) q ( Z ( i ) ) \frac{p(Z^{(i)})}{q(Z^{(i)})} q(Z(i))p(Z(i))​称为权重,乘上倒数我们便可以得到结果:
1 N ∑ i = 1 N f ( Z ( i ) ) (对 p 取样) → 1 N ∑ i = 1 N [ f ( Z ( i ) ) p ( Z ( i ) ) q ( Z ( i ) ) ] (对 q 取样) \frac{1}{N} \sum_{i=1}^N f(Z^{(i)}) (对p取样) \rightarrow \frac{1}{N} \sum_{i=1}^N \left[ f(Z^{(i)}) \frac{p(Z^{(i)})}{q(Z^{(i)})} \right] (对q取样) N1i=1Nf(Z(i))(对p取样)N1i=1N[f(Z(i))q(Z(i))p(Z(i))](对q取样)
缺点:以来 p p p q q q的相似度,若相差过大,则样本位置分布的差别会很大。

推广:Sampling Importance Resampling——重采样:

  • 先进行一次Importance Resampling得到 Z ( i ) Z^{(i)} Z(i)
  • 通过将权重 p ( Z ( i ) ) q ( Z ( i ) ) \frac{p(Z^{(i)})}{q(Z^{(i)})} q(Z(i))p(Z(i))设置为概率重新进行采样——可以将更多的点聚集在高概率区域

13.3 Markov Chain知识补充

13.3.1 Markov Chain定义

Markov Chain定义:通过 { x t } {\lbrace x_t \rbrace} {xt}表示节点, P = [ P i j ] P=[P_{ij}] P=[Pij]表示转移矩阵(i,j用于表示节点的状态, P i j = P ( x t + 1 = j ∣ x t = i ) P_{ij} = P(x_{t+1} = j | x_t = i) Pij=P(xt+1=jxt=i)), π t \pi_t πt表示 t t t时刻的节点所表示的分布:

13.3.2 Markov Chain性质——平稳分布

Markov Chain性质——平稳分布:节点的分布随时间 t → ∞ t \rightarrow \infty t π t \pi_t πt将会收敛于一个固定的分布。

重定义:

  • 节点为 { x t } {\lbrace x_t \rbrace} {xt}, 状态分布为 q ( t ) ( x ) q^{(t)}(x) q(t)(x),$Q = \begin{pmatrix} Q_{11} & Q_{12} & \dots & Q_{1K} \ Q_{21} & Q_{22} & \dots & Q_{2K} \ \dots \ Q_{K1} & Q_{K2} & \dots & Q_{KK} \end{pmatrix}_{K \times K} 为转移矩阵(随机矩阵),到 为转移矩阵(随机矩阵),到 为转移矩阵(随机矩阵),到m$时刻收敛(分布不变):

为何要引入平稳分布?

  • 从结论出发,平稳分布只与转移矩阵相关(也就是说初始分布可以很简单,简单到可以取样),若平稳分布与目标分布相同的话,我们就可以通过Markov Chain的平稳分布,从简单取样到复杂取样。

收敛证明——证明对于Markov Chain, ∃ m \exists m m使得 q ( m + i ) ( x ) , i ∈ N q^{(m+i)}(x), i \in N q(m+i)(x),iN进入平稳分布:

定义行向量: q ( t + 1 ) = ( q ( t + 1 ) ( x = 1 ) , … , q ( t + 1 ) ( x = K ) ) 1 × K q^{(t+1)} = {\left( q^{(t+1)}(x = 1), \dots , q^{(t+1)}(x = K) \right)}_{1 \times K} q(t+1)=(q(t+1)(x=1),,q(t+1)(x=K))1×K

引入转移矩阵的定义可以得到: q ( t + 1 ) ( x = j ) = ∑ i = 1 K q ( t ) ( x = i ) ⋅ Q i j q^{(t+1)}(x=j) = \sum_{i=1}^{K} q^{(t)}(x=i) \cdot Q_{ij} q(t+1)(x=j)=i=1Kq(t)(x=i)Qij

可以得到公式:
q ( t + 1 ) = ( ∑ i = 1 K q ( t ) ( x = i ) ⋅ Q i 1 , … , ∑ i = 1 K q ( t ) ( x = i ) ⋅ Q i K ) 1 × K = q ( t ) Q = ⋯ = q ( 1 ) Q t \begin{align} q^{(t+1)} &= {\left( \sum_{i=1}^{K} q^{(t)}(x=i) \cdot Q_{i1}, \dots , \sum_{i=1}^{K} q^{(t)}(x=i) \cdot Q_{iK} \right)}_{1 \times K} \\ &= q^{(t)}Q = \dots = q^{(1)}Q^t \end{align} q(t+1)=(i=1Kq(t)(x=i)Qi1,,i=1Kq(t)(x=i)QiK)1×K=q(t)Q==q(1)Qt
引入随机矩阵的性质(Q满足随机矩阵的性质):随机矩阵的特征值的绝对值 ≤ 1 \leq 1 1,所以有:
Q = A Λ A − 1 = A − 1 Λ A , Λ = d i a g ( λ 1 , … , λ k ) , ∣ λ i ∣ ≤ 1 Q = A \Lambda A^{-1} = A^{-1} \Lambda A, \quad \Lambda = diag(\lambda_1, \dots, \lambda_k), \quad |\lambda_i| \leq 1 Q=AΛA1=A1ΛA,Λ=diag(λ1,,λk),λi1
引入性质继续分解公式可得:
q ( t + 1 ) = q ( 1 ) Q t = q ( 1 ) ( A Λ A − 1 ) t = q ( 1 ) A Λ t A − 1 \begin{align} q^{(t+1)} = q^{(1)}Q^t = q^{(1)}{(A \Lambda A^{-1})}^t = q^{(1)}{A \Lambda^t A^{-1}} \end{align} q(t+1)=q(1)Qt=q(1)(AΛA1)t=q(1)AΛtA1
假设目前有一个足够大的 m m m,我们可以知道:
{ q ( m + 1 ) = q ( 1 ) A Λ m A − 1 q ( m + 2 ) = q ( 1 ) A Λ m + 1 A − 1 \begin{cases} q^{(m + 1)} = q^{(1)}{A \Lambda^m A^{-1}} \\ q^{(m + 2)} = q^{(1)}{A \Lambda^{m+1} A^{-1}} \\ \end{cases} {q(m+1)=q(1)AΛmA1q(m+2)=q(1)AΛm+1A1
若此时 m m m足够大,不妨设其中只有 λ i = 1 \lambda_i = 1 λi=1,可得 Λ m = d i a g ( 0 , … , 1 , … , 0 ) = Λ m + 1 \Lambda^m = diag(0, \dots, 1, \dots, 0) = \Lambda^{m+1} Λm=diag(0,,1,,0)=Λm+1​。将该公式代入上文可得
q ( m + 1 ) = q ( m + 2 ) q^{(m + 1)} = q^{(m + 2)} q(m+1)=q(m+2)
由此得证,当 t > m t>m t>m时,有 q ( m + 1 ) = q ( m + 2 ) = q ( ∞ ) q^{(m + 1)} = q^{(m + 2)} = q^{(\infty)} q(m+1)=q(m+2)=q()

但这个收敛证明有一个缺点:

  • 我们只证明了在足够大时会收敛,但我们不知道具体的收敛时间与条件。

13.3.3 Markov Chain性质——Detailed Balance

Detailed Balance:

  • 满足以下等式(表示为双向映射):
    π ( x ) ⋅ P ( x ↦ x ∗ ) = π ( x ∗ ) ⋅ P ( x ∗ ↦ x ) \pi(x) \cdot P(x \mapsto x^*) = \pi(x^*) \cdot P(x^* \mapsto x) π(x)P(xx)=π(x)P(xx)

作用:

  • Detailed Balance的条件中包含了平稳分布,因为平稳分布的性质表示为: { π k } {\lbrace \pi_k \rbrace} {πk} { x t } {\lbrace x_t \rbrace} {xt}的平稳分布:
    π ( x ∗ ) = ∫ π ( x ) ⋅ P ( x ↦ x ∗ ) d x \pi(x^*) = \int \pi(x) \cdot P(x \mapsto x^*) {\rm d}x π(x)=π(x)P(xx)dx

  • 要证明Detailed Balance包含平稳分布可以在两边同对 x x x​积分:
    ∫ π ( x ) ⋅ P ( x ↦ x ∗ ) d x = ∫ π ( x ∗ ) ⋅ P ( x ∗ ↦ x ) d x = π ( x ∗ ) ∫ P ( x ∗ ↦ x ) d x = π ( x ∗ ) \begin{align} \int \pi(x) \cdot P(x \mapsto x^*) {\rm d}x &= \int \pi(x^*) \cdot P(x^* \mapsto x) {\rm d}x \\ &= \pi(x^*) \int P(x^* \mapsto x) {\rm d}x \\ &= \pi(x^*) \end{align} π(x)P(xx)dx=π(x)P(xx)dx=π(x)P(xx)dx=π(x)

13.4 Metropolis Hastings方法

意义:是一种通过接受率满足Detailed Balance条件的方法。

方法:

  1. 我们先定义一个随机转移矩阵 Q ( Z ↦ Z ∗ ) Q(Z \mapsto Z^*) Q(ZZ),这个转移矩阵表示条件分布 Q ( Z ∗ ∣ Z ) Q(Z^*|Z) Q(ZZ),但此时:
    p ( Z ) ⋅ Q ( Z ↦ Z ∗ ) ≠ p ( Z ∗ ) ⋅ Q ( Z ∗ ↦ Z ) p(Z) \cdot Q(Z \mapsto Z^*) \neq p(Z^*) \cdot Q(Z^* \mapsto Z) p(Z)Q(ZZ)=p(Z)Q(ZZ)

  2. 定义一个接受率 α ( Z , Z ∗ ) = min ⁡ ( 1 , p ( Z ∗ ) ⋅ Q ( Z ∗ ↦ Z ) p ( Z ) ⋅ Q ( Z ↦ Z ∗ ) ) \alpha(Z, Z^*) = \min(1, \frac{p(Z^*) \cdot Q(Z^* \mapsto Z)}{p(Z) \cdot Q(Z \mapsto Z^*)}) α(Z,Z)=min(1,p(Z)Q(ZZ)p(Z)Q(ZZ)),使得等式成立:
    p ( Z ) ⋅ Q ( Z ↦ Z ∗ ) ⋅ α ( Z , Z ∗ ) = p ( Z ) ⋅ Q ( Z ↦ Z ∗ ) ⋅ min ⁡ ( 1 , p ( Z ∗ ) ⋅ Q ( Z ∗ ↦ Z ) p ( Z ) ⋅ Q ( Z ↦ Z ∗ ) ) = min ⁡ ( p ( Z ) ⋅ Q ( Z ↦ Z ∗ ) , p ( Z ∗ ) ⋅ Q ( Z ∗ ↦ Z ) ) = p ( Z ∗ ) ⋅ Q ( Z ∗ ↦ Z ) ⋅ min ⁡ ( p ( Z ) ⋅ Q ( Z ↦ Z ∗ ) p ( Z ∗ ) ⋅ Q ( Z ∗ ↦ Z ) , 1 ) = p ( Z ∗ ) ⋅ Q ( Z ∗ ↦ Z ) ⋅ α ( Z ∗ , Z ) \begin{align} p(Z) \cdot Q(Z \mapsto Z^*) \cdot \alpha(Z, Z^*) &= p(Z) \cdot Q(Z \mapsto Z^*) \cdot \min(1, \frac{p(Z^*) \cdot Q(Z^* \mapsto Z)}{p(Z) \cdot Q(Z \mapsto Z^*)}) \\ &= \min(p(Z) \cdot Q(Z \mapsto Z^*), {p(Z^*) \cdot Q(Z^* \mapsto Z)}) \\ &= p(Z^*) \cdot Q(Z^* \mapsto Z) \cdot \min(\frac{p(Z) \cdot Q(Z \mapsto Z^*)}{p(Z^*) \cdot Q(Z^* \mapsto Z)}, 1) \\ &= p(Z^*) \cdot Q(Z^* \mapsto Z) \cdot \alpha(Z^*, Z) \\ \end{align} p(Z)Q(ZZ)α(Z,Z)=p(Z)Q(ZZ)min(1,p(Z)Q(ZZ)p(Z)Q(ZZ))=min(p(Z)Q(ZZ),p(Z)Q(ZZ))=p(Z)Q(ZZ)min(p(Z)Q(ZZ)p(Z)Q(ZZ),1)=p(Z)Q(ZZ)α(Z,Z)

  3. 此时 Q ( Z ↦ Z ∗ ) ⋅ α ( Z , Z ∗ ) Q(Z \mapsto Z^*) \cdot \alpha(Z, Z^*) Q(ZZ)α(Z,Z)就相当于是新的转移矩阵。

具体实现:

  1. 从均匀分布中取得 u ∽ U ( 0 , 1 ) u \backsim U(0, 1) uU(0,1)
  2. 从转移矩阵中进行抽样 Z ∗ ∽ Q ( Z ↦ Z ∗ ) Z^* \backsim Q(Z \mapsto Z^*) ZQ(ZZ)
  3. 引入接受率,对样本进行一个筛选: u ≤ α ? Z ( i ) = z ∗ : Z ( i ) = Z ( i − 1 ) u \leq \alpha ? Z^{(i)} = z^* : Z^{(i)} = Z^{(i-1)} uα?Z(i)=z:Z(i)=Z(i1)

13.5 Gibbs方法

Gibbs实际上是特殊的MH算法,这个时候我们取 α = 1 \alpha = 1 α=1

Gibbs的思想是:

  • 固定 p ( Z ) = p ( Z 1 , Z 2 , … , Z M ) p(Z) = p(Z_1, Z_2, \dots, Z_M) p(Z)=p(Z1,Z2,,ZM)​中的每个维度,然后进行坐标上升。每个维度就是在条件分布中取样:
    Z i ∽ p ( Z i ∣ Z − i ) Z_i \backsim p(Z_i | Z_{-i}) Zip(ZiZi)

具体实现:

  1. 先采样出 Z 1 ( 0 ) , Z 2 ( 0 ) , … , Z M ( 0 ) Z_1^{(0)}, Z_2^{(0)}, \dots, Z_M^{(0)} Z1(0),Z2(0),,ZM(0)

  2. 然后不停的上升:
    { Z 1 ( t + 1 ) = p ( Z 1 ∣ Z 2 ( t ) , … , Z M ( t ) ) Z M ( t + 1 ) = p ( Z M ∣ Z 2 ( t + 1 ) , … , Z M − 1 ( t + 1 ) ) \begin{cases} Z_1^{(t+1)} = p(Z_1| Z_2^{(t)}, \dots, Z_M^{(t)}) \\ Z_M^{(t+1)} = p(Z_M| Z_2^{(t+1)}, \dots, Z_{M-1}^{(t+1)}) \\ \end{cases} {Z1(t+1)=p(Z1Z2(t),,ZM(t))ZM(t+1)=p(ZMZ2(t+1),,ZM1(t+1))

  3. 这样到最后将维度组合起来就是样本了

为什么Gibbs不用像MH中一样乘 α \alpha α,为什么 α = 1 \alpha = 1 α=1

  • 在Gibbs中我们假设 Q ( Z ↦ Z ∗ ) = P ( Z i ∗ ∣ Z i ) Q(Z \mapsto Z^*) = P(Z_i^*|Z_i) Q(ZZ)=P(ZiZi),因为我们在求取第 i i i项到时候固定住了其他的项,所以有 Z i = Z i ∗ Z_i = Z_i^* Zi=Zi,根据这些性质可以得到:
    p ( Z ) ⋅ Q ( Z ↦ Z ∗ ) p ( Z ∗ ) ⋅ Q ( Z ∗ ↦ Z ) = p ( Z ∣ Z i ) ⋅ p ( Z i ) ⋅ Q ( Z ↦ Z ∗ ) p ( Z ∗ ∣ Z i ∗ ) ⋅ p ( Z i ∗ ) ⋅ Q ( Z ∗ ↦ Z ) = 1 \frac{p(Z) \cdot Q(Z \mapsto Z^*)}{p(Z^*) \cdot Q(Z^* \mapsto Z)} = \frac{p(Z|Z_i) \cdot p(Z_i) \cdot Q(Z \mapsto Z^*)}{p(Z^*|Z_i^*) \cdot p(Z_i^*) \cdot Q(Z^* \mapsto Z)} = 1 p(Z)Q(ZZ)p(Z)Q(ZZ)=p(ZZi)p(Zi)Q(ZZ)p(ZZi)p(Zi)Q(ZZ)=1

所以我们无需加入 α \alpha α

13.6 MCMC总结

整体思路:利用Markov Chain收敛与平稳分布的性质,设计Q使得平稳分布 ≈ \approx 目标分布

MCMC有的问题:

  • 理论证明了收敛性,但没有给出证明结束时刻m的方法——不能简单判定相邻时刻的分布,如果提早判定了,就有可能无法测出一个较低的高峰:

  • mixing time过长: p ( x ) p(x) p(x)过于复杂/高维/高相关性

  • 样本间存在一定的相关性。

将MCMC化为一张图就是:

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Matlab中的MCMC是指尔科夫链蒙特卡洛(Markov Chain Monte Carlo)方法的实现。MCMC是一种统计模拟方法,用于从复杂的概率分布中抽样。在你提供的引用[1]中,详细介绍了在Matlab中实现MCMC算法的教程。 在MCMC中,我们通过构建一个尔科夫链来模拟从目标概率分布中抽样。这个尔科夫链具有平稳分布,且该分布与我们想要抽样的目标分布一致。MCMC方法最常用的算法是Metropolis-Hastings算法,也是你提供的引用中使用的算法。 Metropolis-Hastings(MH)算法包括两个步骤:候选点生成和接受/拒绝规则。在候选点生成步骤中,我们从转移核函数(在你的引用中为q(x, mu))中生成一个候选点。在接受/拒绝规则步骤中,我们计算接受比率(acc)来决定是否接受该候选点。如果接受比率大于一个随机生成的数,我们接受候选点,否则我们拒绝候选点。 在你提供的引用中的代码实现了一个使用MH-MCMC算法从复杂的混合概率分布中抽样的例子。具体来说,该代码使用了两个正态分布N(1,1)和N(5,1)作为目标分布的混合分布,并生成了一串连续的候选点序列x。最后,通过绘制目标分布的曲线图和候选点序列的直方图,我们可以观察到候选点序列逐渐接近目标分布。 因此,如果你想在Matlab中实现MCMC算法,你可以参考引用中提供的教程,并使用MH算法作为一个常用的选择。你可以根据你的具体问题和目标概率分布来修改和调整代码以满足你的需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值