python 归一化_数据的标准化和归一化

  1. 数据的标准化

  2. 归一化

  3. 归一化的目标

  4. 归一化的好处

  5. 归一化的方法

  6. 无量纲表达式

  7. 为什么要对数据进行归一化处理

  8. 常见的数据归一化方法

  9. Python归一化处理方法

aba624f14f10ba97c6061829916d09e6.png

数据的标准化

数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间。在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。

目前数据标准化方法:直线型方法(如极值法、标准差法)、折线型方法(如三折线法)、曲线型方法(如半正态性分布)。不同的标准化方法,对系统的评价结果会产生不同的影响,然而不幸的是,在数据标准化方法的选择上,还没有通用的法则可以遵循。

归一化

数据标准化中最典型的就是数据的归一化处理,即将数据统一映射到[0,1]区间上。


归一化的具体作用是归纳统一样本的统计分布性。归一化在0-1之间是统计的概率分布,归一化在-1--+1之间是统计的坐标分布。归一化有同一、统一和合一的意思。无论是为了建模还是为了计算,首先基本度量单位要同一,神经网络是以样本在事件中的统计分别几率来进行训练(概率计算)和预测的,且sigmoid函数的取值是0到1之间的,网络最后一个节点的输出也是如此,所以经常要对样本的输出归一化处理。归一化是统一在0-1之间的统计概率分布,当所有样本的输入信号都为正值时,与第一隐含层神经元相连的权值只能同时增加或减小,从而导致学习速度很慢。另外在数据中常存在奇异样本数据,奇异样本数据存在所引起的网络训练时间增加,并可能引起网络无法收敛。为了避免出现这种情况及后面数据处理的方便,加快网络学习速度,可以对输入信号进行归一化,使得所有样本的输入信号其均值接近于0或与其均方差相比很小。

归一化的目标

1 把数变为(0,1)之间的小数
2 把有量纲表达式变为无量纲表达式

归一化的好处

1. 提升模型的收敛速度

2.提升模型的精度

归一化的方法 

归一化方法有两种形式,一种是把数变为(0,1)之间的小数,一种是把有量纲表达式变为无量纲表达式。主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速,应该归到数字信号处理范畴之内。

把数变为(0,1)之间的小数,例1:{2.5 3.5 0.5 1.5}归一化后变成了{0.3125 0.4375 0.0625 0.1875}解:2.5+3.5+0.5+1.5=8。

2.5/8=0.3125,

3.5/8=0.4375,

0.5/8=0.0625,

1.5/8=0.1875.

这个归一化就是将括号里面的总和变成1.然后写出每个数的比例。

无量纲表达式

归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为纯量。

比如,复数阻抗可以归一化书写:Z = R + jωL = R(1 + jωL/R) ,复数部分变成了纯数量了,没有量纲。

另外,微波之中也就是电路分析、信号系统、电磁波传输等,有很多运算都可以如此处理,既保证了运算的便捷,又能凸现出物理量的本质含义。

在统计学中,归一化的具体作用是归纳统一样本的统计分布性。归一化在0-1之间是统计的概率分布,归一化在-1--+1之间是统计的坐标分布。

归一化定义:归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。首先归一化是为了后面数据处理的方便,其次是保证程序运行时收敛加快。归一化的具体作用是归纳统一样本的统计分布性。归一化在0-1之间是统计的概率分布,归一化在某个区间上是统计的坐标分布。归一化有同一、统一和合一的意思。

如果是区间上的值,则可以用区间上的相对位置来归一化,即选中一个相位参考点,用相对位置和整个区间的比值或是整个区间的给定值作比值,得到一个归一化的数据,比如类似于一个概率值0<=p<=1;

如果是物理量,则一般可以统一度量衡之后归一,实在没有统一的方法,则给出一个自定义的概念来描述亦可;

如果是数值,则可以用很多常见的数学函数进行归一化,使它们之间的可比性更显然,更强,比如对数归一,指数归一,三角or反三角函数归一等,归一的目的可能是使得没有可比性的数据变得具有可比性,但又还会保持相比较的两个数据之间的相对关系,如大小关系,大的仍然大,小的仍然小,或是为了作图,原来很难在一张图上作出来,归一化后就可以很方便的给出图上的相对位置等;

从集合的角度来看,可以做维度的维一,即抽象化归一,把不重要的,不具可比性的集合中的元素的属性去掉,保留人们关心的那些属性,这样,本来不具有可比性的对象或是事物,就可以归一,即归为一类,然后就可以比较了,并且,人们往往喜欢用相对量来比较,比如人和牛,身高体重都没有可比性,但身高/体重的值,就可能有了可比性,人吃多少,牛吃多少,可能也没有直接的可比性,但相对于体重,或是相对于一天的各自的能量提供需要的食量,就有了可比性;这些,从数学角度来看,可以认为是把有纲量变成了无纲量了。

数据处理之标准化/归一化,形式上是变化表达,本质上是为了比较认识。

数据的标准化是将数据按比例缩放,使之落入一个小的特定区间。

由于信用指标体系的各个指标度量单位是不同的,为了能够将指标参与评价计算,需要对指标进行规范化处理,通过函数变换将其数值映射到某个数值区间。

为什么要对数据进行归一化处理

例子

假定为预测房价的例子,自变量为面积,房间数两个,因变量为房价。

那么可以得到的公式为:

b2e749c7-7132-eb11-8da9-e4434bdf6706.svg

其中b5e749c7-7132-eb11-8da9-e4434bdf6706.svg代表房间数,b7e749c7-7132-eb11-8da9-e4434bdf6706.svg代表b5e749c7-7132-eb11-8da9-e4434bdf6706.svg变量前面的系数。

其中dfe749c7-7132-eb11-8da9-e4434bdf6706.svg代表面积,e4e749c7-7132-eb11-8da9-e4434bdf6706.svg代表dfe749c7-7132-eb11-8da9-e4434bdf6706.svg变量前面的系数。

首先我们祭出两张图代表数据是否均一化的最优解寻解过程。

未归一化:

8d0631829cbe218f1f599c958fa692b5.png

归一化之后

ca2da22eee0c99657ca8d9986f8487e4.png

为什么会出现上述两个图,并且它们分别代表什么意思。

我们在寻找最优解的过程也就是在使得损失函数值最小的theta1,theta2。

上述两幅图代码的是损失函数的等高线。

我们很容易看出,当数据没有归一化的时候,面积数的范围可以从0~1000,房间数的范围一般为0~10,可以看出面积数的取值范围远大于房间数。

影响

这样造成的影响就是在画损失函数的时候,

数据没有归一化的表达式,可以为:

31e849c7-7132-eb11-8da9-e4434bdf6706.svg

造成图像的等高线为类似椭圆形状,最优解的寻优过程就是像下图所示:

8d0631829cbe218f1f599c958fa692b5.png

而数据归一化之后,损失函数的表达式可以表示为:

47e849c7-7132-eb11-8da9-e4434bdf6706.svg

其中变量的前面系数几乎一样,则图像的等高线为类似圆形形状,最优解的寻优过程像下图所示:

ca2da22eee0c99657ca8d9986f8487e4.png

从上可以看出,数据归一化后,最优解的寻优过程明显会变得平缓,更容易正确的收敛到最优解。

这也是数据为什么要归一化的一个原因。

常见的数据归一化方法

最常用的是 min-max标准化 和 z-score 标准化。

min-max标准化

是对原始数据的线性变换,使结果落到[0,1]区间,转换函数如下:

05e98f9d83219bec804a250d17ce34e3.png

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

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

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

x* = x* * 2 -1

或者进行一个近似

x* = (x - x_mean)/(x_max - x_min), x_mean表示数据的均值。

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

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

ps: 将数据归一化到[a,b]区间范围的方法:

(1)首先找到原本样本数据X的最小值Min及最大值Max
(2)计算系数:k=(b-a)/(Max-Min)
(3)得到归一化到[a,b]区间的数据:Y=a+k(X-Min)  或者 Y=b+k(X-Max)

即一个线性变换,在坐标上就是求直线方程,先求出系数,代入一个点对应的值(x的最大/最小就对应y的最大/最小)就ok了。

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

参考:

https://blog.csdn.net/Orange_Spotty_Cat/article/details/80312154

https://blog.csdn.net/pipisorry/article/details/52247379

log函数转换

通过以10为底的log函数转换的方法同样可以实现归一化,具体方法如下:

cc1fa993d741f5a7bff1372602cee23a.png

使用注意:max为样本数据最大值,并且所有的数据都要大于等于1。

atan函数转换

通过反正切函数也可以实现数据的归一化:

95fcbe3f9baec210ee2830c346ad076e.png

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

Python归一化处理方法

数据归一化问题是数据挖掘中特征向量表达时的重要问题,当不同的特征成列在一起的时候,由于特征本身表达方式的原因而导致在绝对数值上的小数据被大数据“吃掉”的情况,这个时候我们需要做的就是对抽取出来的features vector进行归一化处理,以保证每个特征被分类器平等对待。下面我描述几种常见的Normalization Method,并提供相应的python实现(其实很简单):

1.(0,1)标准化:

这是最简单也是最容易想到的方法,通过遍历feature vector里的每一个数据,将Max和Min的记录下来,并通过Max-Min作为基数(即Min=0,Max=1)进行数据的归一化处理:

108f82366e190977d1ca6615c9359eee.png

LaTex:{x}_{normalization}=\frac{x-Min}{Max-Min}

Python实现:

def MaxMinNormalization(x,Max,Min):    x = (x - Min) / (Max - Min)     return x

def MaxMinNormalization(x,Max,Min):

    x = (x - Min) / (Max - Min)

    return x

找大小的方法直接用np.max()和np.min()就行了,尽量不要用python内建的max()和min(),除非你喜欢用List管理数字。

2.Z-score标准化:

这种方法给予原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。经过处理的数据符合标准正态分布,即均值为0,标准差为1,这里的关键在于复合标准正态分布,个人认为在一定程度上改变了特征的分布,关于使用经验上欢迎讨论,我对这种标准化不是非常地熟悉,转化函数为:

dc6d4386f8fc59f20f6f04bc7ac5854f.png

LaTex:{x}_{normalization}=\frac{x-\mu }{\sigma }

Python实现:

def  Z_ScoreNormalization(x,mu,sigma):     x = (x - mu) / sigma      return x

def  Z_ScoreNormalization(x,mu,sigma):

    x = (x - mu) / sigma

    return x

这里一样,mu(即均值)用np.average(),sigma(即标准差)用np.std()即可。

3.Sigmoid函数

Sigmoid函数是一个具有S形曲线的函数,是良好的阈值函数,在(0, 0.5)处中心对称,在(0, 0.5)附近有比较大的斜率,而当数据趋向于正无穷和负无穷的时候,映射出来的值就会无限趋向于1和0,是个人非常喜欢的“归一化方法”,之所以打引号是因为我觉得Sigmoid函数在阈值分割上也有很不错的表现,根据公式的改变,就可以改变分割阈值,这里作为归一化方法,我们只考虑(0, 0.5)作为分割阈值的点的情况:

6d4b713c86cb7aede95556350f922a72.png

2e2f9090a8bcb7762d2beb26e9e94793.png

LaTex:{x}_{normalization}=\frac{1}{1+{e}^{-x}}

Python实现:

def sigmoid(X,useStatus):    if useStatus:       return 1.0 / (1 + np.exp(-float(X)))    else:       return float(X)    

def sigmoid(X,useStatus):

    if useStatus:

        return 1.0 / (1 + np.exp(-float(X)))

    else:

        return float(X)

这里useStatus管理是否使用sigmoid的状态,方便调试使用。

函数的基本性质:

  1. 定义域:(−∞,+∞)(−∞,+∞)

  2. 值域:(−1,1)(−1,1)

  3. 函数在定义域内为连续和光滑函数

  4. 处处可导,导数为:f′(x)=f(x)(1−f(x))f′(x)=f(x)(1−f(x))

最早Logistic函数是皮埃尔·弗朗索瓦·韦吕勒在1844或1845年在研究它与人口增长的关系时命名的。广义Logistic曲线可以模仿一些情况人口增长(P)的 S 形曲线。起初阶段大致是指数增长;然后随着开始变得饱和,增加变慢;最后,达到成熟时增加停止。

Sigmoid函数与逻辑回归

Sigmoid函数之所以叫Sigmoid,是因为函数的图像很想一个字母S。这个函数是一个很有意思的函数,从图像上我们可以观察到一些直观的特性:函数的取值在0-1之间,且在0.5处为中心对称,并且越靠近x=0的取值斜率越大。

机器学习中一个重要的预测模型逻辑回归(LR)就是基于Sigmoid函数实现的。LR模型的主要任务是给定一些历史的{X,Y},其中X是样本n个特征值,Y的取值是{0,1}代表正例与负例,通过对这些历史样本的学习,从而得到一个数学模型,给定一个新的X,能够预测出Y。LR模型是一个二分类模型,即对于一个X,预测其发生或不发生。但事实上,对于一个事件发生的情况,往往不能得到100%的预测,因此LR可以得到一个事件发生的可能性,超过50%则认为事件发生,低于50%则认为事件不发生

从LR的目的上来看,在选择函数时,有两个条件是必须要满足的:
1. 取值范围在0~1之间。
2. 对于一个事件发生情况,50%是其结果的分水岭,选择函数应该在0.5中心对称。

从这两个条件来看,Sigmoid很好的符合了LR的需求。关于逻辑回归的具体实现与相关问题,可看这篇文章Logistic函数(sigmoid函数) - wenjun’s blog,在此不再赘述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值