机器学习笔记

https://study.163.com/course/introduction.htm?courseId=1004570029 吴恩达网易云课堂

简要步骤

1.收集出训练集,分析数据特征(监督学习

2.绘制训练集图像,分析数据特征变量,得到假设函数

3.根据假设函数,得到代价函数(线性回归/逻辑回归函数

4.用梯度下降法或正规方程+正则化minimize代价函数----Octave计算(专业)

5.得到参数,得到假设函数,即训练集的原始函数

6.编码实现

7.得到的函数程序,输入x会返回相应的y

例如,你可以写个乘法程序,输入为乘数和被乘数,输出为积。只不过,我们这个问题不是乘法这么简单,是个待求的算法

章节1 绪论:初识机器学习

1.什么是机器学习

目的:采用学习算法,尝试模拟人类大脑的学习方式

 

       例如,人类根据经验,可以从乌云漫天中,预测大雨的到来。机器学习正是这样一门学科,它目的是通过计算的手段,利用经验来改善系统自身性能。

       在计算机系统中“经验”通常以“数据”的形式存在。因此,机器学习研究的主要内容,是关于在计算机上从数据中产生“模型”的算法,即“学习算法”。

       有了算法,我们把经验数据提供给它,它就你就能基于这些数据产生的模型,在面对新情况时,例如,看到云的情况,模型会给我们提供相应的判断。

       我们解决的问题是“判断下雨或不下雨”,例子的“云”是一个特征变量。一个问题可以有多个特征变量,有了变量,根据函数模型输出的结果,做出判断。

2.监督学习

我们教会计算机学习,即训练样本,有x也有y

3.无监督学习

计算机自己学习,即训练样本,只有x,没有y

 

 

 

 

 

 

 

 

章节2 单变量线性回归

1.模型描述

1.先拿到数据集图像

整个监督学习的过程:

某地区房价的数据集,及这些数据作的图(这些是训练样本,即都是已知的数据,不同房子的面积x和价格y。)

求,这地区买一个1250平方英尺房子的价格。你可以进行模型拟合。这组数据似乎适合直线:

 

       根据这个直线模型,你可以告诉你朋友,1250平方英尺房子的价格大概是220,000美元。

 

       这是一个监督学习算法的例子,因为数据集是实际的大小和价格。而且,这还是一个回归类型的问题,回归是指,我们预测一个具体的数值输出。另一种常见的监督学习问题是,分类问题,用来预测离散值输出。比如我们观察肿瘤,想判断它是良性还是恶性,这是只有0和1的离散输出,这就是一个分类问题。

 

       在监督学习中,我们有个数据集,称之为训练集。以住房价格为例,我们有一个房价的训练集,我们的工作是从这些数据中学习如何预测房价。

       一般,用m表示训练集里样本的数量;小写x表示,输入变量或特征;小写y表示输出,即预测值;(x, y)表示一个训练样本。(x^i, y^i)表示具体的第i个样本。

 

       那么监督学习算法是如何工作的:我们向学习算法提供训练集,比如房价这个训练集;学习算法的任务,就是得到一个函数,通常是小写的h表示,h就是假设函数,假设函数hypothesis的作用是,把房子的大小x作为输入变量,它会给出房价的预测值y,假设函数h就是一个引导从x得到y的函数。

       那么如何表示这个假设函数h呢?

先写一个简单的假设函数:h_Θ(x) = Θ_0 + Θ_1*x

有时会把h_Θ(x)缩写为h(x)

       y是一个关于x的线性函数,为什么是一个线性函数呢?因为线性简单嘛,先从简单的说起,然后在此基础上讲复杂的。

       这个特定的模型,我们叫它线性回归。这个例子是一个一元线性回归,变量是x,这是个单变量x的函数,我们称之为单变量线性回归

 

2.代价函数

       那么如何手动实现上节的模型呢?

再来看一下我们的假设函数:h_Θ(x) = Θ_0 + Θ_1*x

这是我们用来预测的函数,这些Θ_0和Θ_1叫模型参数,任务的关键是如何选择模型参数的值,即Θ_0 = ? 和Θ_1 = ?,选择不同的模型参数,会得到不同的假设函数:

这里我们把h_Θ(x)简写成h(x)

 

       在解决线性回归问题时,我们有一个训练集,如下图,我们的假设函数,就是尽量去拟合我们的训练集,也就是:我们要对样本(x, y),有h(x)值 接近y值,这是的模型参数,就是我们要的参数,这时的假设函数,就是我们要的函数。

在线性回归问题中,我们要解决的是一个最小化问题,我想要h(x)与y之间的差异最小化。

用公式表示:(h(x)-y)^2 的值最小化(ps:至于为什么用平方差表示最小,别问我-。-)

已知,(x^I, y^i)表示是第i个样本,那么全部样本查之和就是:

 

h_Θ(x)是我们的假设函数,m是训练集的样本数量,

这时,我们定义一个代价函数:

我们要做的就是求代价函数J(Θ_0, Θ_1)的最小值

代价函数也被称为平方误差函数平方误差代价函数

这里代价函数的选择,不要问为什么。

 

现在捋一捋整个思路:

       首先,我们想要一个假设函数,来拟合训练集;假设函数由模型参数决定;代价函数值最小时的模型参数,就是正确的假设函数的参数。

所以:求得代价函数最小值时的模型参数Θ,即可得到我们想要的函数。假设函数是关于x的函数;代价函数是关于Θ的函数。

然后,我们简化函数,使其只有一个Θ,即h(x) = Θx;相应的代价函数变为J(Θ)。

       接着,我们通过不断假设Θ的值,来画出代价函数J(Θ)的图像大概这个样子,这种叫凸函数。这里注意。它就是这个样子的,别问为什么。

 

再看一下我们的公式:

 

假设函数、参数、代价函数、优化目标

       这次优化目标,也就是求代价函数最小值时,我们保留Θ_0,代价函数如下图:

 

      

 

 

 

为了方便展示,我们用等高线,等高图像。

 

      

得到代价函数的最小值,就得到假设函数的算法原型。但是,我们想要的是自动得到代价函数的最小值啊,如何实现?

3.梯度下降

我们之前已经定义了代价函数,并且优化目标:代价函数最小值

梯度下降法用来将代价函数最小化

梯度下降法的思路:要知道,J函数是凸函数。

1给模型参数设定初始值:Θ_0=0, Θ_1=0

2不停的一点点改变模型参数的值,来使J(Θ_0, Θ_1)变小,直到我们找到J的最小值。

 

下面是梯度下降算法的定义(实现步骤)

我们要更新参数Θ_j ,Θ_j更新公式和同步更新步骤,

 

       学习率决定梯度下降的幅度;这里的导数项是一个偏导数标记,即求J(Θ_0, Θ_1)中参数Θ_j的偏导数;注意,更新必须同步

 

学习率太大,甚至无法收敛至最小值。

同时注意,随着导数项,即斜率变小,下降幅度会越来越小,直到到达最低点。

 

4.线性回归的梯度下降

之前分别学习了线性回归、梯度下降,今天把两个概念合并使用。

              梯度下降                                              线性回归

先不考虑学习率,只集中处理导数项:

 

 

 

 

 

 

更新过程:

 

 

 

这个算法也叫Batch梯度下降

章节3 线性代数回顾

1.矩阵和向量

 

表示矩阵的特定元素:

 

下面是个4维向量(矩阵也叫向量):

注意,默认开始下标是1,而且,用大写字母,比如A,B,C表示矩阵

2.加法和标量乘法

只有相同维度的两个矩阵才可以相加,且会得到一个相同维度的向量:

 

向量与标量相乘(标量即实数):标量与个元素相乘

 

 

 

 

3.矩阵向量乘法

 

3x2维  x  2x1维 = 3x1维

 

下面是一个例子:假设有4个房子,有一个函数可以预测房价,如何快速计算房价呢?

可以利用矩阵向量相乘的方法:先构造一个矩阵,再构造一个向量,然后让矩阵和向量相乘

       这意味着,用Octave,你可以直接一行代码搞定,就可以得到4个房子的预测价格,即一次性解4个方程。当然,你也可以用for循环写,但是,如果房子数量很多时,效果会很差。

 

 

 

4.矩阵乘法

矩阵与矩阵相乘,取出第二个矩阵的每一列,单独去计算:

 

关于矩阵和矩阵乘法更简洁的技巧:

一次矩阵操作,你就得出了12中预测结果。

5.矩阵乘法的特性

矩阵符合结合律不符合交换律

实数乘法有交换律:3x5 = 5x3

但是矩阵没有交换律:A x B ≠ B x A

实数乘法的结合律:3x(5x2) = (3x5)x2

矩阵也符合结合律

单位矩阵

矩阵A乘以单位矩阵等于A,I表示单位矩阵

 

6.逆和转置

实数的倒数:3x(3-1) = 1 ,当然0没有倒数。

矩阵也有逆:Ax(A-1) = I

方阵是行列数相等的矩阵,只有方阵才有逆矩阵。

元素都为0的方阵也没有逆矩阵

矩阵的转置运算:

 

假设B是A的转置矩阵,那么:

章节4 多变量线性回归

1.多特征变量

多个特许量的线性回归

之前我们房价的例子中,只有一个变量x,即房子面积

 

多个特征变量时:面积,卧室数量,楼层,房子年代

训练样本数量:m

特征变量数量:n

第i条样本全部输入变量:xi

 

我们有了多个特征变量后,假设函数也需要改变:因为我们要让特征变量影响预测。

新的假设函数:

h_Θ(x) = Θ0 + Θ1*x1 +Θ2*x2 +Θ3*x3 +…+Θn*xn

再化简这个函数:设x0 = 1

那么假设函数变为:

h_Θ(x) = Θ0 *x0+ Θ1*x1 +Θ2*x2 +Θ3*x3 +…+Θn*xn

那么选择用矩阵X表示所有特征x;矩阵Θ表示所有Θ,得到新的假设函数:

这就是多特征变量时的假设函数,称之为多元线性回归

2.多元梯度下降法

如何使用梯度下降法来处理多元线性回归?

多元线性回情况分析:其中x0=1

我们可以把参数看做一个n+1维的向量Θ,同时把代价函数看做J(Θ)

梯度下降算法如下:

 

特征变量n=1时的梯度下降算法:

 

新的梯度下降算法:特征变量n>=1

3.多元梯度下降法演练-特征缩放

梯度下降法运用中的技巧:特征缩放,来提高下降效率

这里举例两个特征变量x1,x2 ,由于两个特征变量的取值范围差距较大,导致代价函数图像很奇特:

 

这时,我们可以用特征缩放,来解决这一问题:

       这个例子中,我们通过特征缩放,使得两个变量的取值范围都是0~1,当然,不一定非要是0~1,专家推荐的范围是-3~3,-1/3~1/3,即不能太大,也不能太小。

均值归一化:让特征变量得到相近的取值范围

特征缩放的值不需要太精确,只是为了加快梯度下降而已。

4.多元梯度下降法演练-学习率

这主要讨论学习率α,如何选择学习率?

下面是梯度下降算法的更新规则:

首先确保梯度下降正常工作,梯度下降就是找到Θ,使J(Θ)值最小

       正常来说,每一次迭代之后,J(Θ)都应该下降,当下降很缓慢时,或者迭代不再引起J(Θ)下降时,说明下降算法差不多已经收敛了。要知道的是,不同的问题,迭代次数,不一样,有的30次,有的3000次,有的300W次。

我们可以画上面的曲线,来判断梯度下降的收敛,事实上,专家都经常这么做。。。

也可以用另一种算法,来确定下降是否已经收敛。

当你画的J(Θ)曲线,出现上升的情况时,可能因为你的学习率太大导致的。

 

       通常,我们使用较小的学习率,因为,只要学习率足够小,每次迭代一定会下降,只不过,可能会很慢很慢。所以,学习率也不能太小。

       那么该如何选择学习率呢?

尝试不同的学习率α,然后画曲线图观察,取值推荐,从两头交替尝试,然后选择使得J(Θ)快速下降的α值,即一个不错的学习率,差不多,就用它吧。

0.001,0.003,0.01,0.03,0.1,0.3,1

5.特征和多项式回归

技巧1:特征的选择

       以预测房价为例,比如我们有房子的长x1和宽x2的作为特征变量,那么我们的假设函数就有两个变量。

       但是实际上,我们可以用房子面积x这个特征,来代替长x1、宽x2,这两个特征,即我们的假设函数,只有一个变量就够了。

       这只是一种思路,就是尽量用少的变量,这样假设函数会简单,整个实现学习的效率也就高点。

技巧2:多项式回归:

还是以房价问题为例

 

假设函数1虽然很好的拟合了现有的数据,但是,二次函数最终是个抛物线,不符合房价问题的逻辑。所以,我们用假设函数2。

假设函数2,使用梯度下降法时,特征缩放很重要,因为涉及到x3,导致取值范围很3次方的放大,所以要特征缩放,来解决。

 

技巧3:

上述的例子,除了三次函数做假设函数,我们还有别的选择。比如平方根函数

平方根函数的图像:

https://gss0.baidu.com/9fo3dSag_xI4khGko9WTAnF6hhy/zhidao/wh%3D600%2C800/sign=60831e181cdfa9ecfd7b5e1152e0db3b/9f510fb30f2442a74b6381a1dc43ad4bd1130240.jpg

这个例子的意思是说,假设函数有多种选择,答案不唯一,选择一个比较合适的即可。

6.正规方程-区别于迭代法直接解法

       之前学的梯度下降算法,是一种迭代算法,即需要多次迭代,一点一点求出代价函数的最小值。

       正规方程,它可以直接一次求解,得出代价函数的最小值。

正规方程,实现过程:

#求导,导数等于0时,即是原函数的最小值;

$对添加导数项,求导,令导函数=0,此时,得到代价函数最小值。

把样本构造成矩阵X,向量y

正规方程公式,得到的Θ即是J(Θ)最小值的Θ。

Octave实现正规方程的语法

       那么何时用梯度下降,何时用正规方程呢?当特征变量数量<10000时,用正规方程即可;但当特征变量数量很大时,比如上万,上百万时,就得用梯度下降了。

       当然,如果使用正规方程的话,也就不需要使用特征缩放了。

7.正规方程在矩阵不可逆情况下的解决方法

       不要担心矩阵不可逆,一般很少遇见这种情况。即使要操作的矩阵不可逆,也可以在Octave里用命令实现正规方程:

 

章节5 Octave教程

1.基本操作

Octave可以帮助我们更高效的学习和工作,更快的写出算法原型。

加,减,乘,除,次方

 

逻辑运算:等于,不等于,与,或,亦或

隐藏提示符:

变量

在命令后面加分号-不打印

sprintf命令-生成一个字符串;disp命令-显示

format long 可以long形式将变量打印出来

矩阵操作

 

size-矩阵维度:3行2列;第一个维度大小;第二个维度大小

 

length-最大维度的大小

生成向量v

 

生成一个2x3的矩阵,且矩阵中每个元素都为1

 

 

ones元素都为1;zeros元素都为0

 

rand元素都是随机的介于0~1的数

 

randn元素服从高斯分布-均值为0,标准差和平方差为1

hist绘制直方图

 

eye生成单位矩阵

 

help命令;help eye;help help

Q退出命令;quit/exit退出程序

2.移动数据

1.把文件加载到Octave中;把外部数据存到矩阵中;如何对矩阵进行操作;保存计算结果;如何移动这些数据

pwd-查看当前路径

cd-切换路径;同样支持ls命令

 

load 文件名-从文件系统中加载文件

 

 

 

who-显示当前Octave工作空间中所有变量; whos-更详细的显示

clear 变量名-删除变量;clear –删除所有变量

将变量priceY的前10个元素赋给变量v:

 

将变量存入硬盘:

save文件名 变量名--将变量v保存为一个名为hello.mat的文件;文件路径在当前目录;文件格式根据需求,比如.txt等

 

矩阵的索引

 

不仅可以取,还可以给指定位置的元素赋值:

给矩阵A附加元素:

 

A(:) -–将矩阵A中的元素,以一列的形式全部输出

 

矩阵组合操作:分号换行

 

 

 

3.计算数据

矩阵准备:

A*C—矩阵乘法;A .*B—相应元素相乘;点号,表示元素的运算。

        

exp--以e为底,v中元素为指数;abs(v)—v中所有元素的绝对值

 

 

矩阵的转置:

 

矩阵a中最大的元素;最大的元素及其下标;直接max(A)—每一列的最大值

 

 

 

 

magic幻方矩阵:每行,每列,每条对角线元素之和相等。

每列的最大值:1表,从A的第一维度取值;每行的最大值:2,从A的第二维度取值

     

sum(A,1)—

 

sum()—求和函数;prod()—求积函数;floor()—向下取整函数;ceil()—向上取整函数

 

求每行每列的最值:

每列的和;sum(A,2)—每行的和

理解为:从每一行中取一个元素,不就得到列和嘛。

max(A):默认是求每列的最大值;整个矩阵的最大值:max(max(A))或max(A(:))

 

逆矩阵

 

4.数据绘制

之前的梯度下降法中说到,需要画J(Θ)曲线图,来观察下降算法是否收敛。

 

矩阵准备:

命令hold on – 在就图像的基础上画图。

lgend(‘sin’, ‘cos’)       title(‘my plot’)

 

print –dpng ‘myPlot.png’  -- 保存成.png格式,到当前目录,也可以cd到目标目录。

Close –关闭图像

 

subplot(1,2,1)—生成一个1*2的格子,并使用第1格

plot到第1格上

subplot(1,2,2)—生成一个1*2的格子,并使用第2格

plot到第2格上

 

改变左边轴刻度:

axis([0.5 1 -1 1])---x轴的范围是0.5~1;y轴的范围是-1~1

清除图像-clf

 

生成格图,不同值对应不同颜色:

逗号——多个命令,一个个执行,链接命令。

5.控制语句:for,while,if 语句

For循环:

 

 

如何定义和调用函数:

自己定义函数时,先在当前目录创建一个squareThisNumber.m文件

错误例子:说是函数未定义,其实应该是路径问题,Octave找不到文件;或者是文件名和命令行输入的不对应。

 

而且Octave的一个函数,可以有多个返回值:

 

一个更复杂的函数的例子:

6.矢量

向量化—高效

使用合适的向量化方法,可以使代码更简单,高效

向量化,就是将函数中的多个参数和变量,向量化成向量,来计算:

下面是一个更复杂的例子:

如何用向量化的代码实现:

Theta和lamuda都是向量

 

章节6 Logistic回归(逻辑回归)

1.分类

       预测变量y是个离散值的分类问题,logistic回归算法,比较流行。 对于分类问题,我们希望我们的分类器输出在0~1之间,这样可以更好的对结果分类。              

先看二分类:

                                                                                    

此图合理,阀值右边为正,左边为负。

       别用线性函数去解决分类问题。上一个图看看起来很正常,但是当出现新数据时,为了拟合数据,函数会变动,出现新阀值点,导致预测失灵。

       此图新阀值左边有两个预测错误的点。那这个线性函数就很差劲了。显然我们要找的是第一个阀值点,但是为了拟合数据,函数会得到错误的阀值点。所以,别用线性函数去解决分类问题。

 

我们用logistic回归算法来解决分类问题:

其特点是,算法的输出一直介于0和1之间

线性回归时的假设函数为:hΘ(x) = ΘTX

Logistic回归的假设函数:hΘ(x) = g(ΘTX) ; g(z) = 1 /1+e-z  à hΘ(x) = 1 /1+e-ΘTX

即,分类问题的logistic回归算法的假设函数为:

这里的g(z)叫sigmoid函数,也叫logistic函数。

2.假设陈述

3.决策界限/决策边界

 

意思是:有确定的假设函数(之后会讲如何求参数);

              根据logistic函数图像,和我们设定的阀值0.5,我们知道

              -3+x1+x2>=0 à g(z)>=0.5 à  y=1

              即x1+x2=3这条线为决策边界,划分y=0和y=1区域。

决策边界是假设函数的一个属性,是根据决策函数求出的,而不是看着数据图画出来的。

 

 

 

例子:

 

4.代价函数

 

 

我们总希望代价函数是一个凸函数,这样很好求其最小值。

 

5.简化代价函数与梯度下降

如何运用梯度下降法来拟合出logistic回归的参数?

如何完整的实现一个logistic回归

合并:

 

整理后的代价函数:

 

 

现在,我们得到logistic回归的代价函数了,接着就是求代价函数的最小值。

用梯度下降法来最小化代价函数:

所以,线性回归和logistic回归是完全不一样的。

同时,在重复下降操作时,最好用向量化的方法去实现,要比循环来的更简介、更高效。

 

 

6.高级优化

比梯度下降更高效。

再来看一下梯度下降的思路:

所以,我们主要做的就是计算偏导数

这三种高级优化,可以根据内置循环自动得到学习率。用java编程时,可能需要多试几个函数库来找更合适的函数。

调用高级的优化算法,fminunc无约束最小化函数

 

 

 

7.多元分类:一对多

多类别分类:

 

一对多的分类:思路是这样的,不管 类别有多少个,都可以分为目标类其他类两类,将这样一个个目标类的方法,把多个类一一分出来。

总结一下:我们训练一个逻辑回归分类器,预测i类别y=i的概率。最后为了做出预测,我们给出一个新的输入值x,期望获得预测。我们要做的就是,在比如三个分类器运行输入x,然后选择h最大的类别,也就是要选择分类器,选择出三个中可信度最高,效果最好的那个,无论i值是多少,我们都能得到一个最高的概率值,我们预测y就是那个值。

章节7 正则化

1.过拟合问题

正则化用于解决过拟合问题

 

       概括的说,过拟合会在变量过多的时候出现。如果我们拟合出一个高阶多项式,那么这个假设函数,能拟合几乎所有的数据,这函数就可能,太过庞大、变量太多,我们没有足够的数据来约束它,这就是过拟合。它千方百计去拟合训练集,导致它泛化到新的样本中。类似的说法同样可以应用到逻辑回归中。

 

下面是一个逻辑回归的例子:

 

 

那么,过拟合问题发生时,怎么解决?

前面的例子,我们可以绘制图像来判断,我们先绘制拟合训练集的假设函数的图像。但是,当参数特别多,阶数特别高时,绘图会很难。

方法1:尽量减少选取变量的数量,即人工检查变量清单,删选变量。但有时会很难抉择。

方法2:正则化。保留所有的特征变量,但是要减少量级或参数thetaj的大小。

 

2.代价函数

进行正则化时,还需要写出相应的代价函数。

一些直观的例子去理解正则化:

修改一下,在函数中加入惩罚项,使得参数theta3和theta4都非常小:

       现在,要使这个函数最小化的方法只有一个,那就是theta3和theta4要尽可能小,甚至是0最好,因为它俩的系数项很大,会使得整个函数变得很大,所以想最小化这个函数,需要将俩theta尽量接近于0,就像我们直接去掉这两项一样。

也就是这样:

       这样,这个函数还是相当于二次函数。这就是正则化的思想。这种思想就是,如果我们的参数值特别小,意味着,这是一个特别简单的假设函数。如果将这些参数都加上惩罚项,这相当于尽量去简化这个假设函数模型,因为这些参数都接近0,,实时证明,这样可以避免过拟合的出现。你可以不用理解原因。再看一下房价的例子,有100个特征变量:

       我们并不知道,那个参数是高阶项,所以每个都让它接近于0。即修改代价函数,来缩小所有的参数。加入一个新的项。新加项即为正则化项,可以缩小所有参数

 

下面是正则化的优化目标:

 

3.线性回归的正则化

 

你要使用正则化,式子就要改变为:

4.Logistic回归的正则化

       如何在更高级的优化算法中,使用正则化;对于这些高级算法,我们要做的是,自己定义一个costFunction函数,这个函数以参数变量theta作为输入(theta0z在Octave中写成theta(1) ,依次类推)。

       我们需要做的就是建立一个叫costFunction的函数,然后将它赋给fminunc函数中,

fminunc---函数在无约束条件下的最小值,所有,fminunc会将costFunction最小化;而costFunction函数会返回两个值,第一个返回值:jVal,我们需要写代码来计算代价函数J,正则化求这个代价函数,需要加入正则化项;第二个返回值:梯度gradient(1)=J(theta)对theta0的偏导数;gradient(2)=J(theta)对theta1的偏导数;以此类推

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值