转:数据标准化/归一化normalization 线性回归与特征归一化(feature scaling)

转自:数据标准化/归一化normalization 

 

这里主要讲连续型特征归一化的经常使用方法。离散参考[数据预处理:独热编码(One-Hot Encoding)]。
html

基础知识参考:python

[均值、方差与协方差矩阵 ]git

[矩阵论:向量范数和矩阵范数 ]
算法

数据的标准化(normalization)和归一化

    数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间。在某些比较和评价的指标处理中常常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不一样单位或量级的指标可以进行比较和加权。其中最典型的就是数据的归一化处理,即将数据统一映射到[0,1]区间上。编程

    目前数据标准化方法有多种,归结起来能够分为直线型方法(如极值法、标准差法)、折线型方法(如三折线法)、曲线型方法(如半正态性分布)。不一样的标准化方法,对系统的评价结果会产生不一样的影响,然而不幸的是,在数据标准化方法的选择上,尚未通用的法则能够遵循。数组

归一化的目标

1 把数变为(0,1)之间的小数
        主要是为了数据处理方便提出来的,把数据映射到0~1范围以内处理,更加便捷快速,应该归到数字信号处理范畴以内。
2 把有量纲表达式变为无量纲表达式
        归一化是一种简化计算的方式,即将有量纲的表达式,通过变换,化为无量纲的表达式,成为纯量。 好比,复数阻抗能够归一化书写:Z = R + jωL = R(1 + jωL/R) ,复数部分变成了纯数量了,没有量纲。
另外,微波之中也就是电路分析、信号系统、电磁波传输等,有不少运算均可以如此处理,既保证了运算的便捷,又能凸现出物理量的本质含义。数据结构

 

归一化后有两个好处

1. 提高模型的收敛速度dom

以下图,x1的取值为0-2000,而x2的取值为1-5,假如只有这两个特征,对其进行优化时,会获得一个窄长的椭圆形,致使在梯度降低时,梯度的方向为垂直等高线的方向而走之字形路线,这样会使迭代很慢,相比之下,右图的迭代就会很快(理解:也就是步长走多走少方向老是对的,不会走偏)机器学习


2.提高模型的精度函数

归一化的另外一好处是提升精度,这在涉及到一些距离计算的算法时效果显著,好比算法要计算欧氏距离,上图中x2的取值范围比较小,涉及到距离计算时其对结果的影响远比x1带来的小,因此这就会形成精度的损失。因此归一化颇有必要,他可让各个特征对结果作出的贡献相同。

    在多指标评价体系中,因为各评价指标的性质不一样,一般具备不一样的量纲和数量级。当各指标间的水平相差很大时,若是直接用原始指标值进行分析,就会突出数值较高的指标在综合分析中的做用,相对削弱数值水平较低指标的做用。所以,为了保证结果的可靠性,须要对原始指标数据进行标准化处理。

    在数据分析以前,咱们一般须要先将数据标准化(normalization),利用标准化后的数据进行数据分析。数据标准化也就是统计数据的指数化。数据标准化处理主要包括数据同趋化处理和无量纲化处理两个方面。数据同趋化处理主要解决不一样性质数据问题,对不一样性质指标直接加总不能正确反映不一样做用力的综合结果,须先考虑改变逆指标数据性质,使全部指标对测评方案的做用力同趋化,再加总才能得出正确结果。数据无量纲化处理主要解决数据的可比性。通过上述标准化处理,原始数据均转换为无量纲化指标测评值,即各指标值都处于同一个数量级别上,能够进行综合测评分析。

从经验上说,归一化是让不一样维度之间的特征在数值上有必定比较性,能够大大提升分类器的准确性。

数据须要归一化的机器学习算法

须要归一化的模型:

        有些模型在各个维度进行不均匀伸缩后,最优解与原来不等价,例如SVM(距离分界面远的也拉近了,支持向量变多?)。对于这样的模型,除非原本各维数据的分布范围就比较接近,不然必须进行标准化,以避免模型参数被分布范围较大或较小的数据dominate。
        有些模型在各个维度进行不均匀伸缩后,最优解与原来等价,例如logistic regression(由于θ的大小原本就自学习出不一样的feature的重要性吧?)。对于这样的模型,是否标准化理论上不会改变最优解。可是,因为实际求解每每使用迭代算法,若是目标函数的形状太“扁”,迭代算法可能收敛得很慢甚至不收敛。因此对于具备伸缩不变性的模型,最好也进行数据标准化。

不须要归一化的模型:

        ICA好像不须要归一化(由于独立成分若是归一化了就不独立了?)。

       基于平方损失的最小二乘法OLS不须要归一化。

[线性回归与特征归一化(feature scaling)]

皮皮blog

 

 

常见的数据归一化方法

min-max标准化(Min-max normalization)/0-1标准化(0-1 normalization)

也叫离差标准化,是对原始数据的线性变换,使结果落到[0,1]区间,转换函数以下:

其中max为样本数据的最大值,min为样本数据的最小值。

def Normalization(x):
    return [(float(i)-min(x))/float(max(x)-min(x)) for i in x]

若是想要将数据映射到[-1,1],则将公式换成:

 

 

x=xxmeanxmaxxmin

 

x_mean表示数据的均值。

def Normalization2(x):
    return [(float(i)-np.mean(x))/(max(x)-min(x)) for i in x]

这种方法有一个缺陷就是当有新数据加入时,可能致使max和min的变化,须要从新定义。

log函数转换

经过以10为底的log函数转换的方法一样能够实现归一下,具体方法以下:

看了下网上不少介绍都是x*=log10(x),实际上是有问题的,这个结果并不是必定落到[0,1]区间上,应该还要除以log10(max),max为样本数据最大值,而且全部的数据都要大于等于1。

atan函数转换

用反正切函数也能够实现数据的归一化。

使用这个方法须要注意的是若是想映射的区间为[0,1],则数据都应该大于等于0,小于0的数据将被映射到[-1,0]区间上,而并不是全部数据标准化的结果都映射到[0,1]区间上。

z-score 标准化(zero-mean normalization)

最多见的标准化方法就是Z标准化,也是SPSS中最为经常使用的标准化方法,spss默认的标准化方法就是z-score标准化。

也叫标准差标准化,这种方法给予原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。

通过处理的数据符合标准正态分布,即均值为0,标准差为1,其转化函数为:

 

 

x=xμσ

其中μ为全部样本数据的均值,σ为全部样本数据的标准差。

z-score标准化方法适用于属性A的最大值和最小值未知的状况,或有超出取值范围的离群数据的状况。

标准化的公式很简单,步骤以下

  1.求出各变量(指标)的算术平均值(数学指望)xi和标准差si ;
  2.进行标准化处理:
  zij=(xij-xi)/si
  其中:zij为标准化后的变量值;xij为实际变量值。
  3.将逆指标前的正负号对调。
  标准化后的变量值围绕0上下波动,大于0说明高于平均水平,小于0说明低于平均水平。

def z_score(x, axis):
    x = np.array(x).astype(float)
    xr = np.rollaxis(x, axis=axis)
    xr -= np.mean(x, axis=axis)
    xr /= np.std(x, axis=axis)
    # print(x)
    return x

为何z-score 标准化后的数据标准差为1?

x-μ只改变均值,标准差不变,因此均值变为0

(x-μ)/σ只会使标准差除以σ倍,因此标准差变为1

皮皮blog

Decimal scaling小数定标标准化

这种方法经过移动数据的小数点位置来进行标准化。小数点移动多少位取决于属性A的取值中的最大绝对值。

将属性A的原始值x使用decimal scaling标准化到x'的计算方法是:
x'=x/(10^j)
其中,j是知足条件的最小整数。
例如 假定A的值由-986到917,A的最大绝对值为986,为使用小数定标标准化,咱们用每一个值除以1000(即,j=3),这样,-986被规范化为-0.986。
注意,标准化会对原始数据作出改变,所以须要保存所使用的标准化方法的参数,以便对后续的数据进行统一的标准化。

Logistic/Softmax变换

logistic函数和标准正态函数

新数据=1/(1+e^(-原数据))

 

P(i)=11+exp(θTix)

 

这个函数的做用就是使得P(i)在负无穷到0的区间趋向于0,在0到正无穷的区间趋向于1。一样,函数(包括下面的softmax)加入了e的幂函数正是为了两极化:正样本的结果将趋近于1,而负样本的结果趋近于0。这样为多类别分类提供了方便(能够把P(i)看做是样本属于类别i的几率)。

 

logit(P) = log(P / (1-P)) = a + b*x 以及 probit(P) = a + b*x
这两个链接函数的性质使得P的取值被放大到整个实数轴上。
事实上能够把上面的公式改写一下:
P = exp(a + b*x) / (1 + exp(a + b*x)) 或者 P = pnorm(a + b*x)(这个是标准正态分布的分布函数)

 

 

Note: 上半部分图形显示了几率P随着自变量变化而变化的状况,下半部分图形显示了这种变化的速度的变化。能够看得出来,几率P与自变量仍然存在或多或少的线性关系,主要是在头尾两端被链接函数扭曲了,从而实现了[0,1]限制。同时,自变量取值靠近中间的时候,几率P变化比较快,自变量取值靠近两端的时候,几率P基本再也不变化。这就跟咱们的直观理解相符合了,彷佛是某种边际效用递减的特色。

[logistic回归的一些直观理解(1.链接函数 logit probit)]

Softmax函数

是logistic函数的一种泛化,Softmax是一种形以下式的函数:

 

假设咱们有一个数组,V,Vi表示V中的第i个元素,那么这个元素的Softmax值就是

也就是说,是该元素的指数,与全部元素指数和的比值

为何要取指数,第一个缘由是要模拟 max 的行为,因此要让大的更大。第二个缘由是须要一个可导的函数。

 

经过softmax函数,可使得P(i)的范围在[0,1]之间。在回归和分类问题中,一般θ是待求参数,经过寻找使得P(i)最大的θi做为最佳参数。

此外Softmax函数一样可用于非线性估计,此时参数θ可根据现实意义使用其余列向量替代。

Softmax函数获得的是一个[0,1]之间的值,且Kk=1P(i)=1,这个softmax求出的几率就是真正的几率,换句话说,这个几率等于指望。

[Softmax 函数及其做用(含推导) ]

[Machine Learning - VI. Logistic Regression逻辑回归 (Week 3) ]

 

模糊量化模式

 

新数据=1/2+1/2sin[派3.1415/(极大值-极小值)*(X-(极大值-极小值)/2) ] X为原数据

皮皮blog

 

数据标准化/归一化的编程实现

Python库实现和调用

[Scikit-learn:数据预处理Preprocessing data ]

from: http://blog.csdn.net/pipisorry/article/details/52247379

ref: 

相关文章
相关标签/搜索