Split Bregman迭代介绍及MATLAB实现

Bregman距离

定义一个凸函数 E E E中点 u u u与点 v v v的Bregman距离为
D E p ( u , v ) = E ( u ) − E ( v ) − < p , u − v > D_{E}^{p}\left( u,v \right)=E\left( u \right)-E\left( v \right)-<p,u-v> DEp(u,v)=E(u)E(v)<p,uv>
其中, p p p E E E在点 v v v的次梯度。显然,可以得到类似于距离的性质
非负性: D E p ( u , v ) ≥ 0 D_{E}^{p}\left( u,v \right)\ge 0 DEp(u,v)0
u ≤ w ≤ v u\le w\le v uwv时,有 D E p ( u , v ) ≥ D E p ( w , v ) D_{E}^{p}\left( u,v \right)\ge D_{E}^{p}\left( w,v \right) DEp(u,v)DEp(w,v)

Bregman迭代

考虑如下约束的优化问题
min ⁡ u     E ( u ) + λ H ( u ) \underset{u}{\mathop{\min }}\,\ E\left( u \right)\text{+}\lambda H\left( u \right) umin E(u)+λH(u)
其中, E E E H H H均为凸函数,且 min ⁡ u   H ( u ) = 0 \underset{u}{\mathop{\min }}\,H\left( u \right)=0 uminH(u)=0
可以迭代求解上述问题
u k + 1 = min ⁡ u     D E p ( u , u k ) + λ H ( u ) = min ⁡ u   E ( u ) − < p k , u − u k > + λ H ( u ) \begin{aligned} & {{u}^{k+1}}=\underset{u}{\mathop{\min }}\,\ D_{E}^{p}\left( u,{{u}^{k}} \right)\text{+}\lambda H\left( u \right) \\ & =\underset{u}{\mathop{\min }}\,E\left( u \right)-<{{p}^{k}},u-{{u}^{k}}>\text{+}\lambda H\left( u \right) \end{aligned} uk+1=umin DEp(u,uk)+λH(u)=uminE(u)<pk,uuk>+λH(u)
假设 H H H可微,且 0 ∈ ∂ ( D E p ( u , u k ) + λ H ( u ) ) 0\in \partial \left( D_{E}^{p}\left( u,{{u}^{k}} \right)+\lambda H\left( u \right) \right) 0(DEp(u,uk)+λH(u))表示在 u k + 1 {{u}^{k+1}} uk+1处的次梯度,由于 p k + 1 ∈ ∂ E ( u k + 1 ) {{p}^{k+1}}\in \partial E\left( {{u}^{k+1}} \right) pk+1E(uk+1),那么可以得到
p k + 1 = p k − ∇ H ( u k + 1 ) {{p}^{k+1}}={{p}^{k}}-\nabla H\left( {{u}^{k+1}} \right) pk+1=pkH(uk+1)
事实上,在一般条件的约束下,随着 k k k的增加, H ( u k ) H\left( {{u}^{k}} \right) H(uk)是趋近于0的。当然在 E E E H H H均为凸函数且 H H H可微的条件下还能得到 H ( u ) H\left( u \right) H(u)是单调递减且收敛的。
下面用该方法来解决实际的问题。对于以下约束问题
{ min ⁡ u     E ( u ) s . t .    A u = b \left\{ \begin{aligned} & \underset{u}{\mathop{\min }}\,\ E\left( u \right) \\ & s.t.\ \ Au=b \\ \end{aligned} \right. umin E(u)s.t.  Au=b
可以将其转化为
min ⁡ u     E ( u ) + λ 2 ∥ A u − b ∥ 2 2 \underset{u}{\mathop{\min }}\,\ E\left( u \right)\text{+}\frac{\lambda }{2}\left\| Au-b \right\|_{2}^{2} umin E(u)+2λAub22
利用Bregman迭代可以求解,迭代如下:
u k + 1 = min ⁡ u     D E p ( u , u k ) + λ 2 ∥ A u − b ∥ 2 2 = min ⁡ u   E ( u ) − < p k , u − u k > + λ 2 ∥ A u − b ∥ 2 2 \begin{aligned} & {{u}^{k+1}}=\underset{u}{\mathop{\min }}\,\ D_{E}^{p}\left( u,{{u}^{k}} \right)\text{+}\frac{\lambda }{2}\left\| Au-b \right\|_{2}^{2} \\ & =\underset{u}{\mathop{\min }}\,E\left( u \right)-<{{p}^{k}},u-{{u}^{k}}>\text{+}\frac{\lambda }{2}\left\| Au-b \right\|_{2}^{2} \end{aligned} uk+1=umin DEp(u,uk)+2λAub22=uminE(u)<pk,uuk>+2λAub22
P k + 1 = p k − λ A T ( A u k + 1 − b ) {{P}^{k+1}}={{p}^{k}}-\lambda {{A}^{T}}\left( A{{u}^{k+1}}-b \right) Pk+1=pkλAT(Auk+1b)
其中关于 P k + 1 {{P}^{k+1}} Pk+1的推导如下
∇ H ( u k + 1 ) = ∇ λ 2 ∥ A u k + 1 − b ∥ 2 2 = ∇ λ 2 [ ( A u k + 1 − b ) H ( A u k + 1 − b ) ] = λ 2 ∇ t r [ ( A u k + 1 − b ) H ( A u k + 1 − b ) ] \begin{aligned} & \nabla H\left( {{u}^{k+1}} \right)\text{=}\nabla \frac{\lambda }{2}\left\| A{{u}^{k+1}}-b \right\|_{2}^{2} \\ & =\nabla \frac{\lambda }{2}\left[ {{\left( A{{u}^{k+1}}-b \right)}^{H}}\left( A{{u}^{k+1}}-b \right) \right] \\ & =\frac{\lambda }{2}\nabla tr\left[ {{\left( A{{u}^{k+1}}-b \right)}^{H}}\left( A{{u}^{k+1}}-b \right) \right] \\ \end{aligned} H(uk+1)=2λAuk+1b22=2λ[(Auk+1b)H(Auk+1b)]=2λtr[(Auk+1b)H(Auk+1b)]

d t r [ ( A u k + 1 − b ) H ( A u k + 1 − b ) ] = t r [ ( A d u k + 1 ) H ( A u k + 1 − b ) + ( A u k + 1 − b ) H A d u k + 1 ] = t r [ 2 ( A u k + 1 − b ) H A d u k + 1 ] \begin{aligned} & dtr\left[ {{\left( A{{u}^{k+1}}-b \right)}^{H}}\left( A{{u}^{k+1}}-b \right) \right]=tr\left[ {{\left( Ad{{u}^{k+1}} \right)}^{H}}\left( A{{u}^{k+1}}-b \right)+{{\left( A{{u}^{k+1}}-b \right)}^{H}}Ad{{u}^{k+1}} \right] \\ & =tr\left[ 2{{\left( A{{u}^{k+1}}-b \right)}^{H}}Ad{{u}^{k+1}} \right] \\ \end{aligned} dtr[(Auk+1b)H(Auk+1b)]=tr[(Aduk+1)H(Auk+1b)+(Auk+1b)HAduk+1]=tr[2(Auk+1b)HAduk+1]
因此
∇ [ ( A u k + 1 − b ) H ( A u k + 1 − b ) ] = 2 A T ( A u k + 1 − b ) \nabla \left[ {{\left( A{{u}^{k+1}}-b \right)}^{H}}\left( A{{u}^{k+1}}-b \right) \right]\text{=}2{{A}^{T}}\left( A{{u}^{k+1}}-b \right) [(Auk+1b)H(Auk+1b)]=2AT(Auk+1b)
P k + 1 = p k − λ A T ( A u k + 1 − b ) {{P}^{k+1}}={{p}^{k}}-\lambda {{A}^{T}}\left( A{{u}^{k+1}}-b \right) Pk+1=pkλAT(Auk+1b)
A A A为线性时,上述的迭代过程可以简化为
{ u k + 1 = min ⁡ u     E ( u ) + λ 2 ∥ A u − b k ∥ 2 2 b k + 1 = b k + b − A u k + 1 \left\{ \begin{aligned} & {{u}^{k+1}}=\underset{u}{\mathop{\min }}\,\ E\left( u \right)+\frac{\lambda }{2}\left\| Au-{{b}^{k}} \right\|_{2}^{2} \\ & {{b}^{k+1}}={{b}^{k}}+b-A{{u}^{k+1}} \\ \end{aligned} \right. uk+1=umin E(u)+2λAubk22bk+1=bk+bAuk+1
Bregman迭代有以下优点:
收敛速度比较快,尤其对于 E ( u ) E\left( u \right) E(u) l 1 {{l}_{1}} l1范数正则化。同时,相对于延拓法来说,Bregman迭代中的 λ \lambda λ是一常数,也就说可以选择合适的 λ \lambda λ的值使得迭代过程快速收敛。

Split Bregman迭代

考虑如下问题
{ min ⁡ u , d     ∣ d ∣ + H ( u ) s . t .    d = Φ ( u ) \left\{ \begin{aligned} & \underset{u,d}{\mathop{\min }}\,\ \left| d \right|+H\left( u \right) \\ & s.t.\ \ d=\Phi \left( u \right) \\ \end{aligned} \right. u,dmin d+H(u)s.t.  d=Φ(u)
虽然看似    d = Φ ( u ) \ \ d=\Phi \left( u \right)   d=Φ(u)这一步是多余的,但是在实际中却能起到很重要的作用。
为了解决该问题,可以将其转化为
min ⁡ u , d     ∣ d ∣ + H ( u ) + λ 2 ∥ d − Φ ( u ) ∥ 2 2 \underset{u,d}{\mathop{\min }}\,\ \left| d \right|+H\left( u \right)\text{+}\frac{\lambda }{2}\left\| d-\Phi \left( u \right) \right\|_{2}^{2} u,dmin d+H(u)+2λdΦ(u)22
E ( u , d ) =   ∣ d ∣ + H ( u ) E\left( u,d \right)=\ \left| d \right|+H\left( u \right) E(u,d)= d+H(u) H ( u , d ) = d − Φ ( u ) H\left( u,d \right)=d-\Phi \left( u \right) H(u,d)=dΦ(u),那么该表达式就变成了之前介绍的Bregman迭代的更普遍的形式,可以得到
( u k + 1 , d k + 1 ) = min ⁡ u , d   D E p ( u , u k , d , d k ) + λ 2 ∥ d − Φ ( u ) ∥ 2 2 = min ⁡ u , d   E ( u , d ) − < p u k , u − u k > − < p d k , d − d k > + λ 2 ∥ d − Φ ( u ) ∥ 2 2 \begin{aligned} & \left( {{u}^{k+1}},{{d}^{k+1}} \right)=\underset{u,d}{\mathop{\min }}\,D_{E}^{p}\left( u,{{u}^{k}},d,{{d}^{k}} \right)+\frac{\lambda }{2}\left\| d-\Phi \left( u \right) \right\|_{2}^{2} \\ & =\underset{u,d}{\mathop{\min }}\,E\left( u,d \right)-<p_{u}^{k},u-{{u}^{k}}>-<p_{d}^{k},d-{{d}^{k}}>+\frac{\lambda }{2}\left\| d-\Phi \left( u \right) \right\|_{2}^{2} \end{aligned} (uk+1,dk+1)=u,dminDEp(u,uk,d,dk)+2λdΦ(u)22=u,dminE(u,d)<puk,uuk><pdk,ddk>+2λdΦ(u)22
p u k + 1 = p u k − λ ( ∇ Φ ) T ( Φ u k + 1 − d k + 1 ) p_{u}^{k+1}=p_{u}^{k}-\lambda {{\left( \nabla \Phi \right)}^{T}}\left( \Phi {{u}^{k+1}}-{{d}^{k+1}} \right) puk+1=pukλ(Φ)T(Φuk+1dk+1)
p d k + 1 = p d k − λ ( d k + 1 − Φ u k + 1 ) p_{d}^{k+1}=p_{d}^{k}-\lambda \left( {{d}^{k+1}}-\Phi {{u}^{k+1}} \right) pdk+1=pdkλ(dk+1Φuk+1)
那么可以简化为
( u k + 1 , d k + 1 ) = min ⁡ u , d     ∣ d ∣ + H ( u ) + λ 2 ∥ d − Φ ( u ) − b k ∥ 2 2 \left( {{u}^{k+1}},{{d}^{k+1}} \right)\text{=}\underset{u,d}{\mathop{\min }}\,\ \left| d \right|+H\left( u \right)\text{+}\frac{\lambda }{2}\left\| d-\Phi \left( u \right)-{{b}^{k}} \right\|_{2}^{2} (uk+1,dk+1)=u,dmin d+H(u)+2λdΦ(u)bk22
b k + 1 = b k + ( Φ ( u k + 1 ) − d k + 1 ) {{b}^{k+1}}={{b}^{k}}+\left( \Phi \left( {{u}^{k+1}} \right)-{{d}^{k+1}} \right) bk+1=bk+(Φ(uk+1)dk+1)
显然,为了实现上述迭代过程的计算,必须要解决
( u k + 1 , d k + 1 ) = min ⁡ u , d     ∣ d ∣ + H ( u ) + λ 2 ∥ d − Φ ( u ) − b k ∥ 2 2 \left( {{u}^{k+1}},{{d}^{k+1}} \right)\text{=}\underset{u,d}{\mathop{\min }}\,\ \left| d \right|+H\left( u \right)\text{+}\frac{\lambda }{2}\left\| d-\Phi \left( u \right)-{{b}^{k}} \right\|_{2}^{2} (uk+1,dk+1)=u,dmin d+H(u)+2λdΦ(u)bk22
那么可以将其分为两步迭代(这也是为什么称其为Split Bregman迭代的原因)
第一步:
u k + 1 = min ⁡ u   H ( u ) + λ 2 ∥ d k − Φ ( u ) − b k ∥ 2 2 {{u}^{k+1}}=\underset{u}{\mathop{\min }}\,H\left( u \right)+\frac{\lambda }{2}\left\| {{d}^{k}}-\Phi \left( u \right)-{{b}^{k}} \right\|_{2}^{2} uk+1=uminH(u)+2λdkΦ(u)bk22
第二步:
d k + 1 = min ⁡ d   ∣ d ∣ + λ 2 ∥ d k − Φ ( u k + 1 ) − b k ∥ 2 2 {{d}^{k+1}}=\underset{d}{\mathop{\min }}\,\left| d \right|+\frac{\lambda }{2}\left\| {{d}^{k}}-\Phi \left( {{u}^{k+1}} \right)-{{b}^{k}} \right\|_{2}^{2} dk+1=dmind+2λdkΦ(uk+1)bk22
在第二步中,可以利用收缩算子来进行简化并且提高运算的速度
d k + 1 = s h r i n k ( Φ ( u ) + b k , 1 / λ ) {{d}^{k+1}}=shrink\left( \Phi \left( u \right)+{{b}^{k}},1/\lambda \right) dk+1=shrink(Φ(u)+bk,1/λ)
其中, s h r i n k ( x , y ) = x ∣ x ∣ ∗ max ⁡ ( ∣ x ∣ − y , 0 ) shrink\left( x,y \right)=\frac{x}{\left| x \right|}*\max \left( \left| x \right|-y,0 \right) shrink(x,y)=xxmax(xy,0)
Split Bregman迭代的具体过程为
While ∥ u k − u k − 1 ∥ 2 2 > t h r e s h o l d \left\| {{u}^{k}}-{{u}^{k-1}} \right\|_{2}^{2}>threshold ukuk122>threshold
for n = 1 n=1 n=1 to N N N
u k + 1 = min ⁡ u   H ( u ) + λ 2 ∥ d k − Φ ( u ) − b k ∥ 2 2 {{u}^{k+1}}=\underset{u}{\mathop{\min }}\,H\left( u \right)+\frac{\lambda }{2}\left\| {{d}^{k}}-\Phi \left( u \right)-{{b}^{k}} \right\|_{2}^{2} uk+1=uminH(u)+2λdkΦ(u)bk22
d k + 1 = min ⁡ d   ∣ d ∣ + λ 2 ∥ d k − Φ ( u k + 1 ) − b k ∥ 2 2 {{d}^{k+1}}=\underset{d}{\mathop{\min }}\,\left| d \right|+\frac{\lambda }{2}\left\| {{d}^{k}}-\Phi \left( {{u}^{k+1}} \right)-{{b}^{k}} \right\|_{2}^{2} dk+1=dmind+2λdkΦ(uk+1)bk22
end
b k + 1 = b k + ( Φ ( u k + 1 ) − d k + 1 ) {{b}^{k+1}}={{b}^{k}}+\left( \Phi \left( {{u}^{k+1}} \right)-{{d}^{k+1}} \right) bk+1=bk+(Φ(uk+1)dk+1)
end
经验上 N = 1 N=1 N=1可以使内循环收敛

Split Bregman稀疏信号重构

考虑信号 f f f是稀疏信号 u u u经过线性算子 A A A后得到的,那么可以通过利用 l 1 {{l}_{1}} l1范数正则化从 f f f中恢复出信号 u u u,即
u ^ = arg ⁡ min ⁡   ∥ u ∥ 1 + μ 2 ∥ A u − f ∥ 2 2 \hat{u}=\arg \min \ {{\left\| u \right\|}_{1}}+\frac{\mu }{2}\left\| Au-f \right\|_{2}^{2} u^=argmin u1+2μAuf22
Φ = I \Phi =I Φ=I H ( u ) = μ 2 ∥ A u − f ∥ 2 2 H\left( u \right)=\frac{\mu }{2}\left\| Au-f \right\|_{2}^{2} H(u)=2μAuf22,那么可以使用Split Bregman迭代进行求解,迭代如下:
u k + 1 = min ⁡ u   μ 2 ∥ A u − f ∥ 2 2 + λ 2 ∥ d k − u − b k ∥ 2 2 {{u}^{k+1}}=\underset{u}{\mathop{\min }}\,\frac{\mu }{2}\left\| Au-f \right\|_{2}^{2}+\frac{\lambda }{2}\left\| {{d}^{k}}-u-{{b}^{k}} \right\|_{2}^{2} uk+1=umin2μAuf22+2λdkubk22
d k + 1 = min ⁡ d   ∥ d ∥ 1 + λ 2 ∥ d k − u k + 1 − b k ∥ 2 2 {{d}^{k+1}}=\underset{d}{\mathop{\min }}\,{{\left\| d \right\|}_{1}}+\frac{\lambda }{2}\left\| {{d}^{k}}-{{u}^{k+1}}-{{b}^{k}} \right\|_{2}^{2} dk+1=dmind1+2λdkuk+1bk22
b k + 1 = b k + u k + 1 − d k + 1 {{b}^{k+1}}={{b}^{k}}+{{u}^{k+1}}-{{d}^{k+1}} bk+1=bk+uk+1dk+1
为了解决 u k + 1 {{u}^{k+1}} uk+1,通过对其求导,令倒数为0,可以得到
∂ ( μ 2 ∥ A u − f ∥ 2 2 + λ 2 ∥ d k − u − b k ∥ 2 2 ) = 0 \partial \left( \frac{\mu }{2}\left\| Au-f \right\|_{2}^{2}+\frac{\lambda }{2}\left\| {{d}^{k}}-u-{{b}^{k}} \right\|_{2}^{2} \right)=0 (2μAuf22+2λdkubk22)=0

μ A ∗ ( A u k + 1 − f ) − λ ( d k − u k + 1 − b k ) = 0 \mu {{A}^{*}}\left( A{{u}^{k+1}}-f \right)-\lambda \left( {{d}^{k}}-{{u}^{k+1}}-{{b}^{k}} \right)=0 μA(Auk+1f)λ(dkuk+1bk)=0
因此
u k + 1 = ( μ A ∗ A + λ I ) − 1 ( μ A ∗ f + λ ( d k − b k ) ) {{u}^{k+1}}={{\left( \mu {{A}^{*}}A+\lambda I \right)}^{-1}}\left( \mu {{A}^{*}}f+\lambda \left( {{d}^{k}}-{{b}^{k}} \right) \right) uk+1=(μAA+λI)1(μAf+λ(dkbk))
d k + 1 {{d}^{k+1}} dk+1可以通过收缩算子进行求解
d k + 1 = s h r i n k ( u k + 1 + b k , 1 / λ ) {{d}^{k+1}}=shrink\left( {{u}^{k+1}}+{{b}^{k}},1/\lambda \right) dk+1=shrink(uk+1+bk,1/λ)
因此,利用Split Bregman进行稀疏信号重构的过程为
初始化 d 0 = b 0 = 0 {{d}^{0}}={{b}^{0}}=0 d0=b0=0
While ∥ u k − u k − 1 ∥ 2 2 > t h r e s h o l d \left\| {{u}^{k}}-{{u}^{k-1}} \right\|_{2}^{2}>threshold ukuk122>threshold
u k + 1 = ( μ A ∗ A + λ I ) − 1 ( μ A ∗ f + λ ( d k − b k ) ) {{u}^{k+1}}={{\left( \mu {{A}^{*}}A+\lambda I \right)}^{-1}}\left( \mu {{A}^{*}}f+\lambda \left( {{d}^{k}}-{{b}^{k}} \right) \right) uk+1=(μAA+λI)1(μAf+λ(dkbk))
d k + 1 = s h r i n k ( u k + 1 + b k , 1 / λ ) {{d}^{k+1}}=shrink\left( {{u}^{k+1}}+{{b}^{k}},1/\lambda \right) dk+1=shrink(uk+1+bk,1/λ)
b k + 1 = b k + u k + 1 − d k + 1 {{b}^{k+1}}={{b}^{k}}+{{u}^{k+1}}-{{d}^{k+1}} bk+1=bk+uk+1dk+1
k = k + 1 k=k+1 k=k+1
end

仿真参数

参数名称参数值
稀疏度12
信号长度256
λ \lambda λ1
μ \mu μ10

仿真结果

在这里插入图片描述

从图中可以看出,经过Split Bregman重构后的信号基本与原始稀疏信号一致,达到了较好的效果。同时也可以通过重构信号与原始信号之间的误差来评价该方法的性能。
代码如下:
主函数

clear;
close all;
clc;
M = 256;            %观测值个数
N = 256;            %信号x的长度
K = 12;             %信号x的稀疏度
lambda=1;           %正则化参数
mu=10;
x = zeros(N,1);        
Index_K = randperm(N);    
x(Index_K(1:K)) = 5*randn(K,1);     %构造稀疏信号
A=randn(M,M);                            %观测矩阵
y=A*x;
x_re=L1_SplitBregmanIteration(y,A,mu,lambda);   %利用Split Bregman进行稀疏信号重构
figure(1);
plot(x_re,'k.-');
hold on;
plot(x,'r');
legend('重构信号','原始信号')

L1_SplitBregmanIteration.m

function u=L1_SplitBregmanIteration(f,A,mu,lambda)
%======================================
%
% L1 Split Bregman Iteration
% This function compute the solution
% u = arg min |u|+0.5*mu||Au-f||_2^2
%
% by using the Split Bregman Iteration
%
% In this version we consider only
% the case where A is a square matrix
%
% f: measured data
% A: some linear operator in its matrix
% form
% mu: regularization coefficient
% lambda: "spliting" regularization
% coefficient
% Author: Jerome Gilles
% Institution: UCLA - Math Department
% email: jegilles@math.ucla.edu
%
% Note: typically mu=10, lambda=1,
% eps=0.01 work well
%======================================
N=size(f,1);
d=zeros(N,1);
b=zeros(N,1);
u=zeros(N,1);
Z=zeros(N,1);
Ft=mu*A'*f;
IV=inv(mu*A'*A+lambda*eye(N));
up=ones(N,1);
while ((u-up)'*(u-up))>eps
    up=u; %store the previous iteration
    u=IV*(Ft+lambda*(d-b)); %update u
    tmp=u+b;
    d=sign(tmp).*max(Z,abs(tmp)-1/lambda); %update d
    b=tmp-d; %update b
end

参考文献
[1] Goldstein T, Osher S. The split Bregman method for L1-regularized problems[J]. SIAM journal on imaging sciences, 2009, 2(2): 323-343.
[2]Gilles J, Osher S. Bregman implementation of Meyer’s G-norm for cartoon+ textures decomposition[J]. UCLA Cam Report, 2011: 11-73.
[3] Bush J. Bregman algorithms[J]. Senior Thesis. University of California, Santa Barbara, 2011.
[4] Yin W, Osher S, Goldfarb D, et al. Bregman iterative algorithms for ℓ 1 \ell_1 1-minimization with applications to compressed sensing[J]. SIAM Journal on Imaging sciences, 2008, 1(1): 143-168.

  • 3
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值