机器学习系列(一)感知器


文章说明:
1.里面的内容是自已对本科课程中机器学习所学内容的理解,如有理解不充分或者不正确的地方,大家可以私聊或者留言给我指正。我将进行改正。
2.我将做出一系列机器学习算法的博客,让大家对机器学习算法有一个更加直观和深刻的认识。
3.本人QQ:2891707662,如有想讨论机器学习、深度学习内容的同学,可以注明来意并
加我联系方式。
 

感知器的分类任务

  感知机的分类对象:线性可分的二分类数据。
感知机的二分类图
  二分类线性可分:如上图所示,我们有两类数据标签 y ∈ [ − 1 , 1 ] y\in{[-1, 1]} y[1,1],我们能够找到一个分界线将两类标签完美的分割开来,同时根据分界线,我们将区域内的点也分为了两类(黄色和粉红色)。
 

点到直线“距离”的理解

  我们知道对于一个二维直线,我们可以用 a x 1 + b y 1 + c = 0 ax_1+by_1+c=0 ax1+by1+c=0 ( 1 ) (1) (1)表示,但同时我们也能用 − a x 1 − b y 1 − c = 0 -ax_1-by_1-c=0 ax1by1c=0 ( 2 ) (2) (2)表示,上面两个解析式表示同一条直线·。下面我们仅以第一种解析式为例子,令 w = [ a , b ] T w=[a,b]^T w=[a,b]T, x = [ x 1 , y 1 ] T x=[x_1,y_1]^T x=[x1,y1]T, b = c 1 b=c_1 b=c1,此时 w , x w,x w,x都表示一个高维(不仅仅可以表示二维)的向量,此时的 w w w是直线的方向向量(我们得知道一条直线方向向量不唯一,如 − w -w w也能表示方向向量,所以我们在这里暂且认为当一个直线的解析式固定之后,方向向量就是前面系数组成的向量,以下我说方向向量都是这个意思。),b是偏置。
  1.点到直线的几何距离为 d 1 = ∣ w T x + b ∣ ∣ w ∣ d_1=\frac{\left\vert w^Tx+b \right\vert}{\vert w \vert} d1=wwTx+b,直观理解就是做一条点对直线(超平面)的垂线的欧式距离,它不管你的直线解析式具体是啥,只要你的直线确定了,那么这个几何距离就是定值。
  2.点到直线的算术距离为 d 2 = w T x + b ∣ w ∣ d_2=\frac{w^Tx+b }{\vert w \vert} d2=wwTx+b,此时的分子是没有绝对值的。 d 2 和 w T x + b d_2和w^Tx+b d2wTx+b同号,因此我们对于算术距离只需要研究 w T x + b w^Tx+b wTx+b的正负号即可。我们知道当 w T x + b = 0 w^Tx+b=0 wTx+b=0时,数据点刚好落到分界线上;当 w T x + b ≠ 0 w^Tx+b \ne0 wTx+b=0时,数据点落在分界线的某一侧。此时,我们知道 ( 1 ) ( 2 ) (1)(2) (1)(2)两个直线解析式算出来的 d 2 d_2 d2值正负号是刚好相反的,因此不唯一。

   w T x w^Tx wTx d 2 d_2 d2的理解

  我们前面知道了, w w w表示的某个具体直线解析式的方向向量,如 ( 1 ) (1) (1)。而 x x x表示数据点在空间中的位置,或者理解为原点到数据点的向量。因此 w T x w^Tx wTx表示两个向量的内积,它跟两个向量的模值和两个向量的夹角余弦有关, w T x = ∣ w ∣ ∣ x ∣ c o s ( θ ( w , x ) ) w^Tx=\vert w \vert \vert x \vert cos(\theta(w,x)) wTx=wxcos(θ(w,x))
  因此 d 2 d_2 d2可以有以下两种理解:
   1.具体直线的方向向量和原点到数据点向量的内积加上偏置 b b b所得的值的归规范化(就是除以方向量模的意思)。这是由上面分析导出。
   2.直线(解析式已固定)上一点到数据点组成的向量与方向向量的内积的规范化。这也印证了为什么 ( 1 ) ( 2 ) (1)(2) (1)(2)得到的 d 2 d_2 d2值的正负号正好相反。
   数据是二维时的证明:
      直线上一点与数据点组成的的向量 w 1 = ( x 1 − x 2 , y 1 − y 2 ) w_1=(x_1-x_2,y_1-y_2) w1=(x1x2,y1y2) ( x 2 , y 2 ) 为 直 线 上 一 点 (x_2,y_2)为直线上一点 (x2,y2)线
      直线的方向向量 w = ( a , b ) w=(a,b) w=(a,b)
       < w 1 , w > = a ( x 1 − x 2 ) + b ( y 1 − y 2 ) = a x 1 + b y 1 + ( − a x 2 − b y 2 ) = a x 1 + b y 1 + c <w_1,w>=a(x_1-x_2)+b(y_1-y_2)=ax_1+by_1+(-ax_2-by_2)=ax_1+by_1+c <w1,w>=a(x1x2)+b(y1y2)=ax1+by1+(ax2by2)=ax1+by1+c
      因此 d 2 = a x 1 + b y 1 + c ∣ w ∣ = < w 1 , w > ∣ w ∣ d_2=\frac{ax_1+by_1+c}{\vert w \vert}=\frac{<w_1,w>}{\vert w \vert} d2=wax1+by1+c=w<w1,w>
 

感知器损失函数的导出

  现在我们需要用一条直线将两种不同类型(标签)的数据分开,即两种不同类型的数据点在直线的两边,那么用一个什么指标来衡量点在直线的哪边呢?
  上面我们讨论了两种“距离”意义,那么我们现在来分析它们能不能够作为我们的判别准则:
  1.针对几何距离 d 1 d_1 d1,因为它表示的是点到直线的垂线的欧氏距离,因此在两边的点可能会有相同 d 1 d_1 d1值,因此它不具有区分的能力。
  2.针对算术距离 d 2 d_2 d2,我们在上面分析对它的理解时,我们利用理解2,我们可以得知,当直线的解析式固定时,此时方向向量固定,因此 d 2 d_2 d2的值只跟 w 1 w_1 w1有关,而 w 1 w_1 w1表示的是直线上任意一点与数据点构成的向量,方向向量与直线垂直,因此我们可以得出,在直线的某一侧, w 1 w_1 w1 w w w的夹角 < 9 0 0 <90^0 <900,此时 d 2 > 0 d_2>0 d2>0;在直线的另一侧,则相应得出 w 1 w_1 w1 w w w的夹角 > 9 0 0 >90^0 >900,此时 d 2 < 0 d_2<0 d2<0。因此它可以作为我们的判别准则。
  在我们知道了算术距离可以作为我们直线划分数据点的判别准则之后,我们想,能够将数据点完美分开的直线到底有多少条?
  显然,符合我们求解的直线有无数条,因为从最开始的那个图中我们可以画无数条直线将两类数据点完美分开。当我们真正的一条能够将数据点完美分开的直线之后,因为他的解析表示不唯一,因此表示它的参数也有无数种情况。因此我们可以得出我们的感知器模型是从无数条直线中的一条直线,这条直线的某一个解析式。(3)

  损失函数

  我们知道了 d 2 d_2 d2的正负号能够判定数据点在具体某一条直线的哪边。前面也说过 d 2 d_2 d2 w T x + b w^Tx+b wTx+b的正负号相同。又知道了我们感知器模型的结果(3)。我们就可以对某一具体的分类任务进行假设了。
  假设我们最终要找到的直线满足(当然你可以进行别的假设):对某个样本当 y ( i ) = 1 y^{(i)}=1 y(i)=1时,我们有 d 2 > 0 d_2>0 d2>0,当 y ( i ) = − 1 y^{(i)}=-1 y(i)=1时,我们有 d 2 < 0 d_2<0 d2<0综合前面所有分析结果,即要求直线对于所有的样本,我们都要满足 y ( i ) ( w T x ( i ) + b ) > 0 y^{(i)}(w^Tx^{(i)}+b)>0 y(i)(wTx(i)+b)>0(4)
  如果某一条直线不能符合我们上面要求,我们则认为它不是我们要找的直线。对于任意一条直线我们定义损失函数 L = − ∑ i = 1 N y ( i ) ( w T x ( i ) + b ) F ( x ( i ) ) ≥ 0 L=-\sum_{i=1}^N y^{(i)}(w^Tx^{(i)}+b)F(x^{(i)})\ge0 L=i=1Ny(i)(wTx(i)+b)F(x(i))0 ,显然当直线完全分类正确时,它有最小值 0 0 0,其中 F ( x ( i ) ) = { 0 , y ( i ) ( w T x ( i ) + b ) > 0 1 , y ( i ) ( w T x ( i ) + b ) < 0 F(x^{(i)})=\begin{cases} 0,\quad y^{(i)}(w^Tx^{(i)}+b)>0 \\ 1,\quad y^{(i)}(w^Tx^{(i)}+b)<0 \end{cases} F(x(i))={0,y(i)(wTx(i)+b)>01,y(i)(wTx(i)+b)<0.
  我们分别对 w , b w,b w,b进行求导:
{ ∂ L ∂ w = − ∑ i = 1 N y ( i ) x ( i ) F ( x ( i ) ) ∂ L ∂ b = − ∑ i = 1 N y ( i ) F ( x ( i ) ) \begin{cases} \frac{\partial L}{\partial w}=-\sum_{i=1}^{N}y^{(i)}x^{(i)}F(x^{(i)})\\ \frac{\partial L}{\partial b}=-\sum_{i=1}^{N}y^{(i)}F(x^{(i)}) \end{cases} {wL=i=1Ny(i)x(i)F(x(i))bL=i=1Ny(i)F(x(i))
  上面是利用所有数据点求得出来的梯度,它被称之为全梯度,当我们利用随机梯度时,我们就能够得到下面的感知器算法了。
  随机梯度表示的更新公式为:
{ ∂ L ∂ w = − y ( i ) x ( i ) F ( x ( i ) ) ∂ L ∂ b = − y ( i ) F ( x ( i ) ) \begin{cases} \frac{\partial L}{\partial w}=-y^{(i)}x^{(i)}F(x^{(i)})\\ \frac{\partial L}{\partial b}=-y^{(i)}F(x^{(i)}) \end{cases} {wL=y(i)x(i)F(x(i))bL=y(i)F(x(i))

 

感知器算法

   N N N表示样本的总个数, x ( i ) x^{(i)} x(i)为某个样本点, y ( i ) ∈ [ − 1 , 1 ] y^{(i)}\in[-1,1] y(i)[1,1]为对应标签。
  Step1:初始化权值和偏置
  Step2:while找到我们要求的直线为止------(4)
     如果 y ( i ) ( w T x ( i ) + b ) > 0 y^{(i)}(w^Tx^{(i)}+b)>0 y(i)(wTx(i)+b)>0,我们此时 F ( x ( i ) ) F(x^{(i)}) F(x(i))=0,没有梯度可以更新,因此不更新权值。
     如果 y ( i ) ( w T x ( i ) + b ) < 0 y^{(i)}(w^Tx^{(i)}+b)<0 y(i)(wTx(i)+b)<0,此时我们按以下下公式进行更新,对应随机梯度下降( α \alpha α为我们的学习率):
{ w n e w = w o l d + α y ( i ) x ( i ) b n e w = b o l d + α y ( i ) \begin{cases} w_{new} = w_{old} + \alpha y^{(i)}x^{(i)}\\ b_{new} = b_{old} + \alpha y^{(i)} \end{cases} {wnew=wold+αy(i)x(i)bnew=bold+αy(i)
 

感知器算法的直观感受

感知器学习图片
  假设我们要学习的是我们图中综色的直线,经过我们前面感知器算法的更新公式,我们目前所得到的直线为图中绿色的直线(一定要关注我标的箭头,它代表方向向量),从图中我们可以看出有一个数据点没有分类正确,就是右下角的那个pink色的圆圈。根据我们的直觉,我们是不是要将绿色的直线顺时针转一下下就可能得到我们想要的直线。
  我们的更新公式就是用来干这件事的。根据我们的更新公式:
{ w n e w = w o l d + α y ( i ) x ( i ) b n e w = b o l d + α y ( i ) \begin{cases} w_{new} = w_{old} + \alpha y^{(i)}x^{(i)}\\ b_{new} = b_{old} + \alpha y^{(i)} \end{cases} {wnew=wold+αy(i)x(i)bnew=bold+αy(i)
  针对那个分错了的pink色的样本,此时 y ( i ) = 1 y^{(i)}=1 y(i)=1,所以 w w w更新公式就变成了 w n e w = w o l d + α x ( i ) w_{new}=w_{old}+\alpha x^{(i)} wnew=wold+αx(i)
感知器分类图片二
  此时数据点表示的向量用黄色线画出,平移到方向向量所在起点,对长度进行放缩(因为 α \alpha α的存在),然后两个向量进行平行四边形法则相加,得到新的蓝色的向量,我们的计算结果表示,在利用公式更新之后,我们的直线确实往顺时针旋转了,这与我们的直觉是相符的。
  我上面是举的错分类数据点为 y ( i ) = 1 y^{(i)}=1 y(i)=1的情况。当错分类点数据为 y ( i ) = − 1 y^{(i)}=-1 y(i)=1时,分析的方法和上面一模一样,所以我在这里就不做过多的赘述。

 

感知器算法的收敛证明

  我们知道,我们的感知器模型分类任务的目标是线性可分的二分类数据,也就是说,我们一定能人为地找到一条直线将两种数据完全分开。
  我们将这条直线的方向向量设为 w ∗ w^* w,偏置设为 b ∗ b^* b,我们将其用列向量表示 W ∗ = [ w ∗ T , b ∗ ] T W^*=[w^{*T},b^*]^T W=[wT,b]T.对于具体样本点我们也采用相似的表示方式 X ( i ) = [ x ( i ) T , 1 ] T X^{(i)}=[x^{(i)T},1]^T X(i)=[x(i)T,1]T,,而其标签表达方式不变。那么 y ( i ) ( w T x ( i ) + b ) y^{(i)}(w^Tx^{(i)}+b) y(i)(wTx(i)+b)可表示为 y ( i ) W ∗ T X ( i ) y^{(i)}W^{*T}X^{(i)} y(i)WTX(i)
  现在我们初始化 W 0 = 0 W^0=0 W0=0,总共有N个数据,每经过一次感知算法的参数的更正,我们就可得 W k = W k − 1 + y ( j ) X ( j ) W^k=W^{k-1}+y^{(j)}X^{(j)} Wk=Wk1+y(j)X(j),由于更新条件,此时的 y ( j ) W k − 1 T X ( j ) < 0 y^{(j)}{W^{k-1}}^TX^{(j)}<0 y(j)Wk1TX(j)<0
  不等式一
∣ ∣ W k ∣ ∣ 2 = ∣ ∣ W k − 1 + y ( j ) X ( j ) ∣ ∣ 2 = ∣ ∣ W k − 1 ∣ ∣ 2 + 2 y ( j ) W k − 1 T X ( j ) + ∣ ∣ X ( j ) ∣ ∣ 2 ≤ ∣ ∣ W k − 1 ∣ ∣ 2 + ∣ ∣ X ( j ) ∣ ∣ 2 ≤ ∣ ∣ W 0 ∣ ∣ 2 + ∑ j = 1 k ∣ ∣ X ( j ) ∣ ∣ 2 其 中 ∣ ∣ W 0 ∣ ∣ 2 = 0 ≤ k max ⁡ j ≤ N ∣ ∣ X ( j ) ∣ ∣ 2 ≤ k ∗ C x 其 中 C x = max ⁡ j ≤ N ∣ ∣ X ( j ) ∣ ∣ 2 为 定 值 \begin{aligned} {\vert \vert W^k \vert \vert}^2&={\vert \vert W^{k-1}+y^{(j)}X^{(j)}\vert \vert }^2\\ &={\vert \vert W^{k-1}\vert \vert}^2+2y^{(j)}{W^{k-1}}^TX^{(j)}+{\vert \vert X^{(j)}\vert \vert}^2\\ &\leq {\vert \vert W^{k-1}\vert \vert}^2+{\vert \vert X^{(j)}\vert \vert}^2\\ &\leq {\vert \vert W^{0}\vert \vert}^2+\sum_{j=1}^{k}{\vert \vert X^{(j)}\vert \vert}^2 \quad \quad 其中{\vert \vert W^{0}\vert \vert}^2=0 \\ &\leq k\max_{j \leq N}{\vert \vert X^{(j)}\vert \vert}^2\\ &\leq k*C_x \quad \quad 其中C_x=\max_{j \leq N}{\vert \vert X^{(j)}\vert \vert}^2为定值 \end{aligned} Wk2=Wk1+y(j)X(j)2=Wk12+2y(j)Wk1TX(j)+X(j)2Wk12+X(j)2W02+j=1kX(j)2W02=0kjNmaxX(j)2kCxCx=jNmaxX(j)2
  不等式二
W k = W k − 1 + y ( j ) X ( j )    ⟺    W k = W 0 + ∑ j = 1 k y ( j ) X ( j )    ⟺    W ∗ T W k = W ∗ T W 0 + ∑ j = 1 k y ( j ) W ∗ T X ( j ) 其 中 W ∗ T W 0 = 0    ⟺    ∣ ∣ W ∗ T W k ∣ ∣ 2 = ∣ ∣ ∑ j = 1 k y ( j ) W ∗ T X ( j ) ∣ ∣ 2 ≥ k 2 ∗ min ⁡ j ≤ N ∣ ∣ y ( j ) W ∗ T X ( j ) ∣ ∣ 2    ⟺    ∣ ∣ W ∗ T W k ∣ ∣ 2 ≥ k 2 ∗ C w x 其 中 C w x = min ⁡ j ≤ N ∣ ∣ y ( j ) W ∗ T X ( j ) ∣ ∣ 2 \begin{aligned} W^k=W^{k-1}+y^{(j)}X^{(j)} & \iff W^k=W^{0}+\sum_{j=1}^{k}y^{(j)}X^{(j)}\\ &\iff W^{*T}W^k=W^{*T}W^{0}+\sum_{j=1}^{k}y^{(j)}W^{*T}X^{(j)} \quad \quad其中 W^{*T}W^{0}=0\\ &\iff {\vert \vert W^{*T}W^k \vert \vert}^2= {\vert \vert \sum_{j=1}^{k}y^{(j)}W^{*T}X^{(j)}\vert \vert}^2 \geq k^2*\min_{j\leq N}{\vert \vert y^{(j)}W^{*T}X^{(j)}\vert\vert}^2\\ & \iff {\vert \vert W^{*T}W^k \vert \vert}^2 \geq k^2*C_{wx} \quad\quad 其中C_{wx}=\min_{j\leq N}{\vert \vert y^{(j)}W^{*T}X^{(j)}\vert\vert}^2 \end{aligned} Wk=Wk1+y(j)X(j)Wk=W0+j=1ky(j)X(j)WTWk=WTW0+j=1ky(j)WTX(j)WTW0=0WTWk2=j=1ky(j)WTX(j)2k2jNminy(j)WTX(j)2WTWk2k2CwxCwx=jNminy(j)WTX(j)2
  不等式三
∣ ∣ W ∗ T W k ∣ ∣ 2 ≤ ∣ ∣ W ∗ ∣ ∣ 2 ∣ ∣ W k ∣ ∣ 2 \begin{aligned} {\vert \vert W^{*T}W^k \vert \vert}^2\leq{\vert \vert W^{*} \vert \vert}^2{\vert \vert W^k \vert \vert}^2 \end{aligned} WTWk2W2Wk2
  综合不等式二和三
∣ ∣ W k ∣ ∣ 2 ≥ k 2 ∗ C w x ∣ ∣ W ∗ ∣ ∣ 2 {\vert \vert W^k \vert \vert}^2\geq \frac{k^2*C_{wx}}{{\vert \vert W^{*} \vert \vert}^2} Wk2W2k2Cwx
  综合前面所有不等式
k 2 ∗ C w x ∣ ∣ W ∗ ∣ ∣ 2 ≤ ∣ ∣ W k ∣ ∣ 2 ≤ k ∗ C x    ⟺    k ≤ C x ∣ ∣ W ∗ ∣ ∣ 2 C w x \frac{k^2*C_{wx}}{{\vert \vert W^{*} \vert \vert}^2}\leq {\vert \vert W^k \vert \vert}^2\leq k*C_x\iff k \leq\frac{C_x{\vert \vert W^{*} \vert \vert}^2}{C_{wx}} W2k2CwxWk2kCxkCwxCxW2
  有不等式结果可得,感知器算法更新的次数 k k k是有上限的。因此算法会终止,从而算法在有限步内能够找到我们想要的直线。
 

感知器算法python编程实现(源码)

  源代码:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import ListedColormap


X1 = np.random.multivariate_normal(np.array([1, 1]), np.array([[0.2, 0], [0, 0.2]]), 50)
X2 = np.random.multivariate_normal(np.array([4, 4]), np.array([[0.2, 0], [0, 0.2]]), 50)
data = np.concatenate((X1, X2))
label = np.ones(100)
label[0:50] = -1

class Perceptron:

    def __init__(self, data:np.array, label:np.array):
        self.data = np.mat(data)
        self.label = label

    def train(self) -> tuple:
        w = np.mat([0, 0]).T
        b = 0
        alpha = 1
        stop = 0
        while not stop:
            stop = 1
            for i in range(self.data.shape[0]):
                y = self.data[i:i+1, :] * w + b
                if (y * self.label[i])[0, 0] <= 0:
                    w = w + self.data[i:i+1, :].T * self.label[i] * alpha
                    b = b + self.label[i] * alpha
                    stop = 0
        return w, b


if __name__ == "__main__":
    perceptron = Perceptron(data, label)
    w, b = perceptron.train()

    t1 = np.linspace(0, 5, 500)
    t2 = np.linspace(0, 5, 500)
    T1, T2 = np.meshgrid(t1, t2)
    V = np.sign(w[0, 0] * T1 + w[1, 0] * T2 + b)
    colorsList = ["yellow", "pink"]
    plt.pcolormesh(T1, T2, V, cmap=ListedColormap(colorsList))

    plt.xlim([0, 5])
    plt.ylim([0, 5])
    plt.scatter(X1[:, 0], X1[:, 1], c="blue", label="-1")
    plt.scatter(X2[:, 0], X2[:, 1], c="red", label="1")
    plt.legend()
    plt.show()

  结果:

感知器分类结果

感知器非线性分类算法–Pocket算法

  对于线性不可分的二分类问题,我们该怎么办呢?我们可以采用改进的一种迭代策略。这个算法的理解可以参考上面的感知器算法的直观感受
   N N N表示样本的总个数, x ( i ) x^{(i)} x(i)为某个样本点, y ( i ) ∈ [ − 1 , 1 ] y^{(i)}\in[-1,1] y(i)[1,1]为对应标签。
  Step1:初始化权值和偏置
  Step2:while直到我们的权值对所有样本不更新:
      i i i:如果 y ( i ) ( w T x ( i ) + b ) > 0 y^{(i)}(w^Tx^{(i)}+b)>0 y(i)(wTx(i)+b)>0,我们此时 F ( x ( i ) ) F(x^{(i)}) F(x(i))=0,没有梯度可以更新,因此不更新权值。
      i i ii ii:如果 y ( i ) ( w T x ( i ) + b ) < 0 y^{(i)}(w^Tx^{(i)}+b)<0 y(i)(wTx(i)+b)<0,此时我们按以下下公式进行更新,对应随机梯度下降( α \alpha α为我们的学习率):
{ w n e w = w o l d + α y ( i ) x ( i ) b n e w = b o l d + α y ( i ) \begin{cases} w_{new} = w_{old} + \alpha y^{(i)}x^{(i)}\\ b_{new} = b_{old} + \alpha y^{(i)} \end{cases} {wnew=wold+αy(i)x(i)bnew=bold+αy(i)
      如果 w n e w 和 b n e w w_{new}和b_{new} wnewbnew表示的直线分类效果(错分类点个数)比 w o l d 和 b o l d w_{old}和b_{old} woldbold表示的直线分类效果更好,则保留 w n e w 和 b n e w w_{new}和b_{new} wnewbnew,否则保留 w o l d 和 b o l d w_{old} 和b_{old} woldbold
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值