【机器学习导引】ch3-线性模型-2

优化理论:梯度下降(Gradient Descent)

  1. 梯度下降法的基本思路
    梯度下降法是一种优化算法,目的是找到函数 f ( x ) f(x) f(x) 的最小值。图中提到“如果能找到一个序列 x 0 , x 1 , x 2 , … x_0, x_1, x_2, \dots x0,x1,x2, ” ,使得每一步都满足: f ( x t + 1 ) < f ( x t ) f(x_{t+1}) < f(x_t) f(xt+1)<f(xt)
    这意味着每一步更新 x x x 的时候,函数 f ( x ) f(x) f(x) 的值都在下降,也就是朝着局部最小点的方向移动。
  2. 局部极小点问题
    当你每一步都保证 f ( x t + 1 ) < f ( x t ) f(x_{t+1}) < f(x_t) f(xt+1)<f(xt) ,最终会收敛到一个点,这个点就是局部极小点。
    为什么呢?
    这是因为梯度下降法的原理是沿着函数下降最快的方向(即负梯度方向)进行移动,而负梯度的方向是函数值减少最快的方向。因此,经过多次迭代,函数值会越来越小,最终到达一个局部极小点。这时,梯度接近 0 0 0,意味着不再有下降的空间,也就不能再继续下降了。
  3. 如果 f ( x ) f(x) f(x) 是凸函数,局部极小点就是全局最小点为什么呢?
    这是凸函数的一个重要性质:对于凸函数,局部极小点和全局极小点是重合的。换句话说,如果函数是凸的,那它只有一个最小值,且该最小值一定是全局最小值。梯度下降法在凸函数上的应用就显得特别有效,因为它能够确保找到的局部极小点就是全局最小点。

总结一下:

  • 如果每次更新都让函数值下降,你会找到一个局部极小点。
  • 如果函数是凸的,这个局部极小点就是全局最小点。

梯度下降法的核心就是通过不断迭代,使得目标函数的值逐渐减小,直到找到最小值或者停滞在某个点(即梯度为 0 0 0)。

1. 方向选择

  • 对于一元函数 f ( x ) f(x) f(x) 来说,变量 x x x 的变化有两个方向:
    • 向右(即 Δ x > 0 \Delta x > 0 Δx>0
    • 向左(即 Δ x < 0 \Delta x < 0 Δx<0

2. 泰勒展开式

  • 泰勒展开是用来近似函数的一种方法。对于函数 f ( x ) f(x) f(x) ,它可以展开为:

    f ( x + Δ x ) = f ( x ) + f ′ ( x ) Δ x + f ( 2 ) ( x ) 2 ! Δ x 2 + ⋯ + o ( Δ x n ) f(x + \Delta x) = f(x) + f'(x) \Delta x + \frac{f^{(2)}(x)}{2!} \Delta x^2 + \dots + o(\Delta x^n) f(x+Δx)=f(x)+f(x)Δx+2!f(2)(x)Δx2++o(Δxn)

    其中 f ′ ( x ) f'(x) f(x) f ( x ) f(x) f(x) 的一阶导数, f ( 2 ) ( x ) f^{(2)}(x) f(2)(x) 是二阶导数,依此类推。

  • Δ x \Delta x Δx 足够小时,泰勒展开式可以简化为:

    f ( x + Δ x ) ≈ f ( x ) + f ′ ( x ) Δ x f(x + \Delta x) \approx f(x) + f'(x) \Delta x f(x+Δx)f(x)+f(x)Δx

3. 如何让函数值下降?

  • 梯度下降的目标是让 f ( x + Δ x ) < f ( x ) f(x + \Delta x) < f(x) f(x+Δx)<f(x) ,即在每一步迭代中,让函数值下降。
  • 要实现这一点,需要保证 f ′ ( x ) Δ x < 0 f'(x) \Delta x < 0 f(x)Δx<0 ,也就是说,导数 f ′ ( x ) f'(x) f(x) Δ x \Delta x Δx 的乘积必须为负值。
    • 如果 f ′ ( x ) > 0 f'(x) > 0 f(x)>0 ,我们选择 Δ x < 0 \Delta x < 0 Δx<0
    • 如果 f ′ ( x ) < 0 f'(x) < 0 f(x)<0 ,我们选择 Δ x > 0 \Delta x > 0 Δx>0
  • f ( x ) f(x) f(x) 为多元函数时,梯度 ∇ f ( x ) \nabla f(x) f(x) 替代一元函数的导数,梯度的方向是函数增长最快的方向。因此,我们需要沿着梯度的相反方向移动,使得函数值下降。

4. 如何选择步长?

  • 我们定义 Δ x = − η ∇ f ( x ) \Delta x = -\eta \nabla f(x) Δx=ηf(x) ,其中 η \eta η 为步长,表示每次更新时移动的距离。步长 η \eta η 必须是一个较小的正数。

  • 这样,更新的方向就是沿着梯度的反方向,即函数值减少的方向。通过这个公式,可以保证每次迭代后函数值都会下降:

    Δ x ∇ f ( x ) = − η ( ∇ f ( x ) ) 2 < 0 \Delta x \nabla f(x) = -\eta (\nabla f(x))^2 < 0 Δxf(x)=η(f(x))2<0

5. 梯度下降的更新公式

  • 通过这个思路,最终的梯度下降法的更新公式就是:

    x t + 1 = x t − η ∇ f ( x t ) x_{t+1} = x_t - \eta \nabla f(x_t) xt+1=xtηf(xt)

    这表示在每次迭代时,用当前点的梯度乘以一个步长 η \eta η ,然后从当前点 x t x_t xt 减去这个值,得到下一个点 x t + 1 x_{t+1} xt+1

总结

  • 梯度下降的核心思想是通过沿着梯度的反方向移动,使得每一步迭代后的函数值都比前一步的值更小。
  • 使用泰勒展开式可以解释为什么小步移动能够使函数值下降。
  • 选择合适的步长 η \eta η 能够控制更新的幅度,确保算法稳定收敛。

算法原理

1. 线性回归模型的输出

图中提到,线性回归模型的输出可以表示为:

z = w T x + b z = w^T x + b z=wTx+b

其中:

  • z z z 是线性模型的输出值
  • w T w^T wT 是权重向量
  • x x x 是输入特征向量
  • b b b 是偏置

这个公式表示的是一个简单的线性组合。对于分类任务,我们希望输出值 y y y 0 0 0 1 1 1

2. 单位阶跃函数(Unit-Step Function)

理想情况下,我们希望通过线性回归的输出值 z z z 来决定 y y y 的取值。如果 z > 0 z > 0 z>0 ,那么 y = 1 y = 1 y=1 ,表示属于某一类;如果 z < 0 z < 0 z<0 ,那么 y = 0 y = 0 y=0 ,表示属于另一类。这就是 单位阶跃函数 的定义:

y = { 1 , z > 0 0.5 , z = 0 0 , z < 0 y = \begin{cases} 1, & z > 0 \\ 0.5, & z = 0 \\ 0, & z < 0 \end{cases} y= 1,0.5,0,z>0z=0z<0

但是,阶跃函数的性质不太好,因为它在 z = 0 z = 0 z=0不可微分,且在其他点上也是非连续的,这对模型的训练不利。

3. 替代函数——对数几率函数(Logistic Function)

为了克服单位阶跃函数的缺点,常用的替代函数是 对数几率函数(Logistic Function),也称为 S型函数(Sigmoid Function)。它的公式为:

y = 1 1 + e − z y = \frac{1}{1 + e^{-z}} y=1+ez1

这个函数的输出是一个连续值,位于 0 0 0 1 1 1 之间,可以看作是输出为某一类别的概率。它有以下几个重要的性质:

  • z z z 很大时, y y y 接近 1 1 1
  • z z z 很小时, y y y 接近 0 0 0
  • z = 0 z = 0 z=0 时, y = 0.5 y = 0.5 y=0.5

在这里插入图片描述

从图中的曲线可以看到,对数几率函数的曲线在 z = 0 z = 0 z=0 处平滑过渡,解决了阶跃函数不连续、不可微的问题。

4. 对数几率函数在分类中的应用

在分类任务中,我们使用对数几率函数将线性回归的输出值映射到 [ 0 , 1 ] [0, 1] [0,1] 之间,这样我们可以将其视作类别 1 1 1 的概率。然后根据这个概率值,我们可以将 y y y 分为 0 0 0 1 1 1。例如:

  • 如果 y > 0.5 y > 0.5 y>0.5 ,我们可以预测分类为 1 1 1
  • 如果 y < 0.5 y < 0.5 y<0.5 ,则预测分类为 0 0 0

总结

  • 线性回归的输出 z = w T x + b z = w^T x + b z=wTx+b 本质上是一个实数。
  • 为了进行二分类,我们希望将 z z z 映射到 [ 0 , 1 ] [0,1] [0,1] 之间,并且可以平滑、连续地变化。为此,我们用 对数几率函数(Logistic Function) 代替单位阶跃函数。
  • 对数几率函数输出一个概率值,用于决定输入属于哪一类。

概率(Probability)几率(Odds)对数几率(Logit)

1. 概率 (Probability)

概率是指事件发生的可能性,通常用 p p p 表示,范围在 [ 0 , 1 ] [0, 1] [0,1] 之间。

  • 如果事件肯定发生, p = 1 p = 1 p=1
  • 如果事件不可能发生, p = 0 p = 0 p=0
  • 一般情况下,概率表示的是事件成功的可能性。

2. 几率 (Odds)

几率 描述的是事件发生的可能性和不发生的可能性之间的比率。它可以用概率 p 表示:

Odds = p 1 − p \text{Odds} = \frac{p}{1 - p} Odds=1pp

  • p = 0.5 p = 0.5 p=0.5 时,几率为 1 1 1,表示事件发生和不发生的可能性相等。
  • p > 0.5 p > 0.5 p>0.5 时,几率大于 1 1 1,表示事件更有可能发生
  • p < 0.5 p < 0.5 p<0.5 时,几率小于 1 1 1,表示事件更不可能发生

例如,如果某事件发生的概率是 0.75 0.75 0.75,那么其几率为:

Odds = 0.75 1 − 0.75 = 3 \text{Odds} = \frac{0.75}{1 - 0.75} = 3 Odds=10.750.75=3

表示事件发生的可能性是其不发生可能性的 3 3 3 倍。

3. 对数几率 (Logit)

对数几率几率取对数的结果,用来将几率转换为一个无限范围的数值。对数几率公式如下:

Logit ( p ) = log ⁡ ( p 1 − p ) \text{Logit}(p) = \log\left(\frac{p}{1 - p}\right) Logit(p)=log(1pp)

对数几率将 p p p [ 0 , 1 ] [0, 1] [0,1] 的范围映射到整个实数范围 ( − ∞ , ∞ -\infty, \infty ,) ,这对建模非常有用,特别是在逻辑回归中。

  • p = 0.5 p = 0.5 p=0.5 时, L o g i t Logit Logit 值为 0 0 0
  • p > 0.5 p > 0.5 p>0.5 时, L o g i t Logit Logit 值为正,表示事件发生的几率更高。
  • p < 0.5 p < 0.5 p<0.5 时, L o g i t Logit Logit 值为负,表示事件不发生的几率更高。

4. 在逻辑回归中的应用

逻辑回归中,我们通常需要预测一个事件发生的概率( p p p ),而通过线性模型(如 z = w T x + b z = w^T x + b z=wTx+b )直接预测的值范围是 ( − ∞ , ∞ -\infty, \infty ,) 。为了将这个值映射到 [ 0 , 1 ] [0, 1] [0,1] 之间,我们使用了对数几率函数。对数几率函数可以将线性模型的输出转换为几率,然后通过几率得到事件发生的概率。

总结

  • 概率 p p p 表示事件发生的可能性,范围是 [ 0 , 1 ] [0, 1] [0,1]
  • 几率 p 1 − p \frac{p}{1 - p} 1pp 表示事件发生与不发生的比率。
  • 对数几率 log ⁡ ( p 1 − p ) \log\left(\frac{p}{1 - p}\right) log(1pp) 是几率取对数后的值,将概率映射到实数范围。

这些概念在逻辑回归中用于预测二分类问题的结果,并通过对数几率来将线性回归的输出映射到概率值上。

对数几率回归模型(Logistic Regression Model) 的基本数学形式

1. 对数几率回归模型的核心

对数几率回归模型用于解决二分类问题,其核心思想是通过一个线性模型( w T x + b w^T x + b wTx+b )来预测一个事件发生的概率。

在这个模型中,我们希望预测 y = 1 y = 1 y=1 的概率。模型假设输出的对数几率(即事件发生与不发生的几率比值取对数)是一个线性模型:

ln ⁡ ( p ( y = 1 ∣ x ) p ( y = 0 ∣ x ) ) = w T x + b (3.22) \ln \left( \frac{p(y=1|x)}{p(y=0|x)} \right) = w^T x + b \tag{3.22} ln(p(y=0∣x)p(y=1∣x))=wTx+b(3.22)

这个公式的左边表示事件发生和不发生的对数几率,而右边是一个线性组合的表达式。

2. 为什么这样表示?(公式 3.22)

这里使用对数几率的原因是为了将线性模型的输出(即 w T x + b w^T x + b wTx+b 的值)和概率联系起来。具体来说:

  • 几率 p ( y = 1 ∣ x ) p ( y = 0 ∣ x ) \frac{p(y=1|x)}{p(y=0|x)} p(y=0∣x)p(y=1∣x) 本质上是一个正数,但其范围可以是 ( 0 , ∞ ) (0, \infty) (0,) ,也就是非负数。
  • 对数几率 ln ⁡ ( p ( y = 1 ∣ x ) p ( y = 0 ∣ x ) ) \ln \left( \frac{p(y=1|x)}{p(y=0|x)} \right) ln(p(y=0∣x)p(y=1∣x)) 将几率映射到了整个实数范围 ( − ∞ , ∞ ) (-\infty, \infty) (,) ,而线性模型的输出也是可以取任何实数值的。

因此,使用对数几率可以很好地将线性模型与二分类问题的概率联系起来,这就是公式 (3.22) 的推导来源。

3. 从对数几率到概率的推导

我们可以通过公式 ( 3.22 ) (3.22) (3.22) 来推导出 p ( y = 1 ∣ x ) p(y=1|x) p(y=1∣x) p ( y = 0 ∣ x ) p(y=0|x) p(y=0∣x) 。我们从几率公式出发:

ln ⁡ ( p ( y = 1 ∣ x ) p ( y = 0 ∣ x ) ) = w T x + b \ln \left( \frac{p(y=1|x)}{p(y=0|x)} \right) = w^T x + b ln(p(y=0∣x)p(y=1∣x))=wTx+b

将对数移到等式的另一边:

p ( y = 1 ∣ x ) p ( y = 0 ∣ x ) = e w T x + b \frac{p(y=1|x)}{p(y=0|x)} = e^{w^T x + b} p(y=0∣x)p(y=1∣x)=ewTx+b

接着我们知道 p ( y = 0 ∣ x ) = 1 − p ( y = 1 ∣ x ) p(y=0|x) = 1 - p(y=1|x) p(y=0∣x)=1p(y=1∣x) ,所以可以得到:

p ( y = 1 ∣ x ) 1 − p ( y = 1 ∣ x ) = e w T x + b \frac{p(y=1|x)}{1 - p(y=1|x)} = e^{w^T x + b} 1p(y=1∣x)p(y=1∣x)=ewTx+b

接下来我们将这个式子进行变形,解出 p ( y = 1 ∣ x ) p(y=1|x) p(y=1∣x)

p ( y = 1 ∣ x ) = e w T x + b 1 + e w T x + b (3.23) p(y=1|x) = \frac{e^{w^T x + b}}{1 + e^{w^T x + b}} \tag{3.23} p(y=1∣x)=1+ewTx+bewTx+b(3.23)

这就是 y = 1 y=1 y=1 的概率公式。

同理, y = 0 y=0 y=0 的概率为:

p ( y = 0 ∣ x ) = 1 − p ( y = 1 ∣ x ) = 1 1 + e w T x + b (3.24) p(y=0|x) = 1 - p(y=1|x) = \frac{1}{1 + e^{w^T x + b}} \tag{3.24} p(y=0∣x)=1p(y=1∣x)=1+ewTx+b1(3.24)

4. 小结

  • 公式 ( 3.22 ) (3.22) (3.22) 表示的是对数几率的线性关系。对数几率回归的基本假设是,输出的对数几率与输入 x x x 的线性组合 w T x + b w^T x + b wTx+b 有关。
  • 从这个公式出发,我们推导出了 p ( y = 1 ∣ x ) p(y=1|x) p(y=1∣x) p ( y = 0 ∣ x ) p(y=0|x) p(y=0∣x) 的具体概率表达式,这些公式用于描述二分类问题中每一类发生的概率。

似然函数(Likelihood Function)

1. 似然函数的定义

似然函数 ℓ ( w , b ) \ell(w, b) (w,b) 是关于参数 w w w b b b 的一个函数,用来表示我们给定参数下数据的可能性。其形式为:

ℓ ( w , b ) = ∑ i = 1 m ln ⁡ p ( y i ∣ x i ; w , b ) \ell(w, b) = \sum_{i=1}^{m} \ln p(y_i | \mathbf{x}_i; w, b) (w,b)=i=1mlnp(yixi;w,b)

其中:

  • m m m 是训练数据的样本数量。
  • p ( y i ∣ x i ; w , b ) p(y_i | \mathbf{x}i; w, b) p(yixi;w,b) 表示在给定输入 x i \mathbf{x}_i xi 和参数 w , b w, b w,b 的情况下,模型预测 y i y_i yi 的概率。

我们通过对数似然函数(Log-likelihood Function)来简化计算,避免直接计算较小的概率连乘,累积误差。

2. 似然函数的解释

公式表示的是事件 y i y_i yi 发生或不发生的概率,它结合了 y i = 1 y_i = 1 yi=1 y i = 0 y_i = 0 yi=0 两种情况:

p ( y i ∣ x i ; w , b ) = y i p 1 ( x i ; β ) + ( 1 − y i ) p 0 ( x i ; β ) p(y_i | \mathbf{x}_i; w, b) = y_i p_1(\mathbf{x}_i; \beta) + (1 - y_i)p_0(\mathbf{x}_i; \beta) p(yixi;w,b)=yip1(xi;β)+(1yi)p0(xi;β)

其中:

  • y i y_i yi 1 1 1 时,选择的是 p 1 ( x i ; β ) p_1(\mathbf{x}_i; \beta) p1(xi;β) ,即事件 y = 1 y=1 y=1 的概率。
  • y i y_i yi 0 0 0 时,选择的是 p 0 ( x i ; β ) p_0(\mathbf{x}_i; \beta) p0(xi;β) ,即事件 y = 0 y=0 y=0 的概率。

用更直观的方式理解这个公式:

  • y i = 1 y_i = 1 yi=1 时,这个公式变为 p 1 ( x i ; β ) p_1(\mathbf{x}_i; \beta) p1(xi;β) ,即我们只需要关注 y = 1 y = 1 y=1 的概率。
  • y i = 0 y_i = 0 yi=0 时,这个公式变为 p 0 ( x i ; β ) p_0(\mathbf{x}_i; \beta) p0(xi;β) ,即我们只关注 y = 0 y = 0 y=0 的概率。

因此,这个似然函数描述的是所有数据点在不同情况下( y = 1 y = 1 y=1 y = 0 y = 0 y=0 )的整体概率。

3. 参数的最大化

通过最大化似然函数 ℓ ( w , b ) \ell(w, b) (w,b) ,我们可以找到最优的参数 w w w b b b 来使得模型对已知数据的预测概率最大。最大化似然函数就是最大似然估计(Maximum Likelihood Estimation, MLE)的核心思想。

总结

  • 似然函数 ℓ ( w , b ) \ell(w, b) (w,b) 用于度量模型在参数 w w w b b b 下对所有样本预测的整体概率
  • 对数似然函数 通过对数化简了计算,使得我们可以更方便地处理较小的概率值。
  • 公式是对概率的分解,分别处理 y i = 1 y_i = 1 yi=1 y i = 0 y_i = 0 yi=0 的情况,使得我们能够通过最大化似然函数来训练模型。

最小化目标函数

也就是我们需要最大化似然函数的等价形式

1. 目标:最大化似然函数

首先,我们的目标是 最大化似然函数,用符号表示为:

ℓ ( w , b ) = ∑ i = 1 m ln ⁡ p ( y i ∣ x i ; w , b ) \ell(w, b) = \sum_{i=1}^{m} \ln p(y_i|\mathbf{x}_i; w, b) (w,b)=i=1mlnp(yixi;w,b)

这就是对数似然函数。我们希望找到合适的参数 w w w b b b使得模型在数据上的预测概率最大化。

2. 最大化似然函数等价于最小化损失函数

最大化对数似然函数与最小化负对数似然函数是等价的。为什么呢?因为最大化一个函数,等价于最小化其负数。于是我们可以通过最小化负的对数似然函数来进行优化。

所以,我们定义损失函数 ℓ ( β ) \ell(\beta) (β) 为:

ℓ ( β ) = − ∑ i = 1 m ln ⁡ p ( y i ∣ x i ; β ) \ell(\beta) = - \sum_{i=1}^{m} \ln p(y_i|\mathbf{x}_i; \beta) (β)=i=1mlnp(yixi;β)

其中 β = [ w , b ] T \beta = [w, b]^T β=[w,b]T 是需要优化的参数。

3. 对 p ( y i ∣ x i ; β ) p(y_i|\mathbf{x}_i; \beta) p(yixi;β) 的展开

我们之前推导了 p ( y i ∣ x i ; β ) p(y_i|\mathbf{x}_i; \beta) p(yixi;β) 的表达式:

p ( y i ∣ x i ; β ) = y i p 1 ( x i ; β ) + ( 1 − y i ) p 0 ( x i ; β ) p(y_i|\mathbf{x}_i; \beta) = y_i p_1(\mathbf{x}_i; \beta) + (1 - y_i) p_0(\mathbf{x}_i; \beta) p(yixi;β)=yip1(xi;β)+(1yi)p0(xi;β)

其中:

  • p 1 ( x i ; β ) = e β T x i 1 + e β T x i p_1(\mathbf{x}_i; \beta) = \frac{e^{\beta^T \mathbf{x}_i}}{1 + e^{\beta^T \mathbf{x}_i}} p1(xi;β)=1+eβTxieβTxi y = 1 y = 1 y=1 的概率;
  • p 0 ( x i ; β ) = 1 1 + e β T x i p_0(\mathbf{x}_i; \beta) = \frac{1}{1 + e^{\beta^T \mathbf{x}_i}} p0(xi;β)=1+eβTxi1 y = 0 y = 0 y=0 的概率。

p ( y i ∣ x i ; β ) p(y_i|\mathbf{x}_i; \beta) p(yixi;β) 展开带入对数似然函数,并取负,得到:

ℓ ( β ) = − ∑ i = 1 m ( y i ln ⁡ p 1 ( x i ; β ) + ( 1 − y i ) ln ⁡ p 0 ( x i ; β ) ) \ell(\beta) = - \sum_{i=1}^{m} \left( y_i \ln p_1(\mathbf{x}_i; \beta) + (1 - y_i) \ln p_0(\mathbf{x}_i; \beta) \right) (β)=i=1m(yilnp1(xi;β)+(1yi)lnp0(xi;β))

经过进一步化简和整理,最终得到的最小化目标函数(损失函数)为:

ℓ ( β ) = ∑ i = 1 m ( − y i β T x i + ln ⁡ ( 1 + e β T x i ) ) \ell(\beta) = \sum_{i=1}^{m} \left( -y_i \beta^T \mathbf{x}_i + \ln(1 + e^{\beta^T \mathbf{x}_i}) \right) (β)=i=1m(yiβTxi+ln(1+eβTxi))

  • 第一项 − y i β T x i -y_i \beta^T \mathbf{x}_i yiβTxi 是与真实标签相关的部分;
  • 第二项 ln ⁡ ( 1 + e β T x i ) \ln(1 + e^{\beta^T \mathbf{x}_i}) ln(1+eβTxi) 则是模型输出的对数几率。

5. 为什么可以用梯度下降法求解?

公式 (3.27) 是一个关于 β \beta β连续、可导的凸函数,而且高阶可导。这意味着我们可以用梯度下降法或牛顿法等优化算法来最小化这个目标函数,找到使其最小的参数 β \beta β

小结

  • 我们从最大化对数似然函数出发,通过取负将其转换为最小化损失函数。
  • 公式 (3.27) 是通过对数几率回归的概率公式推导而来,最终形式是对数似然函数的负数。
  • 因为该损失函数是连续、凸的,所以可以使用经典的优化方法,如梯度下降法来求解,使得参数 β \beta β 最优。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FOUR_A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值