机器学习笔记(二)——线性回归

线性回归

给定数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x m , y m ) } D = \{ ({x_1},{y_1}),({x_2},{y_2}), \cdots ,({x_m},{y_m})\} D={(x1,y1),(x2,y2),,(xm,ym)},其中 x i = ( x i 1 ; x i 2 ; ⋯   ; x i d ) x_i=(x_{i1};x_{i2};\cdots;x_{id}) xi=(xi1;xi2;;xid), y i ∈ R . y_i\in R. yiR.线性回归试(linear regression)图学得一个线性模型以尽可能的准确的预测实值输出标记。

这里 x i x_i xi表示数据集中第 i i i个样本,该样本总共有 d d d个特征。

1.单变量线性回归

由于是单变量,输入的样本特征只有一个,此时我们忽略关于样本特征的下标,即 D = { ( x i , y i ) } i = 1 m D = \{ ({x_i},{y_i})\} _{i = 1}^m D={(xi,yi)}i=1m,其中 x i ∈ R {x_i} \in R xiR。对于离散属性,若特征值间存在“序”(order)关系,可通过连续化将其转化为连续值。
线性回归试图学得
f ( x i ) = w x i + b , 使 得 f ( x i ) ≃ y i f({x_i}) = w{x_i} + b,使得f({x_i}) \simeq {y_i} f(xi)=wxi+b,使f(xi)yi
确定 w w w b b b的值,关键在于如何衡量 f ( x ) f(x) f(x) y y y之间的差异,而均方误差则是回归任务中最常用的性能度量,因此需要让均方误差最小化,即 w w w b b b的解 w ∗ 与 b ∗ {w^*}与{b^*} wb
( w ∗ , b ∗ ) = arg ⁡ min ⁡ ( w , b ) ∑ i = 1 m ( f ( x i ) − y i ) 2 = arg ⁡ min ⁡ ( w , b ) ∑ i = 1 m ( y i − w x i − b ) 2 \begin{aligned} ({w^*},{b^*}) &= \mathop {\arg \min }\limits_{(w,b)} \sum\limits_{i = 1}^m {{{(f({x_i}) - {y_i})}^2}} \\ & = \mathop {\arg \min }\limits_{(w,b)} \sum\limits_{i = 1}^m {{{({y_i} - w{x_i} - b)}^2}} \end{aligned} (w,b)=(w,b)argmini=1m(f(xi)yi)2=(w,b)argmini=1m(yiwxib)2

均方误差的几何意义对应于欧几里得距离即“欧氏距离”,而基于均方误差最小化来进行模型求解的方法则是“最小二乘法”,“最小二乘法”实质上就是找到一条直线,使所有样本数据到该直线的欧式距离之和最小,即误差最小。
求解 w w w b b b是使代价函数 J ( w , b ) = 1 2 ∑ i = 1 m ( y i − w x i − b ) 2 {J{(w,b)}} =\frac{1}{2} \sum\limits_{i = 1}^m {{{({y_i} - w{x_i} - b)}^2}} J(w,b)=21i=1m(yiwxib)2最小化的过程, J ( w , b ) {J{(w,b)}} J(w,b)是关于 w w w b b b的凸函数,当它关于 w w w b b b的导数均为0时,得到 w w w b b b的最优解。得到
∂ J ( w , b ) ∂ w = w ∑ i = 1 m x i 2 − ∑ i = 1 m ( y i − b ) x i ∂ J ( w , b ) ∂ b = ∑ i = 1 m b − ∑ i = 1 m y i + ∑ i = 1 m w x i = m b − ∑ i = 1 m ( y i − w x i ) \begin{aligned} \frac{{\partial {J{(w,b)}}}}{{\partial w}} &= w\sum\limits_{i = 1}^m {{x_i}^2 - } \sum\limits_{i = 1}^m {({y_i} - b){x_i}} \\ \frac{{\partial {J{(w,b)}}}}{{\partial b}} &= \sum\limits_{i = 1}^m b - \sum\limits_{i = 1}^m {{y_i} + \sum\limits_{i = 1}^m {w{x_i}} }= mb - \sum\limits_{i = 1}^m {({y_i} - w{x_i}} ) \end{aligned} wJ(w,b)bJ(w,b)=wi=1mxi2i=1m(yib)xi=i=1mbi=1myi+i=1mwxi=mbi=1m(yiwxi)
然后令 ∂ J ( w , b ) ∂ w \frac{{\partial {J{(w,b)}}}}{{\partial w}} wJ(w,b) ∂ J ( w , b ) ∂ b \frac{{\partial {J{(w,b)}}}}{{\partial b}} bJ(w,b)等于0可以得到 w w w b b b最优解
w = ∑ i = 1 m y i ( x i − x ‾ ) ∑ i = 1 m x i 2 − 1 m ( ∑ i = 1 m x i ) 2 ( 注 : x ‾ = 1 m ∑ i = 1 m x i ) b = 1 m ∑ i = 1 m ( y i − w x i ) \begin{aligned} w &= \frac{{\sum\limits_{i = 1}^m {{y_i}({x_i} - \overline x )} }}{{\sum\limits_{i = 1}^m {x_i^2} - \frac{1}{m}{{(\sum\limits_{i = 1}^m {{x_i}} )}^2}}}(注:\overline x = \frac{1}{m}\sum\limits_{i = 1}^m {{x_i}} ) \\ b &= \frac{1}{m}\sum\limits_{i = 1}^m {({y_i} - w{x_i})} \end{aligned} wb=i=1mxi2m1(i=1mxi)2i=1myi(xix)(x=m1i=1mxi)=m1i=1m(yiwxi)

2.推广到一般情形——多元线性回归

例如文章开头的线性回归描述,数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x m , y m ) } D = \{ ({x_1},{y_1}),({x_2},{y_2}), \cdots ,({x_m},{y_m})\} D={(x1,y1),(x2,y2),,(xm,ym)},其中 x i = ( x i 1 ; x i 2 ; ⋯   ; x i d ) x_i=(x_{i1};x_{i2};\cdots;x_{id}) xi=(xi1;xi2;;xid), y i ∈ R . y_i\in R. yiR.,样本由 d d d个特征,此时我们试图学得
f ( x i ) = w x i + b , 使 得 f ( x i ) ≃ y i f({x_i}) = w{x_i} + b,使得f({x_i}) \simeq {y_i} f(xi)=wxi+b,使f(xi)yi
这称为“多元线性回归”。
同样可以利用最小二乘法来对 w w w b b b进行估计,为方便运算,令 w ^ = ( w ; b ) \hat w = (w;b) w^=(w;b) w ^ \hat w w^ ( d + 1 ) × 1 (d+1)\times1 (d+1)×1的矩阵,则数据集 D D D可以表示为一个 m × ( d + 1 ) m \times (d + 1) m×(d+1)的矩阵 X X X,每一行代表每一个样本,每列的 d d d个元素代表 d d d个特征,最后一列全为1,即
X = ( x 11 x 12 ⋯ x 1 d 1 x 21 x 22 ⋯ x 2 d 1 ⋮ ⋮ ⋱ ⋮ ⋮ x m 1 x m 2 ⋯ x m d 1 ) = ( x 1 T 1 x 2 T 1 ⋮ ⋮ x m T 1 ) X = \begin{pmatrix} {{x_{11}}} & {{x_{12}}} & \cdots & {{x_{1d}}} & 1 \\ {{x_{21}}} & {{x_{22}}} & \cdots & {{x_{2d}}} & 1 \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ {{x_{m1}}} & {{x_{m2}}} & \cdots & {{x_{md}}} & 1 \\ \end{pmatrix} = \begin{pmatrix} {x_1^T} & 1 \\ {x_2^T} & 1 \\ \vdots & \vdots \\ {x_m^T} & 1 \\ \end{pmatrix} X=x11x21xm1x12x22xm2x1dx2dxmd111=x1Tx2TxmT111
y = ( y 1 ; y 2 ; ⋯   ; y m ) y = ({y_1};{y_2}; \cdots ;{y_m}) y=(y1;y2;;ym)
同样求 w ^ \hat w w^的解 w ^ ∗ {\hat w^*} w^可表示为
w ^ ∗ = arg ⁡ min ⁡ w ^ ( y − X w ^ ) T ( y − X w ^ ) {\hat w^*} = \mathop {\arg \min }\limits_{\hat w} {(y - X\hat w)^T}(y - X\hat w) w^=w^argmin(yXw^)T(yXw^)
J ( w ^ ) = ( y − X w ^ ) T ( y − X w ^ ) J(\hat w) = {(y - X\hat w)^T}(y - X\hat w) J(w^)=(yXw^)T(yXw^),然后对 w ^ \hat w w^求导得:
∂ J ( w ^ ) ∂ w ^ = 2 X T ( X w ^ − y ) \frac{{\partial J(\hat w)}}{{\partial \hat w}} = 2{X^T}(X\hat w - y) w^J(w^)=2XT(Xw^y)

注:常用的矩阵求导公式

∂ A B ∂ B = A T \frac{{\partial AB}}{{\partial B}} = {A^T} BAB=AT ∂ A T B ∂ A = B \frac{{\partial {A^T}B}}{{\partial A}} = B AATB=B ∂ X T A X ∂ X = 2 A X \frac{{\partial {X^T}AX}}{{\partial X}} = 2AX XXTAX=2AX

∂ J ( w ^ ) ∂ w ^ \frac{{\partial J(\hat w)}}{{\partial \hat w}} w^J(w^)为0可得 w ^ \hat w w^的最优解,且当 X T X {X^T}X XTX为满秩矩阵或正定矩阵时,可得 w ^ ∗ = ( X T X ) − 1 X T y {\hat w^*} = {({X^T}X)^{ - 1}}{X^T}y w^=(XTX)1XTy
x ^ = ( x i ; 1 ) \hat x = ({x_i};1) x^=(xi;1)最终学得的多元线性回归模型为 f ( x i ) = x i T ( X T X ) − 1 X T y f({x_i}) = x_i^T{({X^T}X)^{ - 1}}{X^T}y f(xi)=xiT(XTX)1XTy

梯度下降算法

1.选择梯度下降算法而不是直接求导等于0的理由

为什么计算损失函数最优值采用梯度下降算法而不是直接求导等于0?
1、 X T X {X^T}X XTX必须要可逆,也就是 X X X必须可逆,但是现实任务中 X T X {X^T}X XTX往往不是满秩矩阵。例如在许多任务中我们会遇到样本包含大量的特征,其数目甚至超过样本数目,导致 X X X的列数多于行数, X T X {X^T}X XTX显然不是满秩,因此直接求导不可行
2、假设满足了条件一,那么就需要去求 X X X的转置乘以 X X X这个整体的逆,线性代数中给出了求逆矩阵的方法,是非常复杂的(对计算机来说就是十分消耗性能的),数据量小时,还可行,一旦数据量大,计算机求矩阵的逆将会是一项非常艰巨的任务,消耗的性能以及时间巨大,而在机器学习中,数据量少者上千,多者上亿;因此直接求导不可行
相较而言,梯度下降算法同样能够实现最优化求解,通过多次迭代使得代价函数收敛,并且使用梯度下降的计算成本很低,所以基于以上两个原因,回归中多数采用梯度下降而不是求导等于零。

2.梯度的概念

梯度微积分中一个很重要的概念
1)在单变量的函数中,梯度其实就是函数的微分,代表着函数在某个给定点的切线的斜率
2)在多变量函数中,梯度是一个向量,向量有方向,梯度的方向就指出了函数在给定点的上升最快的方向

3.场景假设

在这里插入图片描述
想象一下你正站立在山的这一点上,站立在你想象的公园这座红色山上,在梯度下降算法中,我们要做的就是旋转360度,看看我们的周围,并问自己要在某个方向上,用小碎步尽快下山。这些小碎步需要朝什么方向?如果我们站在山坡上的这一点,你看一下周围,你会发现最佳的下山方向,你再看看周围,然后再一次想想,我应该从什么方向迈着小碎步下山?然后你按照自己的判断又迈出一步,重复上面的步骤,从这个新的点,你环顾四周,并决定从什么方向将会最快下山,然后又迈进了一小步,并依此类推,直到你接近局部最低点的位置。

4.学习率

学习率即为每次更新迭代参数的步长,通常我们学习率使用 α \alpha α来表示。
如果 α \alpha α太小了,即我的学习速率太小,结果就是只能这样像小宝宝一样一点点地挪动,去努力接近最低点,这样就需要很多步才能到达最低点,所以如果太小的话,可能会很慢,因为它会一点点挪动,它会需要很多步才能到达全局最低点。
如果 α \alpha α太大,那么梯度下降法可能会越过最低点,甚至可能无法收敛,下一次迭代又移动了一大步,越过一次,又越过一次,一次次越过最低点,直到你发现实际上离最低点越来越远,所以,如果太大,它会导致无法收敛,甚至发散。

5.单变量梯度下降

为方便描述,这里令预测的函数模型为 f ( x i ) = θ 0 + θ 1 x f({x_i}) = {\theta _0} + {\theta _1}x f(xi)=θ0+θ1x
代价函数为
J ( θ 0 , θ 1 ) = 1 2 m ∑ i = 1 m ( f ( x ( i ) ) − y ( i ) ) 2 J({\theta _0},{\theta _1}) = \frac{1}{{2m}}\sum\limits_{i = 1}^m {{{(f({x^{_(i)}}) - {y^{_(i)}})}^2}} J(θ0,θ1)=2m1i=1m(f(x(i))y(i))2

:跟之前的式子比,这里 θ 0 {\theta _0} θ0= b b b, θ 1 {\theta _1} θ1= w w w.这里的系数 1 2 m \frac{1}{{2m}} 2m1对结果没有影响。

(1)单变量梯度下降公式

Repeat until convergence { θ j = θ j − α ∂ J ( θ 0 , θ 1 ) ∂ θ j    ( f o r   j = 0   a n d   j = 1 ) } \{ \\ {\theta _j} = {\theta _j} - \alpha \frac{{\partial J({\theta _0},{\theta _1})}}{{\partial {\theta _j}}} \space\space(for\space j=0 \space and \space j=1) \\ \} {θj=θjαθjJ(θ0,θ1)  (for j=0 and j=1)}
注:需要同步跟新两个变量
t e m p 0 = θ 0 − α ∂ J ( θ 0 , θ 1 ) ∂ θ 0 temp0 = {\theta _0} - \alpha \frac{{\partial J({\theta _0},{\theta _1})}}{{\partial {\theta _0}}} temp0=θ0αθ0J(θ0,θ1)
t e m p 1 = θ 1 − α ∂ J ( θ 0 , θ 1 ) ∂ θ 1 temp1 = {\theta _1} - \alpha \frac{{\partial J({\theta _0},{\theta _1})}}{{\partial {\theta _1}}} temp1=θ1αθ1J(θ0,θ1)
θ 0 : = t e m p 0 {\theta _0}: = temp0 θ0:=temp0
θ 1 : = t e m p 1 {\theta _1}: = temp1 θ1:=temp1

(2)单变量梯度下降实例

我们假设有一个单变量的函数: J ( θ ) = θ 2 J(\theta ) = {\theta ^2} J(θ)=θ2
函数的微分: J ′ ( θ ) = 2 θ J'(\theta ) = 2\theta J(θ)=2θ
初始化,起点可以随意设置,这里设置为为: θ 0  =  1 {\theta ^0}{\text{ = }}1 θ0 = 1
学习率: α  =  0.4 \alpha {\text{ = }}0.4 α = 0.4
我们开始进行梯度下降的迭代计算过程:
θ 0  =  1 {\theta ^0}{\text{ = }}1 θ0 = 1
θ 1 = θ 0 − α J ′ ( θ 0 ) = 1 − 0.4 ∗ 2 = 0.2 \begin{aligned} {\theta ^1}&= {\theta ^0} - \alpha J'({\theta ^0}) \\ &= 1 - 0.4*2 \\ &= 0.2 \\ \end{aligned} θ1=θ0αJ(θ0)=10.42=0.2
θ 2 = θ 1 − α J ′ ( θ 1 ) = 0.2 − 0.4 ∗ 0.4 = 0.04 \begin{aligned} {\theta ^2}& ={\theta ^1} - \alpha J'({\theta ^1}) \\ & = 0.2 - 0.4*0.4 \\ & = 0.04 \\ \end{aligned} θ2=θ1αJ(θ1)=0.20.40.4=0.04
θ 3 = 0.008 {\theta ^3} = 0.008 θ3=0.008
θ 4 = 0.0016 {\theta ^4} = 0.0016 θ4=0.0016
这个实例显然最优解为0,经过4次迭代,已经非常接近最优解了。
在这里插入图片描述

6.多变量梯度下降

支持多变量的假设 f f f表示为 f ( x i ) = θ 0 + θ 1 x 1 + θ 2 x 2 + ⋯ + θ n x n f({x_i}) = {\theta _0} + {\theta _1}{x_1} + {\theta _2}{x_2} + \cdots + {\theta _n}{x_n} f(xi)=θ0+θ1x1+θ2x2++θnxn
这个公式中有个 n + 1 n+1 n+1参数和 n n n个变量,为了使得公式能够简化一些,引入 x 0 x_0 x0,则公式转化为: f ( x i ) = θ 0 x 0 + θ 1 x 1 + θ 2 x 2 + ⋯ + θ n x n f({x_i}) = {\theta _0}{x_0} + {\theta _1}{x_1} + {\theta _2}{x_2} + \cdots + {\theta _n}{x_n} f(xi)=θ0x0+θ1x1+θ2x2++θnxn
此时模型中的 θ \theta θ参数是一个 n + 1 n+1 n+1维的向量,任何一个训练实例也都是 n + 1 n+1 n+1维的向量,特征矩阵 X X X的维度是 m × ( n + 1 ) m\times(n+1) m×(n+1) 。 因此公式可以简化为: f ( x i ) = θ T X f({x_i}) = {\theta ^T}X f(xi)=θTX.
与单变量线性回归类似,在多变量线性回归中,我们也构建一个代价函数,则这个代价函数是所有建模误差的平方和,即: J ( θ 0 , θ 1 , ⋯   , θ n ) = 1 2 m ∑ i = 1 m ( f ( x i ) − y i ) 2 J({\theta _0},{\theta _1}, \cdots ,{\theta _n}) = \frac{1}{{2m}}\sum\limits_{i = 1}^m {{{(f({x_i}) - {y_i})}^2}} J(θ0,θ1,,θn)=2m1i=1m(f(xi)yi)2

(1)多变量梯度下降公式

Repeat{
θ j = θ j − α ∂ J ( θ 0 , θ 1 , ⋯   , θ n ) ∂ θ j = θ j − α ∂ ∂ θ j 1 2 m ∑ i = 1 m ( f ( x ( i ) ) − y ( i ) ) 2 = θ j − α 1 m ∑ i = 1 m ( ( f ( x ( i ) ) − y ( i ) ) x j ( i ) ) \begin{aligned} {\theta _j} &= {\theta _j} - \alpha \frac{{\partial J({\theta _0},{\theta _1}, \cdots ,{\theta _n})}}{{\partial {\theta _j}}} \\ & = {\theta _j} - \alpha \frac{\partial }{{\partial {\theta _j}}}\frac{1}{{2m}}\sum\limits_{i = 1}^m {{{(f({x^{_(i)}}) - {y^{_(i)}})}^2}} \\ & = {\theta _j} - \alpha \frac{1}{m}\sum\limits_{i = 1}^m {((f({x^{_(i)}}) - {y^{_(i)}})} {x_{_j}^{(i)}}) \\ \end{aligned} θj=θjαθjJ(θ0,θ1,,θn)=θjαθj2m1i=1m(f(x(i))y(i))2=θjαm1i=1m((f(x(i))y(i))xj(i))
(simultaneity update θ j {\theta _j} θj for j = 0 , 1 , 2 , . . . , n j=0,1,2,...,n j=0,1,2,...,n)
}

(2)多变量梯度下降实例

我们假设有一个目标函数:
j ( θ 1 , θ 2 ) = θ 1 2  +  θ 2 2 j({\theta _1},{\theta _2}) = \theta _1^2{\text{ + }}\theta _2^2 j(θ1,θ2)=θ12 + θ22
显然这个简单的函数最优解取在(0,0)点,但是这次我们用梯度算法,一步步求出最优解。
我们假设初始的起点为: θ 0  = (1,3) {\theta ^0}{\text{ = (1,3)}} θ0 = (1,3)
初始的学习率为: α = 0.1 \alpha = 0.1 α=0.1
函数的梯度为: Δ J ( θ 1 , θ 2 ) = < 2 θ 1 , 2 θ 2 > \Delta J({\theta _1},{\theta _2}) = < 2{\theta _1},2{\theta _2} > ΔJ(θ1,θ2)=<2θ1,2θ2>
进行多次迭代:
θ 0  = (1,3) θ 1 = θ 0 − α Δ J ( θ 1 , θ 2 ) = (1,3) − 0.1 ∗ ( 2 , 6 ) = ( 0.8 , 2.4 ) θ 2 = ( 0.8 , 2.4 ) − 0.1 ∗ ( 1.6 , 4.8 ) = ( 0.64 , 1.92 ) θ 3 = ( 0.5124 , 1.536 ) θ 4 = ( 0.4096 , 1.228800000000001 ) ⋮ θ 10 = ( 0.1073741824000003 , 0.32212254720000005 ) ⋮ θ 50 = ( 1.141798154164342 e − 05 , 3.42539442494306 e − 05 ) \begin{aligned} & {\theta ^0}{\text{ = (1,3)}} \\ & {\theta ^1} = {\theta ^0} - \alpha \Delta J({\theta _1},{\theta _2}) = {\text{(1,3)}} - 0.1*(2,6) = (0.8,2.4) \\ & {\theta ^2} = (0.8,2.4) - 0.1*(1.6,4.8) = (0.64,1.92) \\ & {\theta ^3} = (0.5124,1.536) \\ & {\theta ^4} = (0.4096,1.228800000000001) \\ & \vdots \\ & {\theta ^{10}} = (0.1073741824000003,0.32212254720000005) \\ & \vdots \\ & {\theta ^{50}} = (1.141798154164342{e^{ - 05}},3.42539442494306{e^{ - 05}}) \\ \end{aligned} θ0 = (1,3)θ1=θ0αΔJ(θ1,θ2)=(1,3)0.1(2,6)=(0.8,2.4)θ2=(0.8,2.4)0.1(1.6,4.8)=(0.64,1.92)θ3=(0.5124,1.536)θ4=(0.4096,1.228800000000001)θ10=(0.1073741824000003,0.32212254720000005)θ50=(1.141798154164342e05,3.42539442494306e05)
显然已经非常接近最优解点
在这里插入图片描述
代码示例

def gradientDescent(X, y, theta, alpha, iters):
    temp = np.matrix(np.zeros(theta.shape))
    parameters = int(theta.ravel().shape[1])#计算需求解的参数个数
    cost = np.zeros(iters)
    
    for i in range(iters):
        error = (X * theta.T) - y
        
        for j in range(parameters):
            term = np.multiply(error, X[:,j])
            temp[0,j] = theta[0,j] - ((alpha / len(X)) * np.sum(term))
            
        theta = temp
        cost[i] = computeCost(X, y, theta)
        
    return theta, cost

梯度下降算法与正规方程(直接计算导数等于0)的比较

梯度下降正规方程
需要选择学习率 α \alpha α不需要
需要多次迭代一次运算得出
当特征数量 n n n大时也能较好适用需要计算 X T X {X^T}X XTX如果特征数量 n n n较大则运算代价大,因为矩阵逆的计算时间复杂度为 O ( n 3 ) O({n^3}) O(n3),通常来说当 n n n小于10000 时还是可以接受的
适用于各种类型的模型只适用于线性模型,不适合逻辑回归模型等其他模型

常见的梯度下降算法还有:
全梯度下降算法(Full gradient descent)
随机梯度下降算法(Stochastic gradient descent)
小批量梯度下降算法(Mini-batch gradient descent)
这里仅作扩展,就不一一详述。

参考文献

周志华《机器学习》
吴恩达 机器学习
为什么计算损失函数最优值采用梯度下降算法而不是直接求导等于0的深度解释
梯度下降算法原理讲解——机器学习

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值