机器学习(周志华) 第八章集成学习

关于周志华老师的《机器学习》这本书的学习笔记
记录学习过程
本博客记录Chapter8

1 个体与集成

集成学习(ensemble learning):通过构建多个学习器来完成学习的任务。可以分成同质集成/异质集成。

  • 同质集成(homogeneous):个体学习器都是同种类型的。该类型中个体学习器称为“基学习器”(base learning algorithm)。
  • 异质集成(heterogeneous):包含不同类型的个体学习器。该类型中个体学习器称为“组件学习器”(component learner)。

image.png

集成学习通过将多个学习器进行结合,可获得比单一学习器显著优越的泛化性能,这对弱学习器更为明显(弱学习器是泛化性能略优于随即猜测的学习器)。

一般经验中,如果把好坏不等的东西掺和到一起,那么通常结果会是比最好的差一点,比最差的好一点。集成学习能获得好于最好的单一学习器的性能的原因如下:考虑二分类问题,集成学习的结果通过投票法来产生,即少数服从多数要获得好的集成,个体学习器应该“好而不同”:即个体学习器要有一定的准确性,同时要有多样性(diversity),学习器之间应该具有差异。

image.png

++++++++++++++++++++++++++++++++++++++++++++++++++++++++

简单分析,考虑对于二分类问题 y ∈ { − 1 , + 1 } y\in \{-1,+1\} y{1,+1}和真实函数 f f f,假定基分类器的错误率为 ϵ \epsilon ϵ,即对每个基分类器有:
P ( h i ( x ) ≠ f ( x ) ) = ϵ P(h_i(x)\neq f(x))=\epsilon P(hi(x)=f(x))=ϵ
假设通过简单投票法结合 T T T个基分类器,若有超过半数的基分类器分类正确,则集成分类就正确:
F ( x ) = s i g n ( ∑ i = 1 T h i ( x ) ) F(x)=sign(\sum_{i=1}^T h_i(x)) F(x)=sign(i=1Thi(x))
假设基分类器的错误率相互独立,则由Hoeffding不等式有,集成错误率为

P ( F ( x ) ≠ f ( x ) ) = ∑ k = 0 [ T / 2 ] C T k ( 1 − ϵ ) k ϵ T − k ≤ e − 1 2 T ( 1 − 2 ϵ ) 2 P(F(x)\neq f(x)) =\sum_{k=0}^{[T/2]} C_T^k(1-\epsilon)^k\epsilon^{T-k}\\ \le e^ { -\displaystyle\frac{1}{2}T(1-2\epsilon)^2} P(F(x)=f(x))=k=0[T/2]CTk(1ϵ)kϵTke21T(12ϵ)2

上式体现出,随着个体分类器数目 T T T的增大,集成错误率将指数级下降,最终趋向于0。但我们要注意到假设中基学习器的误差相互独立,在现实任务中,个体学习器是为了解决同一个问题训练出来的,因此显然不会相互独立。所以如何产生并结合“好而不同”的学习器,是集成学习研究的核心。

根据个体学习器的生成方式,目前的集成学习方法大致可分为两大类:

  • 个体学习器间存在强依赖关系、必须串行生成的序列化方法:Boosting
  • 个体学习器间不存在强依赖关系、可同时生成的并行化方法:Bagging和“随机森林”(Random Forest)。

2 Boosting

Boosting算法的工作机制类似:先根据初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复,直到基学习器的数目先到达 T T T,最终将 T T T个学习器进行加权结合。

Boosting族算法中的代表算法是AdaBoost算法。可以采用“加性模型”,即基学习器的线性组合
H ( x ) = ∑ i = 1 T α i h t ( x ) H(x)=\sum_{i=1}^T \alpha_ih_t(x) H(x)=i=1Tαiht(x)
来最小化指数损失函数:
ϑ e x p ( H ∣ D ) = E x ∼ D [ e − f ( x ) H ( x ) ] \vartheta_{exp}(H|D)=E_{x\sim D}[e^{-f(x)H(x)}] ϑexp(HD)=ExD[ef(x)H(x)]
该损失函数是指,若 f ( x ) f(x) f(x) H ( x ) H(x) H(x)的预测结果一致,则其乘积为1,其负数的指数就会越小。

H ( x ) H(x) H(x)能使得指数损失函数最小,则对指数损失函数求 H ( x ) H(x) H(x)的偏导:
∂ ϑ e x p ( H ∣ D ) ∂ H ( x ) = − e − H ( x ) P ( f ( x ) = 1 ∣ x ) + e H ( x ) P ( f ( x ) = − 1 ∣ x ) \frac{\partial \vartheta_{exp}(H|D)}{\partial H(x)}=-e^{-H(x)}P(f(x)=1|x)+e^{H(x)}P(f(x)=-1|x) H(x)ϑexp(HD)=eH(x)P(f(x)=1x)+eH(x)P(f(x)=1x)
令偏导为0可得:
H ( x ) = 1 2 ln ⁡ P ( f ( x ) = 1 ∣ x ) P ( f ( x ) = − 1 ∣ x ) H(x)=\frac{1}{2} \ln \frac{P(f(x)=1|x)}{P(f(x)=-1|x)} H(x)=21lnP(f(x)=1x)P(f(x)=1x)
因此有:
s i g n ( H ( x ) ) = { 1     , P ( f ( x ) = 1 ∣ x ) > P ( f ( x ) = − 1 ∣ x ) − 1 , P ( f ( x ) = 1 ∣ x ) < P ( f ( x ) = − 1 ∣ x )      = arg ⁡ max ⁡ y ∈ { 1 , − 1 } P ( f ( x ) = y ∣ x ) sign(H(x)) = \begin{cases} 1\space \space \space ,P(f(x)=1|x)>P(f(x)=-1|x)\\ -1,P(f(x)=1|x)< P(f(x)=-1|x) \end{cases}\\ \space\space \space \space = \mathop{\arg \max}_{y\in \{1,-1\}}P(f(x)=y|x) sign(H(x))={1   ,P(f(x)=1x)>P(f(x)=1x)1,P(f(x)=1x)<P(f(x)=1x)    =argmaxy{1,1}P(f(x)=yx)
这意味着 s i g n ( H ( x ) ) sign(H(x)) sign(H(x))达到了贝叶斯最优错误率。即指数损失函数可以替代原本的0/1损失函数。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++

再AdaBoost算法中,第一个基分类器 h 1 h_1 h1是直接将基学习算法用于初始数据分布得到的。此后迭代地生产 h t h_t ht α t \alpha_t αt,当基分类器 h t h_t ht基于分布 D t D_t Dt产生后,该分类器的权重 α t \alpha_t αt应该使得 α t h t \alpha_th_t αtht最小化指数损失函数:
ϑ e x p ( α t h t ∣ D t ) = E x ∼ D t [ e − f ( x ) α t h t ( x ) ] = E x ∼ D t [ e − α t Ⅱ ( f ( x ) = h t ( x ) ) + [ e α t Ⅱ ( f ( x ) ≠ h t ( x ) ) ] = e − α t P x ∼ D t ( f ( x ) = h t ( x ) ) + e α t P x ∼ D t ( f ( x ) ≠ h t ( x ) ) = e − α t ( 1 − ϵ t ) + e α t ϵ t \vartheta_{exp}(\alpha_th_t|D_t) =E_{x\sim D_t}[e^{-f(x)\alpha_t h_t(x)}] =E_{x\sim D_t}[e^{-\alpha_t}Ⅱ(f(x)=h_t(x))+[e^{\alpha_t}Ⅱ(f(x)\neq h_t(x))]\\ =e^{-\alpha_t}P_{x\sim D_t}(f(x)=h_t(x))+e^{\alpha_t}P_{x\sim D_t}(f(x)\neq h_t(x)) =e^{-\alpha_t}(1-\epsilon_t)+e^{\alpha_t}\epsilon_t ϑexp(αthtDt)=ExDt[ef(x)αtht(x)]=ExDt[eαt(f(x)=ht(x))+[eαt(f(x)=ht(x))]=eαtPxDt(f(x)=ht(x))+eαtPxDt(f(x)=ht(x))=eαt(1ϵt)+eαtϵt

对指数损失函数求导:
∂ ϑ e x p ( α t h t ∣ D t ) ∂ α t = − e − α t ( 1 − ϵ t ) + e α t ϵ t \frac{\partial \vartheta_{exp}(\alpha_th_t|D_t) }{\partial \alpha_t}=-e^{-\alpha_t(1-\epsilon_t)+e^{\alpha_t}\epsilon_t} αtϑexp(αthtDt)=eαt(1ϵt)+eαtϵt
令上式为0,得到权重更新公式:
α t = 1 2 ln ⁡ ( 1 − ϵ t ϵ t ) \alpha_t=\frac{1}{2}\ln (\frac{1-\epsilon_t}{\epsilon_t}) αt=21ln(ϵt1ϵt)

+++

AdaBoost算法在得到 H t − 1 H_{t-1} Ht1之后样本分布将进行调整,使得下一轮的基学习器 h t h_t ht能够纠正 H t − 1 H_{t-1} Ht1的一些错误。方法是最小化 ϑ ( H t − 1 + α t h t ∣ D ) \vartheta(H_{t-1}+\alpha_th_t|D) ϑ(Ht1+αthtD),可以简化为:
ϑ ( H t − 1 + α t h t ∣ D ) = E x ∼ D [ e − f ( x ) ( H t − 1 ( x ) + h t ( x ) ) ] = E x ∼ D [ e − f ( x ) H t − 1 ( x ) e − f ( x ) h t ( x ) ] \vartheta(H_{t-1}+\alpha_th_t|D) =E_{x\sim D}[e^{-f(x)(H_{t-1}(x)+h_t(x))}]\\ =E_{x\sim D}[e^{-f(x)H_{t-1}(x)}e^{-f(x)h_t(x)}] ϑ(Ht1+αthtD)=ExD[ef(x)(Ht1(x)+ht(x))]=ExD[ef(x)Ht1(x)ef(x)ht(x)]
注意到 f 2 ( x ) = h t 2 ( x ) = 1 f^2(x)=h_t^2(x)=1 f2(x)=ht2(x)=1,用 e − f ( x ) h t ( x ) e^{-f(x)h_t(x)} ef(x)ht(x)泰勒展开得到:
ϑ ( H t − 1 + α t h t ∣ D ) = E x ∼ D [ e − f ( x ) H t − 1 ( x ) ( 1 − f ( x ) h t ( x ) + f 2 ( x ) h t 2 ( x ) 2 ) ] = E x ∼ D [ e − f ( x ) H t − 1 ( x ) ( 1 − f ( x ) h t ( x ) + 1 2 ) ] \vartheta(H_{t-1}+\alpha_th_t|D) =E_{x\sim D}[e^{-f(x)H_{t-1}(x)}(1-f(x)h_t(x)+\frac{f^2(x)h_t^2(x)}{2})]\\ =E_{x\sim D}[e^{-f(x)H_{t-1}(x)}(1-f(x)h_t(x)+\frac{1}{2})] ϑ(Ht1+αthtD)=ExD[ef(x)Ht1(x)(1f(x)ht(x)+2f2(x)ht2(x))]=ExD[ef(x)Ht1(x)(1f(x)ht(x)+21)]
于是理想的基学习器
h t ( x ) = arg ⁡ max ⁡ h   E x ∼ D [ e − f ( x ) H t − 1 ( x ) E x ∼ D [ e − f ( x ) H t − 1 ( x ) ] f ( x ) h ( x ) ) ] h_t(x)=\mathop{\arg \max}_{h}\space E_{x\sim D}[\frac{e^{-f(x)H_{t-1}(x)}}{E_{x\sim D}[e^{-f(x)H_{t-1}(x)}]}f(x)h(x))] ht(x)=argmaxh ExD[ExD[ef(x)Ht1(x)]ef(x)Ht1(x)f(x)h(x))]
D t D_t Dt表示一个分布,有
D t = D ( x ) e − f ( x ) H t − 1 ( x ) E x ∼ D [ e − f ( x ) H t − 1 ( x ) ] D t + 1 ( x ) = D t ( x ) ⋅ e − f ( x ) α t h t ( x ) E x ∼ D [ e − f ( x ) H t − 1 ( x ) ] E x ∼ D [ e − f ( x ) H t ( x ) ] D_t=\frac{D(x)e^{-f(x)H_{t-1}(x)}}{E_{x\sim D}[e^{-f(x)H_{t-1}(x)}]}\\ \\ D_{t+1}(x)=D_t(x) \cdot e^{-f(x)\alpha_th_t(x)}\frac{E_{x\sim D}[e^{-f(x)H_{t-1}(x)}]}{E_{x\sim D}[e^{-f(x)H_t(x)}]} Dt=ExD[ef(x)Ht1(x)]D(x)ef(x)Ht1(x)Dt+1(x)=Dt(x)ef(x)αtht(x)ExD[ef(x)Ht(x)]ExD[ef(x)Ht1(x)]
理想的 h t h_t ht将在分布 D t D_t Dt下最小化分类误差。因此弱分类器将基于分布 D t D_t Dt来训练。且针对 D t D_t Dt的分类误差应该小于0.5。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++

综上,我们推导了权重更新公式、分布更新公式、损失函数,得到AdaBoost的完整过程:

image.png

Boosting算法要求基学习器能对特定的数据分布进行学习,这可通过 “重赋权法”(re-weighting) 实施,即在训练过程的每一轮中, 根据样本分布为每个训练样本重新赋予一个权重。对无法接受带权样本的基学习算法,则可通过 “重采样法”(re-sampling) 来处理,即在每一轮学习中,根据样本分布对训练集重新进行采样,再用重采样而得的样本集对基学习器进行训练。

一般而言,这两种做法没有显著的优劣差别。需注意的是,Boosting算法在训练的每一轮都要检查当前生成的基学习器是否满足基本条件(例如检查当前基分类器是否是比随机猜测好),一旦条件不满足,则当前基学习器即被抛弃,且学习过程停止.在此种情形下,初始设置的学习轮数T也许还远未达到,可能导致最终集成中只包含很少的基学习器而性能不佳。若采用“重采样法”,则可获得“重启动”机会以避免训练过程过早停止,即在拋弃不满足条件的当前基学习器之后,可根据当前分布重新对训练样本进行采样,再基于新的采样结果重新训练出基学习器,从而使得学习过程可以持续到预设的T轮完成。

偏差-方差分解的角度看,Boosting主要关注降低偏差,因此Boosting能基于泛化性能相当弱的学习器构建出很强的集成。

3 Bagging与随机森林

欲得到泛化性能强的集成,集成中的个体学习器应该尽可能相互独立。可以采用相互有交叠的采样子集训练不同的基学习器。

3.1 Bagging

Bagging是并行式集成学习方法最著名的代表。直接基于自主采样法(bootstrap sampling,每次随机从样本集中抽取一个样本,再把样本放回初始数据集)。初始训练集中约有63.2%的样本出现在采样集。

按照该方法,我们可以采样出 T T T个含有 m m m个训练样本的采样集,基于每个采样集训练出一个基学习器。Bagging往往采用 简单投票法(分类)/简单平均法(回归) 对多个基学习器的结果进行决策。从偏差-方差分解的角度看,Bagging主要关注降低方差,因此它在不剪枝决策树、神经网络等易受样本扰动的学习器上效用更为明显。

image.png

3.2 随机森林

随即森林(Random Forest)是Bagging的基础上的一个扩展变体。其在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择。

具体来说,就是传统决策书在选择划分属性时是根据当前结点的属性集合中选择一个最优属性;在随机森林中,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含 k k k个属性的子集,再从这个子集中选择一个最优属性进行划分。这里的参数 k k k控制了随机性的引入程度。一般情况,推荐 k = log ⁡ 2 d k=\log_2d k=log2d

随机森林简单、容易实现、计算开销小,令人惊奇的是,它在很多现实任务中展现出强大的性能,被誉为“代表集成学习技术水平的方法”。可以看出,随机森林对Bagging只做了小改动,但是与Bagging中基学习器的“多样性”仅通过样本扰动(通过对初始训练集采样)而来不同,随机森林中基学习器的多样性不仅来自样本扰动,还来自属性扰动,这就使得最终集成的泛化性能可通过个体学习器之间差异度的增加而进一步提升。

4 组合策略

假定集成包含 T T T个学习器 { h 1 , h 2 , … , h T } \{h_1,h_2,…,h_T\} {h1,h2,,hT},其中 h i h_i hi在示例 x x x上的输出为 h i ( x ) h_i(x) hi(x)

4.1 平均法

简单平均法:
H ( x ) = 1 T ∑ i = 1 T h i ( x ) H(x)=\frac{1}{T}\sum_{i=1}^Th_i(x) H(x)=T1i=1Thi(x)
加权平均法:
H ( x ) = ∑ i = 1 T w i h i ( x ) H(x)=\sum_{i=1}^T w_ih_i(x) H(x)=i=1Twihi(x)

4.2 投票法

绝对多数投票法:若某标记得票过半,则预测为该标记。提供了拒绝预测,对于可靠性要求较高的学习任务是一个很好的机制。

相对多数投票法:得票最多的标记

加权投票法:
H ( x ) = C arg ⁡ max ⁡ j ∑ i = 1 T w i h i j ( x ) H(x)=C_{\mathop{\arg \max}_j\sum_{i=1}^Tw_ih_i^j(x)} H(x)=Cargmaxji=1Twihij(x)

4.3 学习法

当训练数据很多时,一种更为强大的结合策略是使用“学习法”,即通过另一个学习器来进行结合。Stacking是学习法的典型代表。这里我们把个体学习器称为初级学习器,用于结合的学习器称为次级学习器或元学习器(meta-learner)。

Stacking先从初始数据集训练出初级学习器,然后“生成”一个新数据集用于训练次级学习器。在这个新数据集中,初级学习器的输出被当作样例输入特征,而初始样本的标记仍被当作样例标记。

image.png

有研究表明,采用初基学习器的输出类概率作为茨基学习器的输入属性,用多响应线性回归(Multi-response Linear Regression, MLR)作为次级学习算法的效果较好。

5 多样性

5.1 误差-分歧分解

假定我们用个体学习器 h 1 , h 2 , … , h T h_1,h_2,…,h_T h1,h2,,hT通过加权平均法结合产生的集成完成回归学习任务 f : R d ↦ R f:R^d\mapsto R f:RdR,对示例 x x x,定义学习器 h i h_i hi的**“分歧”**为:
A ( h i ∣ x ) = ( h i ( x ) − H ( x ) ) 2 A(h_i|x)=(h_i(x)-H(x))^2 A(hix)=(hi(x)H(x))2

集成的分歧为:

$$
\bar A(h|x)=\sum_{i=1}^Tw_iA(h_i|x)\
=\sum_{i=1}Tw_i(h_i(x)-H(x))2

$$

分歧表示的是个体学习器在样本 x x x上的不一致性,即在一定程度上反映了个体学习器的多样性。个体学习器和集成的平方误差分别为:

E ( h i ∣ x ) = ( f ( x ) − h i ( x ) ) 2 E ( H ∣ x ) = ( f ( x ) − H ( x ) ) 2 E(h_i|x)=(f(x)-h_i(x))^2\\ E(H|x)=(f(x)-H(x))^2 E(hix)=(f(x)hi(x))2E(Hx)=(f(x)H(x))2
E ˉ ( h ∣ x ) = ∑ i = 1 T w i E ( h i ∣ x ) \bar E(h|x)=\sum_{i=1}^Tw_iE(h_i|x) Eˉ(hx)=i=1TwiE(hix)表示个体学习器误差的加权均值,有
$$

\bar A(h|x)=\sum_{i=1}^Tw_iE(h_i|x)-E(H|x)\
=\bar E(h|x)-E(H|x)

$$

p ( x ) p(x) p(x)表示样本的概率密度,则在全样本上有
∑ i = 1 T w i ∫ A ( h i ∣ x ) p ( x ) d x = ∑ i = 1 T w i ∫ E ( h i ∣ x ) p ( x ) d x − ∫ E ( H ∣ x ) p ( x ) d x \sum_{i=1}^Tw_i\int A(h_i|x)p(x)dx=\sum_{i=1}^Tw_i\int E(h_i|x)p(x)dx- \int E(H|x)p(x)dx i=1TwiA(hix)p(x)dx=i=1TwiE(hix)p(x)dxE(Hx)p(x)dx
类似的,个体学习器在全样本上的泛化误差和分歧项分别为:
E i = ∫ E ( h i ∣ x ) p ( x ) d x A i = ∫ A ( h i ∣ x ) p ( x ) d x E_i=\int E(h_i|x)p(x)dx\\ A_i=\int A(h_i|x)p(x)dx Ei=E(hix)p(x)dxAi=A(hix)p(x)dx
集成的泛化误差为
E = ∫ E ( H ∣ x ) p ( x ) d x E=\int E(H|x)p(x)dx E=E(Hx)p(x)dx
E ˉ = ∑ i = 1 T w i E i ,    A ˉ = ∑ i = 1 T w i A i \bar E=\sum_{i=1}^Tw_iE_i,\space\space \bar A=\sum_{i=1}^Tw_iA_i Eˉ=i=1TwiEi,  Aˉ=i=1TwiAi表示个体学习器的加权分歧值,有
E = E ˉ − A ˉ E=\bar E-\bar A E=EˉAˉ
该式表示:个体学习器的准确性越高,多样性越大,则集成越好。但我们很难直接通过“误差-分歧分解”来优化目标,因为 A ˉ \bar A Aˉ不是一个可直接操作的多样性度量,尽在集成构造好之后才进行估计。且上面的推导只适用回归,不适用分类。

5.2 多样性度量

多样性度量(diversity measure):估算个体学习器的多样化程度。常用做法是考虑个体分类器的两两相似/不相似性。

给定数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x m , y m ) } D=\{(x_1,y_1),(x_2,y_2),…,(x_m,y_m)\} D={(x1,y1),(x2,y2),,(xm,ym)},对二分类任务, y i ∈ { + 1 , − 1 } y_i\in \{+1,-1\} yi{+1,1},分类器 h i h_i hi h j h_j hj的预测结果列联表为:

h i = + 1 h_i=+1 hi=+1 h i = − 1 h_i=-1 hi=1
h j h_j hj=+1 a a a c c c
h j = − 1 h_j=-1 hj=1 b b b d d d

其中, a a a表示两个分类器预测结果均为+1的样本数目,且 a + b + c + d = m a+b+c+d=m a+b+c+d=m,常用的多样性度量:

  • 不合度量:
    d i s i j = b + c m dis_{_ij}=\frac{b+c}{m} disij=mb+c

  • 相关系数:
    ρ i j = a d − b c ( a + b ) ( a + c ) ( c + d ) ( b + d ) \rho_{_ij}=\frac{ad-bc}{\sqrt{(a+b)(a+c)(c+d)(b+d)}} ρij=(a+b)(a+c)(c+d)(b+d) adbc

  • Q-统计量:
    Q i j = a d − b c a d + b c Q_{_ij}=\frac{ad-bc}{ad+bc} Qij=ad+bcadbc

  • κ \kappa κ-统计量: p 1 p_1 p1是分类器取得一致的概率, p 2 p_2 p2是分类器偶然达成一致的概率。
    κ = p 1 − p 2 1 − p 2 p 1 = a + d m p 2 = ( a + b ) ( a + c ) + ( c + d ) ( b + d ) m 2 \kappa=\frac{p_1-p_2}{1-p_2}\\ p_1=\frac{a+d}{m}\\ p_2=\frac{(a+b)(a+c)+(c+d)(b+d)}{m^2} κ=1p2p1p2p1=ma+dp2=m2(a+b)(a+c)+(c+d)(b+d)

5.3 多样性增强

  • 数据样本扰动:例如Bagging中采用自主采样,AdaBoost中采用序列采样
  • 输入属性扰动:随机森林,每次随机抽取 k k k个属性……
  • 输出表示扰动:翻转法(随机该百年一些训练样本的标记);输出调制法(将分类输出转化为回归输出)等等
  • 算法参数扰动:神经网络中的隐层神经元数量……
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值