这里主要讲连续型特征归一化的经常使用方法。离散参考[数据预处理:独热编码(One-Hot Encoding)]。
html
基础知识参考:python
[均值、方差与协方差矩阵 ]git
[矩阵论:向量范数和矩阵范数 ]
算法
数据的标准化(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不须要归一化。
也叫离差标准化,是对原始数据的线性变换,使结果落到[0,1]区间,转换函数以下:
其中max为样本数据的最大值,min为样本数据的最小值。
def Normalization(x):
return [(float(i)-min(x))/float(max(x)-min(x)) for i in x]
若是想要将数据映射到[-1,1],则将公式换成:
x∗=x−xmeanxmax−xmin
x_mean表示数据的均值。
def Normalization2(x):
return [(float(i)-np.mean(x))/(max(x)-min(x)) for i in x]
这种方法有一个缺陷就是当有新数据加入时,可能致使max和min的变化,须要从新定义。
经过以10为底的log函数转换的方法一样能够实现归一下,具体方法以下:
看了下网上不少介绍都是x*=log10(x),实际上是有问题的,这个结果并不是必定落到[0,1]区间上,应该还要除以log10(max),max为样本数据最大值,而且全部的数据都要大于等于1。
用反正切函数也能够实现数据的归一化。
使用这个方法须要注意的是若是想映射的区间为[0,1],则数据都应该大于等于0,小于0的数据将被映射到[-1,0]区间上,而并不是全部数据标准化的结果都映射到[0,1]区间上。
最多见的标准化方法就是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
这种方法经过移动数据的小数点位置来进行标准化。小数点移动多少位取决于属性A的取值中的最大绝对值。
将属性A的原始值x使用decimal scaling标准化到x'的计算方法是:
x'=x/(10^j)
其中,j是知足条件的最小整数。
例如 假定A的值由-986到917,A的最大绝对值为986,为使用小数定标标准化,咱们用每一个值除以1000(即,j=3),这样,-986被规范化为-0.986。
注意,标准化会对原始数据作出改变,所以须要保存所使用的标准化方法的参数,以便对后续的数据进行统一的标准化。
logistic函数和标准正态函数
新数据=1/(1+e^(-原数据))
这个函数的做用就是使得P(i)在负无穷到0的区间趋向于0,在0到正无穷的区间趋向于1。一样,函数(包括下面的softmax)加入了e的幂函数正是为了两极化:正样本的结果将趋近于1,而负样本的结果趋近于0。这样为多类别分类提供了方便(能够把P(i)看做是样本属于类别i的几率)。
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求出的几率就是真正的几率,换句话说,这个几率等于指望。
[Machine Learning - VI. Logistic Regression逻辑回归 (Week 3) ]
新数据=1/2+1/2sin[派3.1415/(极大值-极小值)*(X-(极大值-极小值)/2) ] X为原数据
Python库实现和调用
[Scikit-learn:数据预处理Preprocessing data ]
from: http://blog.csdn.net/pipisorry/article/details/52247379
ref: