常见机器学习概念

信息熵

信息熵(information entropy)是信息论的基本概念。描述信息源各可能事件发生的不确定性。20世纪40年代,香农(C.E.Shannon)借鉴了热力学的概念,把信息中排除了冗余后的平均信息量称为“信息熵”(熵的定义为信息的期望值),并给出了计算信息熵的数学表达式。 [1]信息熵的提出解决了对信息的量化度量问题。
公式:
在这里插入图片描述
其中:𝑝(𝑥𝑖)代表随机事件𝑥𝑖的概率。

信息量

一个具体事件的信息量应该是随着其发生概率而递减的,且不能为负。
如果我们有俩个不相关的事件x和y,那么我们观察到的俩个事件同时发生时获得的信息应该等于观察到的事件各自发生时获得的信息之和,即:

h(x,y) = h(x) + h(y)

由于x,y是俩个不相关的事件,那么满足p(x,y) = p(x)*p(y).
根据上面推导,我们很容易看出h(x)一定与p(x)的对数有关(因为只有对数形式的真数相乘之后,能够对应对数的相加形式,可以试试)。因此我们有信息量公式如下:
在这里插入图片描述
其中,负号是为了确保信息一定是正数或者是0,总不能为负数吧!
底数为2是因为,我们只需要信息量满足低概率事件x对应于高的信息量。那么对数的选择是任意的。我们只是遵循信息论的普遍传统,使用2作为对数的底!
信息量度量的是一个具体事件发生了所带来的信息,而熵则是在结果出来之前对可能产生的信息量的期望——考虑该随机变量的所有可能取值,即所有可能发生事件所带来的信息量的期望。即
在这里插入图片描述
转换一下为:
在这里插入图片描述
信息熵还可以作为一个系统复杂程度的度量,如果系统越复杂,出现不同情况的种类越多,那么他的信息熵是比较大的。
如果一个系统越简单,出现情况种类很少(极端情况为1种情况,那么对应概率为1,那么对应的信息熵为0),此时的信息熵较小。

梯度

梯度是矢量,既有大小、又有方向:

  • 大小是立足于函数中你选取的某点,在该点下指向各个方向(四面八方),选取的变化最大的方向下的那个值
  • 方向就是该点处取变换最大值时的那个方向
  • 变化大指的是,函数上某点的位置朝某方向稍微偏移一点,该函数值能突然变大或变小很多

梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。

期望(均值)、方差(variance)、标准差(Standard Deviation)、均方差、均方误差(MSE)、均方根误差(RMSE)

期望

在这里插入图片描述
数学期望简称期望,又称均值;可以用加权平均值来理解期望。

方差

在这里插入图片描述

协方差

协方差在概率论和统计学中用于衡量两个变量的总体误差。而方差是协方差的一种特殊情况,即当两个变量是相同的情况。协方差表示的是两个变量的总体的误差,这与只表示一个变量误差的方差不同。 如果两个变量的变化趋势一致,也就是说如果其中一个大于自身的期望值,另外一个也大于自身的期望值,那么两个变量之间的协方差就是正值。 如果两个变量的变化趋势相反,即其中一个大于自身的期望值,另外一个却小于自身的期望值,那么两个变量之间的协方差就是负值。
在这里插入图片描述

标准差/均方差

标准差(Standard Deviation):又常称均方差,是方差的算术平方根,用σ表示。标准差能反映一个数据集的离散程度。 其实方差与标准差都是反映一个数据集的离散程度,只是由于方差出现了平方项造成量纲的倍数变化,无法直观反映出偏离程度,于是出现了标准差。
在这里插入图片描述
同样也存在与方差一样的情况:
均方差:均方差就是标准差,标准差就是均方差。

均方误差(MSE)/方根误差(RMSE)

均方误差(MSE):是衡量“平均误差”的一种较方便的方法。是参数估计值与参数真值之差的平方的期望值(均 值)。常运用在信号处理的滤波算法(最小均方差)中,表示此时观测值observed与估计值 predicted之间的偏差,即
在这里插入图片描述
均方根误差:是均方误差的算术平方根。
在这里插入图片描述

贝叶斯定理

贝叶斯定理是关于随机事件 A 和 B 的条件概率:
在这里插入图片描述
其中P(A|B)是在 B 发生的情况下 A 发生的可能性。
在贝叶斯定理中,每个名词都有约定俗成的名称:

P(A)是 A 的先验概率,之所以称为“先验”是因为它不考虑任何 B 方面的因素。
P(A|B)是已知 B 发生后 A 的条件概率,也由于得自 B 的取值而被称作 A 的后验概率。
P(B|A)是已知 A 发生后 B 的条件概率,也由于得自 A 的取值而被称作 B 的后验概率。
P(B)是 B 的先验概率,也作标淮化常量(normalizing constant)。

通俗地讲就是当你不能确定某一个事件发生的概率时,你可以依靠与该事件本质属性相关的事件发生的概率去推测该事件发生的概率。用数学语言表达就是:支持某项属性的事件发生得愈多,则该事件发生的的可能性就愈大。这个推理过程有时候也叫贝叶斯推理。

相关系数

person correlation coefficient(皮尔森相关性系数)

皮尔逊相关系数,简称相关系数,严格来说,应该称为“线性相关系数”。这是因为,相关系数只是刻画了X,Y之间的“线性”关系程度。换句话说,假如X与Y有其它的函数关系但非线性关系时,用相关系数来衡量是不合理的。
相关系数定义为:
在这里插入图片描述
cov为协方差,σ 为标准差。
在这里插入图片描述

数据要求

1)正态分布:皮尔森相关性系数是协方差与标准差的比值,因为在求皮尔森相关性系数后,通常会用t检验的方法来进行皮尔森相关性系数检验,而 t检验是基于数据呈正态分布的假设的。
2)去除异常值:皮尔森相关性系数受异常值的影响比较大

spearman correlation coefficient(斯皮尔曼相关性系数)

斯皮尔曼相关性系数,通常也叫斯皮尔曼秩相关系数。“秩”,可以理解成就是一种顺序或者排序,那么它就是根据原始数据的排序位置进行求解,这种表征形式就没有了求皮尔森相关性系数时那些限制。下面来看一下它的计算公式:
在这里插入图片描述
计算过程就是:首先对两个变量(X, Y)的数据进行排序,然后记下排序以后的位置(X’, Y’),(X’, Y’)的值就称为秩次,秩次的差值就是上面公式中的di,n就是变量中数据的个数,最后带入公式就可求解结果。举个例子吧,假设我们实验的数据如下:
在这里插入图片描述
带入公式,求得斯皮尔曼相关性系数:ρs= 1-6*(1+1+1+9)/6*35=0.657
也就是说,我们不用管X和Y这两个变量具体的值到底差了多少,只需要算一下它们每个值所处的排列位置的差值,就可以求出相关性系数了。
而且,即便在变量值没有变化的情况下,也不会出现像皮尔森系数那样分母为0而无法计算的情况。另外,即使出现异常值,由于异常值的秩次通常不会有明显的变化(比如过大或者过小,那要么排第一,要么排最后),所以对斯皮尔曼相关性系数的影响也非常小!

kendall correlation coefficient(肯德尔相关性系数)

肯德尔相关性系数,又称肯德尔秩相关系数,它也是一种秩相关系数,不过它所计算的对象是分类变量。
分类变量可以理解成有类别的变量,可以分为
无序的,比如性别(男、女)、血型(A、B、O、AB);
有序的,比如肥胖等级(重度肥胖,中度肥胖、轻度肥胖、不肥胖)。
通常需要求相关性系数的都是有序分类变量。
由于数据情况不同,求得肯德尔相关性系数的计算公式不一样,一般有3种计算公式

常见的几种最优化方法(梯度下降法、牛顿法、拟牛顿法、共轭梯度法等)

梯度下降法(Gradient Descent)

梯度下降法是最早最简单,也是最为常用的最优化方法。梯度下降法实现简单,当目标函数是凸函数时,梯度下降法的解是全局解。一般情况下,其解不保证是全局最优解,梯度下降法的速度也未必是最快的。梯度下降法的优化思想是用当前位置负梯度方向作为搜索方向,因为该方向为当前位置的最快下降方向,所以也被称为是”最速下降法“。最速下降法越接近目标值,步长越小,前进越慢。 梯度下降法的搜索迭代示意图如下图所示:
在这里插入图片描述

梯度下降法的缺点:

(1)靠近极小值时收敛速度减慢,如下图所示;
(2)直线搜索时可能会产生一些问题;
(3)可能会“之字形”地下降。
在这里插入图片描述

从上图可以看出,梯度下降法在接近最优解的区域收敛速度明显变慢,利用梯度下降法求解需要很多次的迭代。
在机器学习中,基于基本的梯度下降法发展了两种梯度下降方法,分别为随机梯度下降法和批量梯度下降法。

比如对一个线性回归(Linear Logistics)模型,假设下面的h(x)是要拟合的函数,J(theta)为损失函数,theta是参数,要迭代求解的值,theta求解出来了那最终要拟合的函数h(theta)就出来了。其中m是训练集的样本个数,n是特征的个数。
在这里插入图片描述
在这里插入图片描述

1)批量梯度下降法(Batch Gradient Descent,BGD)

(1)将J(theta)对theta求偏导,得到每个theta对应的的梯度:
在这里插入图片描述
(2)由于是要最小化风险函数,所以按每个参数theta的梯度负方向,来更新每个theta:
在这里插入图片描述
(3)从上面公式可以注意到,它得到的是一个全局最优解,但是每迭代一步,都要用到训练集所有的数据,如果m很大,那么可想而知这种方法的迭代速度会相当的慢。所以,这就引入了另外一种方法——随机梯度下降。
对于批量梯度下降法,样本个数m,x为n维向量,一次迭代需要把m个样本全部带入计算,迭代一次计算量为m*n^2。

2)随机梯度下降(Stochastic Gradient Descent,SGD)

(1)上面的风险函数可以写成如下这种形式,损失函数对应的是训练集中每个样本的粒度,而上面批量梯度下降对应的是所有的训练样本:
在这里插入图片描述
(2)每个样本的损失函数,对theta求偏导得到对应梯度,来更新theta:
在这里插入图片描述
(3)随机梯度下降是通过每个样本来迭代更新一次,如果样本量很大的情况(例如几十万),那么可能只用其中几万条或者几千条的样本,就已经将theta迭代到最优解了,对比上面的批量梯度下降,迭代一次需要用到十几万训练样本,一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次。但是,SGD伴随的一个问题是噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。

随机梯度下降每次迭代只使用一个样本,迭代一次计算量为n2,当样本个数m很大的时候,随机梯度下降迭代一次的速度要远高于批量梯度下降方法。两者的关系可以这样理解:随机梯度下降方法以损失很小的一部分精确度和增加一定数量的迭代次数为代价,换取了总体的优化效率的提升。增加的迭代次数远远小于样本的数量。

对批量梯度下降法和随机梯度下降法的总结:

1)批量梯度下降-–最小化所有训练样本的损失函数,使得最终求解的是全局的最优解,即求解的参数是使得风险函数最小,但是对于大规模样本问题效率低下
2)随机梯度下降—最小化每条样本的损失函数,虽然不是每次迭代得到的损失函数都向着全局最优方向, 但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近,适用于大规模训练样本情况。

3)小批量梯度下降(mini-batch SGD )

SGD相对来说要快很多,但是也有存在问题,由于单个样本的训练可能会带来很多噪声,使得SGD并不是每次迭代都向着整体最优化方向,因此在刚开始训练时可能收敛得很快,但是训练一段时间后就会变得很慢。在此基础上又提出了小批量梯度下降法,它是每次从样本中随机抽取一小批进行训练,而不是一组。小批量梯度下降结合了sgd和batch gd的优点,每次更新的时候使用n个样本。减少了参数更新的次数,可以达到更加稳定收敛结果,一般在深度学习当中我们采用这种方法。
主要思想
其主要思想就是每次只拿总训练集的一小部分来训练,比如一共有5000个样本,每次拿100个样本来计算loss,更新参数。50次后完成整个样本集的训练,为一轮(epoch)。由于每次更新用了多个样本来计算loss,就使得loss的计算和参数的更新更加具有代表性。不像原始SGD很容易被某一个样本给带偏 。loss的下降更加稳定,同时小批量的计算,也减少了计算资源的占用。

4)对比

在这里插入图片描述

牛顿法和拟牛顿法(Newton’s method & Quasi-Newton Methods)

1)牛顿法(Newton’s method)

牛顿法是一种在实数域和复数域上近似求解方程的方法。方法使用函数f (x)的泰勒级数的前面几项来寻找方程f (x) = 0的根。牛顿法最大的特点就在于它的收敛速度很快。
具体步骤:
  首先,选择一个接近函数 f (x)零点的 x0,计算相应的 f (x0) 和切线斜率f ’ (x0)(这里f ’ 表示函数 f 的导数)。然后我们计算穿过点(x0, f (x0)) 并且斜率为f '(x0)的直线和 x 轴的交点的x坐标,也就是求如下方程的解:
  在这里插入图片描述
 我们将新求得的点的 x 坐标命名为x1,通常x1会比x0更接近方程f (x) = 0的解。因此我们现在可以利用x1开始下一轮迭代。迭代公式可化简为如下所示:
 在这里插入图片描述
 已经证明,如果f ’ 是连续的,并且待求的零点x是孤立的,那么在零点x周围存在一个区域,只要初始值x0位于这个邻近区域内,那么牛顿法必定收敛。 并且,如果f ’ (x)不为0, 那么牛顿法将具有平方收敛的性能. 粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。下图为一个牛顿法执行过程的例子。

由于牛顿法是基于当前位置的切线来确定下一次的位置,所以牛顿法又被很形象地称为是"切线法"。牛顿法的搜索路径(二维情况)如下图所示:

牛顿法搜索动态示例图:
  在这里插入图片描述
关于牛顿法和梯度下降法的效率对比:

从本质上去看,**牛顿法是二阶收敛,梯度下降是一阶收敛,**所以牛顿法就更快。如果更通俗地说的话,比如你想找一条最短的路径走到一个盆地的最底部,梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。(牛顿法目光更加长远,所以少走弯路;相对而言,梯度下降法只考虑了局部的最优,没有全局思想。)

根据wiki上的解释,从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。
在这里插入图片描述
注:红色:牛顿法的迭代路径,绿色:梯度下降法的迭代路径。

牛顿法的优缺点总结:
  优点:二阶收敛,收敛速度快;
  缺点:牛顿法是一种迭代算法,每一步都需要求解目标函数的Hessian矩阵的逆矩阵,计算比较复杂。

2)拟牛顿法(Quasi-Newton Methods)

拟牛顿法是求解非线性优化问题最有效的方法之一,拟牛顿法的本质思想是改善牛顿法每次需要求解复杂的Hessian矩阵的逆矩阵的缺陷,它使用正定矩阵来近似Hessian矩阵的逆,从而简化了运算的复杂度。拟牛顿法和最速下降法一样只要求每一步迭代时知道目标函数的梯度。通过测量梯度的变化,构造一个目标函数的模型使之足以产生超线性收敛性。这类方法大大优于最速下降法,尤其对于困难的问题。另外,因为拟牛顿法不需要二阶导数的信息,所以有时比牛顿法更为有效。如今,优化软件中包含了大量的拟牛顿算法用来解决无约束,约束,和大规模的优化问题。

具体步骤:
在这里插入图片描述
这个公式被称为割线方程。常用的拟牛顿法有DFP算法和BFGS算法。

共轭梯度法(Conjugate Gradient)

共轭梯度法是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。 在各种优化算法中,共轭梯度法是非常重要的一种。其优点是所需存储量小,具有步收敛性,稳定性高,而且不需要任何外来参数。
共轭梯度法和梯度下降法搜索最优解的路径对比示意图:
在这里插入图片描述
注:绿色为梯度下降法,红色代表共轭梯度法

启发式优化方法

启发式方法指人在解决问题时所采取的一种根据经验规则进行发现的方法。其特点是在解决问题时,利用过去的经验,选择已经行之有效的方法,而不是系统地、以确定的步骤去寻求答案。启发式优化方法种类繁多,包括经典的模拟退火方法、遗传算法、蚁群算法以及粒子群算法等等。

还有一种特殊的优化算法被称之多目标优化算法,它主要针对同时优化多个目标(两个及两个以上)的优化问题,这方面比较经典的算法有NSGAII算法、MOEA/D算法以及人工免疫算法等。

1)遗传算法(GA)

全局搜索能力强,局部搜索能力较弱,往往只能得到次优解而不是最优解。
研究发现,遗传算法可以用极快的速度达到最优解的90%以上,但是要达到真正的最优解需要花费很长时间,即局部搜索能力不足。

2)粒子群算法(PSO)

产生早熟收敛并被证明算法不是全局收敛
未加权重——收敛速度快但容易陷入局部最优解

3)蚁群算法

参数设置复杂,如果参数设置不当,容易偏离优质解

4)模拟退火算法

全局寻优,适合搭配粒子群、鲸鱼优化算法等容易陷入局部最优解的

5)鱼群算法

参数设置复杂,如果参数设置不当,容易偏离优质解.(同蚁群)

6)鲸鱼优化算法

6.1问题
算法陷入局部极值和收敛速度问题
陷入局部最优解
结合模拟退火算法,通过接受较差点来提升全局寻优能力
收敛速度慢
引入自适应权重,提升算法的局部寻优能力

解决约束优化问题——拉格朗日乘数法

拉格朗日乘数法的基本思想:作为一种优化算法,拉格朗日乘子法主要用于解决约束优化问题,它的基本思想就是通过引入拉格朗日乘子来将含有n个变量和k个约束条件的约束优化问题转化为含有(n+k)个变量的无约束优化问题。拉格朗日乘子背后的数学意义是其为约束方程梯度线性组合中每个向量的系数。

如何将一个含有n个变量和k个约束条件的约束优化问题转化为含有(n+k)个变量的无约束优化问题?拉格朗日乘数法从数学意义入手,通过引入拉格朗日乘子建立极值条件,对n个变量分别求偏导对应了n个方程,然后加上k个约束条件(对应k个拉格朗日乘子)一起构成包含了(n+k)变量的(n+k)个方程的方程组问题,这样就能根据求方程组的方法对其进行求解。

超参自动优化方法(网格搜索、随机搜索、贝叶斯优化和Hyperband)

超参数

超参数是在算法运行之前手动设置的参数,用于控制模型的行为和性能。
这些超参数的选择会影响到模型的训练速度、收敛性、容量和泛化能力等方面。
例如,学习率、迭代次数、正则化参数、隐藏层的神经元数量等都是常见的超参数。

常使用的超参数:

  • 动量参数(Momentum):这是用于加速梯度下降的参数,可以增加梯度的方向性,从而帮助模型更快地收敛。
  • 网络层数(Number of Layers):这是决定模型复杂度和表达能力的参数。一般来说,增加网络层数可以使模型更好地学习复杂的特征,但同时也增加了模型的参数数量和计算复杂度。
  • 隐层节点数(Number of Hidden Nodes):这是决定模型隐层大小和表达能力的参数。一般来说,增加隐层节点数可以使模型更好地学习复杂的特征,但同时也增加了模型的参数数量和计算复杂度。
  • 学习率下降幅度(Learning Rate Decay):这是用于控制学习率在训练过程中下降的参数。通过逐渐降低学习率,可以让模型在训练后期更加精细地逼近最优解。
  • mini-batch大小(Mini-batch Size):这是决定每次更新时使用梯度下降的样本数量的参数。一般来说,使用较大的mini-batch可以提高训练速度和稳定性,但可能会降低模型的泛化能力
  • 正则化参数(Regularization Parameters):这是用于控制正则化效果的参数,可以防止过拟合现象的发生。常用的正则化方法包括L1正则化、L2正则化和Dropout等。
  • 批处理次数(Number of Batches):这是决定每次训练过程中进行梯度更新的次数的参数。一般来说,增加批处理次数可以提高训练速度和稳定性,但可能会增加计算资源和时间成本。
  • 优化器选择(Optimizer):这是用于优化神经网络权重的算法选择。常用的优化器包括梯度下降法、随机梯度下降法、Adam等。
  • 初始权重设置(Initial Weights):这是用于初始化神经网络权重的参数。不同的初始权重设置可能会影响模型的收敛速度和最终性能。

网格搜索(Grid Search)

网格搜索是暴力搜索,在给定超参搜索空间内,尝试所有超参组合,最后搜索出最优的超参组合。sklearn已实现该方法,使用样例如下:

from sklearn import svm, datasets
from sklearn.model_selection import GridSearchCV
import pandas as pd

# 导入数据
iris = datasets.load_iris()
# 定义超参搜索空间
parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}
# 初始化模型
svc = svm.SVC()
# 网格搜索
clf = GridSearchCV(estimator = svc,
                   param_grid = parameters,
                   scoring = 'accuracy',
                   n_jobs = -1,
                   cv = 5)
clf.fit(iris.data, iris.target)
返回:GridSearchCV(cv=5, estimator=SVC(), n_jobs=-1,
                   param_grid={'C': [1, 10], 'kernel': ('linear', 'rbf')},
                   scoring='accuracy')

# 打印结果
print('详细结果:\n', pd.DataFrame.from_dict(clf.cv_results_))
print('最佳分类器:\n', clf.best_estimator_)
print('最佳分数:\n', clf.best_score_)
print('最佳参数:\n', clf.best_params_).
返回:
详细结果:
    mean_fit_time  std_fit_time  mean_score_time  std_score_time param_C  ... split3_test_score split4_test_score  mean_test_score  std_test_score  rank_test_score
0       0.000788      0.000394         0.000194        0.000389       1  ...          0.966667               1.0         0.980000        0.016330                1
1       0.000804      0.000402         0.000199        0.000399       1  ...          0.933333               1.0         0.966667        0.021082                4
2       0.000593      0.000484         0.000593        0.000484      10  ...          0.966667               1.0         0.973333        0.038873                3
3       0.000593      0.000484         0.000399        0.000489      10  ...          0.966667               1.0         0.980000        0.016330                1
[4 rows x 15 columns]
最佳分类器:
 SVC(C=1, kernel='linear')
最佳分数:
0.9800000000000001
最佳参数:
 {'C': 1, 'kernel': 'linear'}

sklearn.model_selection.GridSearchCV[1]的重要参数说明:

  • estimator: scikit-learn模型。
  • param_grid: 超参搜索空间,即超参数字典。
  • scoring: 在交叉验证中使用的评估策略。
  • n_jobs: 并行任务数,-1为使用所有CPU。
  • cv: 决定采用几折交叉验证。

随机搜索(Randomized Search)

随机搜索是在搜索空间中采样出超参组合,然后选出采样组合中最优的超参组合。随机搜索的好处如下图所示:
在这里插入图片描述
如果目前我们要搜索两个参数,但参数A重要而另一个参数B并没有想象中重要,网格搜索9个参数组合(A, B),而由于模型更依赖于重要参数A,所以只有3个参数值是真正参与到最优参数的搜索工作中。反观随机搜索,随机采样9种超参组合,在重要参数A上会有9个参数值参与到搜索工作中,所以,在某些参数对模型影响较小时,使用随机搜索能让我们有更多的探索空间。

from sklearn import svm, datasets
from sklearn.model_selection import RandomizedSearchCV
import pandas as pd
from scipy.stats import uniform


# 导入数据
iris = datasets.load_iris()
# 定义超参搜索空间
distributions = {'kernel':['linear', 'rbf'], 'C':uniform(loc=1, scale=9)}
# 初始化模型
svc = svm.SVC()
# 网格搜索
clf = RandomizedSearchCV(estimator = svc,
                         param_distributions = distributions,
                         n_iter = 4,
                         scoring = 'accuracy',
                         cv = 5,
                         n_jobs = -1,
                         random_state = 2021)
clf.fit(iris.data, iris.target)
返回:RandomizedSearchCV(cv=5, estimator=SVC(), n_iter=4, n_jobs=-1,
                         param_distributions={'C': <scipy.stats._distn_infrastructure.rv_frozen object at 0x000001F372F9A190>,
                                              'kernel': ['linear', 'rbf']},
                         random_state=2021, scoring='accuracy')


# 打印结果
print('详细结果:\n', pd.DataFrame.from_dict(clf.cv_results_))
print('最佳分类器:\n', clf.best_estimator_)
print('最佳分数:\n', clf.best_score_)
print('最佳参数:\n', clf.best_params_)
返回:
详细结果:
    mean_fit_time  std_fit_time  mean_score_time  std_score_time  param_C  ... split3_test_score split4_test_score  mean_test_score  std_test_score  rank_test_score
0       0.000598      0.000489         0.000200        0.000400   6.4538  ...          0.966667               1.0         0.986667        0.016330                1
1       0.000997      0.000002         0.000000        0.000000  4.99782  ...          0.966667               1.0         0.980000        0.026667                3
2       0.000798      0.000399         0.000399        0.000488  3.81406  ...          0.966667               1.0         0.980000        0.016330                3
3       0.000598      0.000488         0.000200        0.000399  5.36286  ...          0.966667               1.0         0.986667        0.016330                1
[4 rows x 15 columns]
最佳分类器:
 SVC(C=6.453804509266643)
最佳分数:
0.9866666666666667
最佳参数:
 {'C': 6.453804509266643, 'kernel': 'rbf'}

贝叶斯优化(Bayesian Optimization)

调优的目的是要找到一组最优的超参组合,能使目标函数f达到全局最小值。

举个例子,若学习率设置过大,模型可能会在代价函数的全局最优点附近不断来回震荡,甚至跳出全局最优点,而设置过小,又可能会陷入局部最优,因此调学习率这一参数,是为了让模型能收敛到代价函数的全局最小值。可是在机器学习中,目标函数 常是被称作expensive blackbox function,计算开销大且不一定为凸函数。为此,贝叶斯优化出现了,它特别适合针对expensive blackbox function找到全局最优。

假设我们的真实的目标函数 长下图这样:

Hyperband

除了格子搜索、随机搜索和贝叶斯优化,还有其它自动调参方式。例如Hyperband optimization,Hyperband本质上是随机搜索的一种变种,它使用早停策略和Sccessive Halving算法去分配资源,结果是Hyperband能评估更多的超参组合,同时在给定的资源预算下,比贝叶斯方法收敛更快。

大数定律

概率论历史上第一个极限定理属于伯努利,后人称之为“大数定律”。概率论中讨论随机变量序列的算术平均值向随机变量各数学期望的算术平均值收敛的定律。
在随机事件的大量重复出现中,往往呈现几乎必然的规律,这个规律就是大数定律。通俗地说,这个定理就是,在试验不变的条件下,重复试验多次,随机事件的频率近似于它的概率。偶然中包含着某种必然。
大数定律分为弱大数定律和强大数定律。
大数定律有若干个表现形式。其中常用的三个重要定律:

切比雪夫大数定理

在这里插入图片描述

伯努利大数定律

在这里插入图片描述

辛钦大数定律

在这里插入图片描述

假设检验

说明

假设检验是根据一定的假设条件,由样本推断总体的一种方法。

假设检验的基本思想是小概率反证法思想,小概率思想认为小概率事件在一次试验中基本上不可能发生,在这个方法下,我们首先对总体作出一个假设,这个假设大概率会成立,如果在一次试验中,试验结果和原假设相背离,也就是小概率事件竟然发生了,那我们就有理由怀疑原假设的真实性,从而拒绝这一假设。
在这里插入图片描述

假设检验的四种方法

1、有关平均值参数u的假设检验
根据是否已知方差,分为两类检验:U检验和T检验。
如果已知方差,则使用U检验,如果方差未知则采取T检验。

2、有关参数方差σ2的假设检验
F检验是对两个正态分布的方差齐性检验,简单来说,就是检验两个分布的方差是否相等

3、检验两个或多个变量之间是否关联
卡方检验属于非参数检验,主要是比较两个及两个以上样本率(构成比)以及两个分类变量的关联性分析。根本思想在于比较理论频数和实际频数的吻合程度或者拟合优度问题。

U检验/Z检验

U检验又称Z检验。
Z检验是一般用于大样本(即样本容量大于30)平均值差异性检验的方法(总体的方差已知)。它是用标准正态分布的理论来推断差异发生的概率,从而比较两个平均数的差异是否显著。

Z检验步骤:
第一步:建立虚无假设 H0:μ1 = μ2 ,即先假定两个平均数之间没有显著差异,
第二步:计算统计量Z值,对于不同类型的问题选用不同的统计量计算方法,
1、如果检验一个样本平均数(X)与一个已知的总体平均数(μ0)的差异是否显著。其Z值计算公式为:
在这里插入图片描述
其中:
在这里插入图片描述是检验样本的均值;
μ0是已知总体的平均数;
S是总体的标准差;
n是样本容量。

2、如果检验来自两个的两组样本平均数的差异性,从而判断它们各自代表的总体的差异是否显著。其Z值计算公式为:
在这里插入图片描述
第三步:比较计算所得Z值与理论Z值,推断发生的概率,依据Z值与差异显著性关系表作出判断。如下表所示:
在这里插入图片描述
在这里插入图片描述

T检验

在这里插入图片描述
在这里插入图片描述
第五步:根据是以上分析,结合具体情况,作出结论。
实际应用中,T检验可分为三种:单样本T检验、配对样本T检验和双独立样本T检验

卡方检验

卡方检验又称X2检验,在一般情况下,卡方检验是针对于离散变量的独立性检验,卡方检验的零假设为两个离散变量相互独立。
属于非参数检验,主要是比较两个及两个以上样本率(构成比)以及两个分类变量的关联性分析。根本思想在于比较理论频数和实际频数的吻合程度或者拟合优度问题。在很多时候,卡方检验都是非常重要的剔除无关特征的方法。

步骤:

在这里插入图片描述

from  scipy.stats import chi2_contingency
import numpy as np
kf_data = np.array([[11.7,8.7,15.4,8.4], 
                    [18.1,11.7,24.3,13.6],
                    [26.9,20.3,37,19.3],
                    [41,30.9,54.6,35.1],
                    [66,54.3,71.1,50]])
kf = chi2_contingency(kf_data)
print('chisq-statistic=%.4f, p-value=%.4f, df=%i \n expected_frep: \n%s'%kf)

F检验

F检验法是检验两个正态随机变量的总体方差是否相等的一种假设检验方法。
F统计量计算公式:
在这里插入图片描述

损失函数

一、定义

损失函数(Loss Function):是定义在单个样本上的,是指一个样本的误差,度量模型一次预测的好坏。
代价函数(Cost Function)=成本函数=经验风险:是定义在整个训练集上的,是所有样本误差的平均,也就是所有损失函数值的平均,度量平均意义下模型预测的好坏。
目标函数(Object Function)=结构风险=经验风险+正则化项=代价函数+正则化项:是指最终需要优化的函数,一般指的是结构风险。正则化项(regularizer)=惩罚项(penalty term)。
在这里插入图片描述

回归损失函数

回归问题的损失函数在机器学习和统计建模中起到了至关重要的作用。它们用于衡量模型的预测值与真实值之间的差异,从而指导模型的训练和优化过程。回归问题损失函数的功能和具体作用为:

  • 衡量模型性能: 损失函数用于量化模型在训练数据上的性能。它提供了一个具体的数值,反映了模型对训练数据的拟合程度。
  • 指导参数优化: 模型的目标是通过调整参数来最小化损失函数的值。优化算法(如梯度下降)使用损失函数的梯度信息来更新模型参数,使其逐步逼近最优值。
  • 处理过拟合和欠拟合: 损失函数可以帮助识别模型是否存在过拟合或欠拟合问题。如果损失函数在训练集上较低但在验证集上较高,可能表示模型过拟合。
  • 权衡精度和偏差: 不同的损失函数可以在精度(accuracy)和偏差(bias)之间进行权衡。例如,平方损失函数(MSE)偏向于优化精度,而绝对损失函数(MAE)对异常值更具鲁棒性。
  • 对异常值的敏感度: 不同的损失函数对异常值的敏感程度不同。例如,MSE对异常值更敏感,因为它对大误差给予更高的惩罚。
  • 定制化问题: 不同的损失函数可以适用于不同的问题和场景。例如,对于分位数回归问题,可以使用Quantile Loss。
  • 指导模型选择和评估: 选择合适的损失函数有助于确定适用于特定问题的最佳模型,并用于评估模型的性能。
    在优化中的约束条件: 某些损失函数具有特定的数学性质,可以在优化问题中引入约束条件,以确保模型具有特定的行为或性质。

回归问题的损失函数在训练和优化过程中起到了引导和评估的关键作用,帮助模型学习并提升对真实数据的拟合能力。选择合适的损失函数是建立有效回归模型的重要一步。

1.1 均方误差(Mean Squared Error, MSE)

均方误差(Mean Squared Error, MSE)是回归问题中常用的损失函数之一,它用于衡量模型的预测值与真实值之间的差异程度。其计算方式如下:
在这里插入图片描述
均方误差计算的实质是对每个样本的预测误差进行平方,然后求取所有样本的平均值。这样做的目的是为了放大误差,使其在计算中得到更大的权重,从而更加关注模型对于极端情况的拟合程度。

MSE的特点包括:

  • 对大误差敏感: 由于采用了平方操作,MSE会对大误差给予更大的惩罚,因此在训练过程中,模型会更加努力地降低大误差。
  • 连续可导: MSE是一个光滑、连续可导的函数,这使得它在优化算法中的使用相对容易。
  • 受异常值影响: MSE对异常值比较敏感,因为它会放大异常值的影响。

均方误差(Mean Squared Error, MSE)通常适用于以下回归算法和场景:

  • 线性回归: MSE 是线性回归中最常用的损失函数之一。线性回归的目标是最小化预测值与真实值的均方误差。
  • 多项式回归: 当采用多项式拟合数据时,MSE可以用来衡量模型对数据的拟合程度。
  • 任何需要对预测误差进行均衡考虑的场景: 如果在预测误差的分布中,不希望偏向过高或过低的误差,而希望对所有误差给予相对均等的关注,那么MSE是一个合适的选择。
  • 要求模型对大误差更加敏感的场景: MSE对大误差敏感,因此在需要模型更加关注大误差的情况下,MSE是一个合适的损失函数。
  • 需要连续可导损失函数的场景: MSE是一个连续可导的函数,这使得它在优化算法中的使用相对容易。
  • 要求在异常值影响下进行稳健拟合的场景: 由于MSE对异常值比较敏感,因此在训练数据中存在一些异常值,但又不希望这些异常值过度 影响模型拟合时,可以考虑使用Huber损失,它在一定程度上抗干扰能力更强。

均方误差适用于大多数需要对预测误差进行均衡考虑的回归问题,特别是在数据分布相对均匀且没有特别要求的情况下,MSE是一个直观且有效的选择。然而,在存在异常值或对预测误差的分布有特殊要求时,可能需要考虑其他类型的损失函数。

1.2 平均绝对误差(Mean Absolute Error, MAE)

平均绝对误差(Mean Absolute Error, MAE)是回归问题中常用的损失函数之一,它用于衡量模型的预测值与真实值之间的平均绝对差异程度。
在这里插入图片描述
MAE的计算方式将所有样本的绝对误差进行平均,相较于均方误差(MSE)它对于异常值更具有鲁棒性,因为它不会对误差进行平方,不会放大异常值的影响。

MAE的特点包括:

  • 对异常值的鲁棒性: MAE相对于MSE来说,对异常值更具有鲁棒性,因为它不会放大异常值的影响。
  • 平均绝对差异度量: MAE直接测量了预测值与真实值之间的平均绝对差异,提供了一个直观的度量。
  • 不可导性: 与MSE不同,MAE在零点附近不可导,这可能会在某些优化算法中带来一些挑战。

平均绝对误差是一个直观且鲁棒的损失函数,特别适用于对异常值不希望过分敏感的回归问题场景。然而,在需要对大误差给予更大的惩罚或者对预测误差的分布有特殊要求时,可能需要考虑其他类型的损失函数。平均绝对误差(Mean Absolute Error, MAE)一般适用于以下回归算法和场景:

  • 线性回归: MAE 可以用于衡量线性回归模型的拟合程度,特别是当对异常值不希望过分敏感时,MAE是一个合适的选择。
  • 决策树回归: 决策树模型的分裂准则通常使用MAE来衡量节点的纯度,因此在评估决策树模型时,MAE也是一个自然的选择。
  • 支持向量回归(SVR): MAE 可以用于支持向量回归中,衡量模型的预测值与真实值之间的平均绝对差异程度。
  • K近邻回归(K-Nearest Neighbors Regression): 在K近邻回归中,可以使用MAE作为衡量模型性能的指标。
  • 集成学习方法(如随机森林、梯度提升树等): MAE 可以用于集成学习模型中,作为评估模型性能的指标。

需要对异常值不敏感的场景: 当在训练数据中存在一些异常值,但又不希望这些异常值过度影响模型拟合时,可以考虑使用MAE。
不可导损失函数的情况: MAE 是一个非光滑的损失函数,相较于均方误差(MSE),它在零点附近不可导,因此可以在某些优化算法中提供额外的选择。

1.3 Huber损失函数

Huber损失函数是一种用于回归问题的损失函数,它是均方误差(MSE)和平均绝对误差(MAE)的折中。它的概念是在MSE对异常值过于敏感而MAE对所有误差都给予相同权重的情况下,Huber损失引入了一个超参数 δ,通过这个参数来平衡对大误差的处理方式。
在这里插入图片描述
Huber损失的特点包括:

  • 对异常值的鲁棒性: 与MSE相比,Huber损失对异常值更具鲁棒性,因为它在 |yᵢ - ȳ| 大于 δ 时的损失相对较小。
  • 平滑性: Huber损失是一个平滑的损失函数,对于梯度下降等优化算法比MAE更易处理。
  • 根据 δ 的选择,可以在MSE和MAE之间平衡损失的特性。

Huber损失函数一般适用于以下回归算法和场景:

  • 线性回归: Huber损失可以用于线性回归模型,特别是当数据集中存在一些可能影响模型拟合的离群值时。
  • 支持向量回归(SVR): 在支持向量回归中,Huber损失可以用作损失函数,它允许对大误差的处理方式相对灵活。
  • 梯度提升回归(Gradient Boosting Regression): Huber损失可以用于梯度提升树等集成学习方法中,作为评估模型性能的指标。
  • 岭回归(Ridge Regression)和Lasso回归(Lasso Regression): 当使用岭回归或Lasso回归等正则化方法时,可以考虑使用Huber损失以提高模型对异常值的稳健性。
  • 需要对异常值不敏感的场景: 当在训练数据中存在一些异常值,但又不希望这些异常值过度影响模型拟合时,可以考虑使用Huber损失。
  • 需要在平均绝对误差和均方误差之间平衡损失的场景: Huber损失允许根据问题的具体需求,在平均绝对误差和均方误差之间进行权衡。

Huber损失适用于需要在对大误差的处理方式上相对灵活、同时又希望对异常值不过分敏感的回归问题场景。它提供了一个折中的选择,可以平衡平均绝对误差和均方误差的特性。

分类损失函数

LogLoss对数损失函数(逻辑回归,交叉熵损失)

对数损失, 即对数似然损失(Log-likelihood Loss), 也称逻辑斯谛回归损失(Logistic Loss)或交叉熵损失(cross-entropy Loss), 是在概率估计上定义的.它常用于(multi-nominal, 多项)逻辑斯谛回归和神经网络,以及一些期望极大算法的变体. 可用于评估分类器的概率输出.

对数损失通过惩罚错误的分类,实现对分类器的准确度(Accuracy)的量化. 最小化对数损失基本等价于最大化分类器的准确度.为了计算对数损失, 分类器必须提供对输入的所属的每个类别的概率值, 不只是最可能的类别. 对数损失函数的计算公式如下:
在这里插入图片描述
 其中, Y 为输出变量, X为输入变量, L 为损失函数. N为输入样本量, M为可能的类别数, yij 是一个二值指标, 表示类别 j 是否是输入实例 xi 的真实类别. pij 为模型或分类器预测输入实例 xi 属于类别 j 的概率.

如果只有两类 {0, 1}, 则对数损失函数的公式简化为
在这里插入图片描述
这时, yi 为输入实例 xi 的真实类别, pi 为预测输入实例 xi 属于类别 1 的概率. 对所有样本的对数损失表示对每个样本的对数损失的平均值, 对于完美的分类器, 对数损失为 0 。

归一化 (Normalization)、标准化 (Standardization)和中心/零均值化 (Zero-centered)

归一化(Normalization)

(1)将一列数据变化到某个固定区间(范围)中,通常,这个区间是[0, 1] 或者(-1,1)之间的小数。主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速。

(2)把有量纲表达式变成无量纲表达式,便于不同单位或量级的指标能够进行比较和加权。归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为纯量。
在这里插入图片描述
从公式看: 归一化输出范围在0-1之间

​​​​​​​该方法实现对原始数据的等比例缩放。通过利用变量取值的最大值和最小值(或者最大值)将原始数据转换为界于某一特定范围的数据,从而消除量纲和数量级影响,改变变量在分析中的权重来解决不同度量的问题。由于极值化方法在对变量无量纲化过程中仅仅与该变量的最大值和最小值这两个极端值有关,而与其他取值无关,这使得该方法在改变各变量权重时过分依赖两个极端取值。

标准化(Standardization)

原始数据减均值之后,再除以标准差。将数据变换为均值为0,标准差为1的分布,切记:并非一定是正态的。

虽然该方法在无量纲化过程中利用了所有的数据信息,但是该方法在无量纲化后不仅使得转换后的各变量均值相同,且标准差也相同,即无量纲化的同时还消除了各变量在变异程度上的差异,从而转换后的各变量在聚类分析中的重要性程度是同等看待的。
在这里插入图片描述
从公式看:标准化输出范围是负无穷到正无穷

中心化/零均值化(zero-centered)

中心化,也叫零均值处理,就是将每个原始数据减去这些数据的均值。因此 中心化后的数据平均值为0,对标准差无要求。

联系和差异

归一化和标准化的区别:

  • 归一化是将样本的特征值转换到同一量纲下把数据映射到[0,1]或者[-1, 1]区间内,缩放比例仅由变量的最大、最小极值决定。
  • 标准化和整体样本分布相关,与归一化相比,标准化中每个样本点都能对标准化产生影响(通过均值和标准差造成影响)。
  • 归一化(Normalization)会严格的限定变换后数据的范围,比如按之前最大最小值处理的Normalization,它的范围严格在[0,1]之间;
  • 标准化(Standardization)就没有严格的区间,变换后的数据没有范围,只是其均值是0 0,标准差为1,变换后数据的范围是负无穷到正无穷。

归一化和标准化的相同点:

  • 都能取消由于量纲不同引起的误差;本质上都是一种线性变换,因为二者都是不会改变原始数据排列顺序的线性变换,都是对向量X按照比例压缩再进行平移。

标准化和中心化的区别:

  • 标准化是原始分数减去平均数然后除以标准差,中心化是原始分数减去平均数。 所以一般流程为先中心化再标准化。
  • 都能实现无量纲:我的理解就是通过某种方法能去掉实际过程中的单位,从而简化计算。

在这里插入图片描述

为什么要归一化/标准化?

  • 3.1、数据的量纲不同;数量级差别很大
    经过标准化处理后,原始数据转化为无量纲化指标测评值,各指标值处于同一数量级别,可进行综合测评分析。
    如果直接用原始指标值进行分析,就会突出数值较高的指标在综合分析中的作用,相对削弱数值水平较低指标的作用。
  • 3.2、避免数值问题:太大的数会引发数值问题。
  • 3.3、平衡各特征的贡献
    一些分类器需要计算样本之间的距离(如欧氏距离),例如KNN。
    如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要)。
  • 3.4、一些模型求解的需要:加快了梯度下降求最优解的速度
    1)在使用梯度下降的方法求解最优化问题时, 归一化/标准化后可以加快梯度下降的求解速度,即提升模型的收敛速度。如左图所示,未归一化/标准化时形成的等高线偏椭圆,迭代时很有可能走“之”字型路线(垂直长轴),从而导致迭代很多次才能收敛。而如右图对两个特征进行了归一化,对应的等高线就会变圆,在梯度下降进行求解时能较快的收敛。

什么时候用归一化?什么时候用标准化?

如果对输出结果范围有要求,用归一化。
如果数据较为稳定,不存在极端的最大最小值,用归一化。
如果数据存在异常值和较多噪音,用标准化,可以间接通过中心化避免异常值和极端值的影响。

  • 聚类过程中,标准化显得尤为重要。这是因为聚类操作依赖于对类间距离和类内聚类之间的衡量。如果一个变量的衡量标准高于其他变量,那么我们使用的任何衡量标准都将受到该变量的过度影响。
  • PCA降维操作之前。在主成分PCA分析之前,对变量进行标准化至关重要。 这是因为PCA给那些方差较高的变量比那些方差非常小的变量赋予更多的权重。而 标准化原始数据会产生相同的方差,因此高权重不会分配给具有较高方差的变量
  • KNN操作,原因类似于kmeans聚类。由于KNN需要用欧式距离去度量。标准化会让变量之间起着相同的作用。
  • SVM中,使用所有跟距离计算相关的的kernel都需要对数据进行标准化。
  • 选择岭回归和Lasso时候,标准化是必须的。原因是正则化是有偏估计,会对权重进行惩罚。在量纲不同的情况,正则化会带来更大的偏差。

什么时候不需要标准化?

当采用普通的线性回归的时候,是无需标准化的。因为标准化前后,不会影响线性回归预测值。
同时,标准化不会影响logistic回归决策树及其他一些集成学习算法(如随机森林、GBDT等)

并不是所有情况都应当Standardization或Normalization
当原始数据不同维度特征的尺度(量纲)不一致时,需要标准化步骤对数据进行标准化或归一化处理,反之则不需要进行数据标准化。也不是所有的模型都需要做归一的,比如模型算法里面有没关于对距离的衡量,没有关于对变量间标准差的衡量。比如决策树,他采用算法里面没有涉及到任何和距离等有关的,所以在做决策树模型时,通常是不需要将变量做标准化的;另外,概率模型不需要归一化,因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率。

异常值

异常值outlier:指样本中的个别值,其数值明显偏离它(或他们)所属样本的其余观测值,也称异常数据,离群值。
在统计学中异常值(outlier)定义为一组测定值中与平均值的偏差超过两倍标准差的测定值,与平均值的偏差超过三倍标准差的测定值,称为高度异常的异常值;

简单统计量分析

最常用的事最大值和最小值,超出合理范围为异常。如客户年龄为199岁,该值为异常。

3σ原则

(1)、如果数据服从正态分布,在3σ原则下,异常值被定义为与平均值偏差超过3倍标准差的值。
在正态分布情况下,距离平均值3α之外的值出现的概率为 P(|x-μ|>3σ) ≤ 0.003,属于极个别的小概率事件。
(2)、如果数据不服从正态分布,也可以用远离平均值的多少倍标准差来描述。

箱型图判断

箱型图提供识别异常值的一个标准:异常值被定义为小于 QL-1.5IQR 或 大于Qu+1.5IQR的值。
QL为下四分位数,表示全部观察值中有四分之一的数据比它小;
Qu为上四分位数,表示全部观察值中有四分之一的数据比它大;
IQR为四分位数间距,是上四分位与下四分位之差,其中包含了观察值的一半。

对于有固定业务规则的可直接套用业务规则。
对于没有固定业务规则的,除了上述4中简单方法外,还可以采用常见的数学模型进行判断:基于概率分布的模型(例如正态分布的标准差范围)、基于聚类的方法(例如KMeans)、基于密度的方法(例如LOF)、基于分类的方法(例如KNN)、基于统计的方法(例如分位数法)等。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值