zoukankan      html  css  js  c++  java
  • 机器学习中的标准化方法(Normalization Methods)

      希望这篇随笔能够从一个实用化的角度对ML中的标准化方法进行一个描述。即便是了解了标准化方法的意义,最终的最终还是要:拿来主义,能够在实践中使用。

      动机:标准化的意义是什么?

      我们为什么要标准化?想象我们有一个Data Matrix $mathbf{X}in mathbb{R}^{n imes d}$ 我们首先必须要做的事情就是对这个Data Matix进行标准化,意义是:“取消由于量纲不同、自身变异或者数值相差较大所引起的误差。”这个解释还不是很明白,那么我们可以想象如果不进行标准化会发生什么。首先这个Data Matrix $mathbf{X}$ 的每一行就代表了一个样本,我们需要利用这些样本feature之间的差异来完成我们的机器学习任务,such as regression and classification。接着我们就要使用不同的算法和模型来完成我们的任务,如果你直接对把这些raw data喂给模型。那么一个可能出现的情况就是模型参数的爆炸或者消失,同时训练速度可能会相当慢。这种情况的影响我的理解是很容易造成样本特征的模糊或者消失,虽然我们仍然能够对模型进行训练,但是效果可能非常不好。

      好了,现在我们理解了标准化的意义,那么一个可能的思索是这样的:既然我们对原始数据进行了标准化处理,那么假如来了新数据我们应该咋办?要知道我们训练模型的目的是为了泛化,我们训练了一个模型之后该对付新来的数据呢,比如:使用标准化之后的模型训练了一个分类器,现在又来了一个样本,显然它没办法直接用我们训练的模型进行分类(因为我们的模型是用标准化之后的数据处理的鸭)。我的想法是,有两种方法:1. 在对数据矩阵标准化的时候记录下标准化参数,当有新的数据喂给模型的时,先要对这个数据进行一样的标准化处理。2. 我们用标准化后的数据训练了一个模型,模型参数为$mathbf{W}_{N}$,能够用这个模型参数倒推“不进行标准化”的模型参数$mathbf{W}$。这样我们获得了一个trained original model。这个模型能够直接处理不进行标准化的数据。很显然,第一个方法要比第二个方法简单通用的多。

      最常用的标准化方法:Z-score and Max-Min Normalization

      wikipedia上有一个表格,记录下了标准化的方法:

    NameFormulaUse
    Standard score {frac {X-mu }{sigma }} Normalizing errors when population parameters are known. Works well for populations that are normally distributed[2]
    Student's t-statistic {displaystyle {frac {{widehat {eta }}-eta _{0}}{operatorname {s.e.} ({widehat {eta }})}}} the departure of the estimated value of a parameter from its hypothesized value, normalized by its standard error.
    Studentized residual {frac {{hat {epsilon }}_{i}}{{hat {sigma }}_{i}}}={frac {X_{i}-{hat {mu }}_{i}}{{hat {sigma }}_{i}}} Normalizing residuals when parameters are estimated, particularly across different data points in regression analysis.
    Standardized moment {frac {mu _{k}}{sigma ^{k}}} Normalizing moments, using the standard deviation sigma  as a measure of scale.
    Coefficient of
    variation
    {frac {sigma }{mu }} Normalizing dispersion, using the mean mu  as a measure of scale, particularly for positive distribution such as the exponential distribution and Poisson distribution.
    Min-Max Feature scaling {displaystyle X'={frac {X-X_{min }}{X_{max }-X_{min }}}} Feature scaling is used to bring all values into the range [0,1]. This is also called unity-based normalization. This can be generalized to restrict the range of values in the dataset between any arbitrary points a and b, using for example{displaystyle X'=a+{frac {left(X-X_{min }
ight)left(b-a
ight)}{X_{max }-X_{min }}}}.

      其中最最常用的两个就是Min-Max Feature scaling和Standard score(也叫Z-score),原理和功能可以点上面的链接了解,下面介绍一下实现的步骤和一些坑。

      Z-score

      按如下方法标准化Data Matirx矩阵的每一列 $mathbf{x}_i$ of $mathbf{X}(1leq ileq d)$:(这里解释一下为什么是按列标准化:数据矩阵的每一列就代表了样本的每一维,我们想通过标准化来更好的处理该维度的特征,可以想想按行标准化是什么效果:make no sense)$$z_{ij}leftarrow frac{x_{ij}- ext{mean}(mathbf{x}_i)}{ ext{std}(mathbf{x}_i)}$$

      其中$x_{ij}$代表$mathbf{x}_i$的第$j$个条目,同样的$z_{ij}$代表$mathbf{z}_iin mathbb{R}^n$的第$j$个条目,$mathbf{overline{Z}}=(mathbf{1},mathbf{z}_1,cdots,mathbf{z}_d)in mathbb{R}^{n imes(d+1)}$, mean和std就是按列求每一列的均值啦,我们接下来处理$mathbf{overline{Z}}$这个矩阵就好了~~为什么这里会多一维呢?你可能已经知道这个多出来的一叫做dummy variable,我的理解是它一方面可以简化我们的模型表达,一方面提供了一个相当相当广义的正则化处理,降低了噪声的影响(当然这是我见过的大部分模型的需要,需要灵活处理,思想懂了就简单)。

      Min-Max Feature scaling

      这个标准化方法在我看来就非常的简单粗暴了,方式如下:$$z_{ij}leftarrow frac{x_{ij}- ext{min}(mathbf{x}_i)}{ ext{max}(mathbf{x}_i)- ext{min}(mathbf{x}_i)}$$

      其中$x_{ij}$代表$mathbf{x}_i$的第$j$个条目,同样的$z_{ij}$代表$mathbf{z}_iin mathbb{R}^n$的第$j$个条目,$mathbf{overline{Z}}=(mathbf{1},mathbf{z}_1,cdots,mathbf{z}_d)in mathbb{R}^{n imes(d+1)}$, max和min是按列求每一列的最大和最小值。

      实现中可能出现的问题:

      假如我们的数据矩阵比较稀疏,可能会出现一整列都是0的情况。此时我们发现上面两个方法的分母都为0,出现除以0的情况,这时我们该怎么办?一个比较合理的想法是假如有一整列的0,我们可以标准化后保留。一列零还让它是一列零。那么我们可以对求得的分母加上一个epsilon,也就是一个小量,1e-8这样的量级。这样一列零的情况还是一列零,$ ext{std}$ 或者 $ ext{max}- ext{min}$不为0的情况也不会受影响。

  • 相关阅读:
    在QT函数中返回一个数组/把一个数组传参给函数
    QT储存内容到指定的文件内
    QT对linux下/sys/class/gpio中的gpio的控制
    QT 线程的暂停和继续
    QT的close和系统的close冲突
    画动态曲线另一种方式方式
    QT关于iCCP警告去除
    ps两张图片合在一起
    ps 做动态图
    解决MFC中因控件类多次Attch造成的销毁窗口过程中CWnd* pWnd = CWnd::FromHandlePermanent(hWnd); ASSERT(pWnd != NULL); 断言失败的问题
  • 原文地址:https://www.cnblogs.com/chester-cs/p/12679316.html
Copyright © 2011-2022 走看看