1. 概要


数据预处理在众多深度学习算法中都起着重要作用,实际情况中,将数据做归一化和白化处理后,很多算法能够发挥最佳效果。然而除非对这些算法有丰富的使用经验,否则预处理的精确参数并非显而易见。

2. 数据归一化及其应用


数据预处理中,标准的第一步是数据归一化。虽然这里有一系列可行的方法,但是这一步通常是根据数据的具体情况而明确选择的。特征归一化常用的方法包含如下几种:

  • 简单缩放
  • 逐样本均值消减(也称为移除直流分量)
  • 特征标准化(使数据集中所有特征都具有零均值和单位方差)

一般做机器学习应用的时候大部分时间是花费在特征处理上,其中很关键的一步就是对特征数据进行归一化,为什么要归一化呢?很多同学并未搞清楚,维基百科给出的解释:

  • 归一化后加快了梯度下降求最优解的速度;
  • 归一化有可能提高精度;

加快梯度下降求解速度

如下图所示,蓝色的圈圈图代表的是两个特征的等高线。其中左图两个特征X1和X2的区间相差非常大,X1区间是[0,2000],X2区间是[1,5],其所形成的等高线非常尖。当使用梯度下降法寻求最优解时,很有可能走“之字型”路线(垂直等高线走),从而导致需要迭代很多次才能收敛;

而右图对两个原始特征进行了归一化,其对应的等高线显得很圆,在梯度下降进行求解时能较快的收敛。

因此如果机器学习模型使用梯度下降法求最优解时,归一化往往非常有必要,否则很难收敛甚至不能收敛。

归一化有可能提高精度

一些分类器需要计算样本之间的距离(如欧氏距离),例如KNN。如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要)。

简单缩放 | min-max标准化(Min-max normalization) | 离差标准化


在简单缩放中,我们的目的是通过对数据的每一个维度的值进行重新调节(这些维度可能是相互独立的),使得最终的数据向量落在 [0,1]或[ − 1,1] 的区间内(根据数据情况而定)。这对后续的处理十分重要,因为很多默认参数(如 PCA-白化中的 epsilon)都假定数据已被缩放到合理区间。 例子:在处理自然图像时,我们获得的像素值在 [0,255] 区间中,常用的处理是将这些像素值除以 255,使它们缩放到 [0,1] 中.

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

  • x = (x - min)/(max - min)

    • max: 样本数据的最大值
    • min: 为样本数据的最小值

适用场景

这种归一化方法比较适用在数值比较集中的情况。但是,如果max和min不稳定,很容易使得归一化结果不稳定,使得后续使用效果也不稳定,实际使用中可以用经验常量值来替代max和min。而且当有新数据加入时,可能导致max和min的变化,需要重新定义。

在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用第一种方法或其他归一化方法。比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0 255]的范围。

标准差标准化 | z-score 0均值标准化(zero-mean normalization)


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

  • x = (x - u)/σ

    • u: 所有样本数据的均值
    • σ: 为所有样本数据的标准差。

在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,第二种方法(Z-score standardization)表现更好。

非线性归一化


经常用在数据分化比较大的场景,有些数值很大,有些很小。通过一些数学函数,将原始值进行映射。该方法包括 log、指数,正切等。需要根据数据分布的情况,决定非线性函数的曲线,比如log(V, 2)还是log(V, 10)等。

3. 使用 sklearn 来做归一化


# built-in

import time

import operator

import collections

import datetime as dt

from functools import wraps

# 3-party

import pandas as pd

pd.options.display.max_columns = 100

pd.options.display.max_rows = 300

import numpy as np

import scipy

import scipy.stats

import seaborn

from matplotlib import pylab

import matplotlib.pyplot as plt

import sklearn

import sklearn.preprocessing

from CAL.PyCAL import *

# personal lib

from lib import libscaler = sklearn.preprocessing.MinMaxScaler()

data = np.array(range(100))

data = data.astype(float)

data_scaler = scaler.fit_transform(data)

print list(data)

print list(data_scaler)

查看全部

[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0, 26.0, 27.0, 28.0, 29.0, 30.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 41.0, 42.0, 43.0, 44.0, 45.0, 46.0, 47.0, 48.0, 49.0, 50.0, 51.0, 52.0, 53.0, 54.0, 55.0, 56.0, 57.0, 58.0, 59.0, 60.0, 61.0, 62.0, 63.0, 64.0, 65.0, 66.0, 67.0, 68.0, 69.0, 70.0, 71.0, 72.0, 73.0, 74.0, 75.0, 76.0, 77.0, 78.0, 79.0, 80.0, 81.0, 82.0, 83.0, 84.0, 85.0, 86.0, 87.0, 88.0, 89.0, 90.0, 91.0, 92.0, 93.0, 94.0, 95.0, 96.0, 97.0, 98.0, 99.0]
[0.0, 0.010101010101010102, 0.020202020202020204, 0.030303030303030304, 0.040404040404040407, 0.050505050505050511, 0.060606060606060608, 0.070707070707070718, 0.080808080808080815, 0.090909090909090912, 0.10101010101010102, 0.11111111111111112, 0.12121212121212122, 0.13131313131313133, 0.14141414141414144, 0.15151515151515152, 0.16161616161616163, 0.17171717171717174, 0.18181818181818182, 0.19191919191919193, 0.20202020202020204, 0.21212121212121213, 0.22222222222222224, 0.23232323232323235, 0.24242424242424243, 0.25252525252525254, 0.26262626262626265, 0.27272727272727276, 0.28282828282828287, 0.29292929292929293, 0.30303030303030304, 0.31313131313131315, 0.32323232323232326, 0.33333333333333337, 0.34343434343434348, 0.35353535353535359, 0.36363636363636365, 0.37373737373737376, 0.38383838383838387, 0.39393939393939398, 0.40404040404040409, 0.4141414141414142, 0.42424242424242425, 0.43434343434343436, 0.44444444444444448, 0.45454545454545459, 0.4646464646464647, 0.47474747474747481, 0.48484848484848486, 0.49494949494949497, 0.50505050505050508, 0.51515151515151525, 0.5252525252525253, 0.53535353535353536, 0.54545454545454553, 0.55555555555555558, 0.56565656565656575, 0.5757575757575758, 0.58585858585858586, 0.59595959595959602, 0.60606060606060608, 0.61616161616161624, 0.6262626262626263, 0.63636363636363646, 0.64646464646464652, 0.65656565656565657, 0.66666666666666674, 0.6767676767676768, 0.68686868686868696, 0.69696969696969702, 0.70707070707070718, 0.71717171717171724, 0.72727272727272729, 0.73737373737373746, 0.74747474747474751, 0.75757575757575768, 0.76767676767676774, 0.77777777777777779, 0.78787878787878796, 0.79797979797979801, 0.80808080808080818, 0.81818181818181823, 0.8282828282828284, 0.83838383838383845, 0.84848484848484851, 0.85858585858585867, 0.86868686868686873, 0.8787878787878789, 0.88888888888888895, 0.89898989898989912, 0.90909090909090917, 0.91919191919191923, 0.92929292929292939, 0.93939393939393945, 0.94949494949494961, 0.95959595959595967, 0.96969696969696972, 0.97979797979797989, 0.98989898989898994, 1.0]

参考资料

  • 数据预处理
  • 数据的标准化
  • 为什么一些机器学习模型需要对数据进行归一化?
  • 再谈机器学习中的归一化方法(Normalization Method)
  • sklearn scaler
  • sklearn scaler 2
  • 关于使用sklearn进行数据预处理 —— 归一化/标准化/正则化

查看全部

5 条评论
walterchen 10个月前

归一化会导致数据预测不准

taotao.li 10个月前

@walterchen better than never in most condition

===============================

关于神经网络归一化方法的整理
由于采集的各数据单位不一致,因而须对数据进行[-1,1]归一化处理,归一化方法主要有如下几种,供大家参考:(by james)

1、线性函数转换,表达式如下:
y=(x-MinValue)/(MaxValue-MinValue)
说明:x、y分别为转换前、后的值,MaxValue、MinValue分别为样本的最大值和最小值。

2、对数函数转换,表达式如下:
y=log10(x)
说明:以10为底的对数函数转换。

3、反余切函数转换,表达式如下:
y=atan(x)*2/PI
归一化是为了加快训练网络的收敛性,可以不进行归一化处理
归一化的具体作用是归纳统一样本的统计分布性。归一化在0-1之间是统计的概率分布,归一化在-1–+1之间是统计的坐标分布。归一化有同一、 统一和合一的意思。无论是为了建模还是为了计算,首先基本度量单位要同一,神经网络是以样本在事件中的统计分别几率来进行训练(概率计算)和预测的,归一 化是同一在0-1之间的统计概率分布;
当所有样本的输入信号都为正值时,与第一隐含层神经元相连的权值只能同时增加或减小,从而导致学习速度很慢。为了避免出现这种情况,加快网络学习速度,可以对输入信号进行归一化,使得所有样本的输入信号其均值接近于0或与其均方差相比很小。
归一化是因为sigmoid函数的取值是0到1之间的,网络最后一个节点的输出也是如此,所以经常要对样本的输出归一化处理。所以这样做分类的问题时用[0.9 0.1 0.1]就要比用[1 0 0]要好。
但是归一化处理并不总是合适的,根据输出值的分布情况,标准化等其它统计变换方法有时可能更好。

关于用premnmx语句进行归一化:
premnmx语句的语法格式是:[Pn,minp,maxp,Tn,mint,maxt]=premnmx(P,T)
其中P,T分别为原始输入和输出数据,minp和maxp分别为P中的最小值和最大值。mint和maxt分别为T的最小值和最大值。
premnmx函数用于将网络的输入数据或输出数据进行归一化,归一化后的数据将分布在[-1,1]区间内。
我们在训练网络时如果所用的是经过归一化的样本数据,那么以后使用网络时所用的新数据也应该和样本数据接受相同的预处理,这就要用到tramnmx。

下面介绍tramnmx函数:
[Pn]=tramnmx(P,minp,maxp)
其中P和Pn分别为变换前、后的输入数据,maxp和minp分别为premnmx函数找到的最大值和最小值。
(by terry2008)

matlab中的归一化处理有三种方法
1. premnmx、postmnmx、tramnmx
2. restd、poststd、trastd
3. 自己编程
具体用那种方法就和你的具体问题有关了
(by happy)
pm=max(abs(p(i,:))); p(i,:)=p(i,:)/pm;

for i=1:27
p(i,:)=(p(i,:)-min(p(i,:)))/(max(p(i,:))-min(p(i,:)));
end 可以归一到0 1 之间
0.1+(x-min)/(max-min)*(0.9-0.1)其中max和min分别表示样本最大值和最小值。
这个可以归一到0.1-0.9
=============
数据类型相互转换
这种转换可能发生在算术表达式、赋值表达式和输出时。转换的方式有两种:自动转换和强制转换。
========
自动转换
自动转换由编译系统自动完成,可以将一种数据类型的数据转换为另外一种数据类型的数据。
1)算术运算中的数据转换
如果一个运算符有两个不同类型的运算分量,C语言在计算该表达式时会自动转换为同一种数据类型以便进行运算。先将较低类型的数据提升为较高的类型,从而使两者的数据类型一致(但数值不变),然后再进行计算,其结果是较高类型的数据。 自动转换遵循原则——“类型提升”:转换按数据类型提升(由低向高)的方向进行,以保证不降低精度。 数据类型的高低是根据其类型所占空间的大小来判定,占用空间越大,类型越高。反之越低。 例如:算术运算x+y,如果x和y的类型都是int型变量,则x+y的结果自然是int型。如果x是short型而y是int型,则需要首先将x转换为int型,然后再与y进行加法计算,表达式的结果为int型。
2)赋值运算的类型转换
在执行赋值运算时,如果赋值运算符两侧的数据类型不同,赋值号右侧表达式类型的数据将转换为赋值号左侧变量的类型。转换原则是:当赋值运算符“=”右侧表达式的值被计算出来后,不论是什么类型都一律转换为“=”左侧的变量的类型,然后再赋值给左侧的变量。
例如:float a;
a=10;? /*结果为a=10.0(数据填充)*/
int a;
a=15.5 /* 结果为a=15(数据截取)*/
在赋值类型转换时要注意数值的范围不能溢出。既要在该数据类型允许的范围内。如如果右侧变量数据类型长度比左侧的长时,将丢失一部分数据,从而造成数据精度的降低。
3)数据输出时的类型转换
在输出时,数据将转换为格式控制符所要求的类型。同样可能发生数据丢失或溢出。类型转换的实际情况是:字符型到整型是取字符的ASCII码值;整型到字符型只是取其低8位;实型到整型要去掉小数部分;整型到实型数值不变,但以实数形式存放;双精度到实型是四舍五入的。
========
强制转换
一般情况下,数据类型的转换通常是由编译系统自动进行的,不需要程序员人工编写程序干预,所以又被称为隐式类型转换。但如果程序要求一定将某一类型的数据从该种类型强制地转换为另外一种类型,则需要人工编程进行强制类型转换,也称为显式转换。强制类型转换的目地是使数据类型发生改变,从而使不同类型的数据之间的运算能够进行下去。
语法格式如下:
(类型说明符)表达式
功能是强行地将表达式的类型转换为括号内要求的类型。
例如:(int)4.2的结果是4;
又如:int x;
(float)x;x的值被强制转换为实型,但是并不改变的x类型是整型。只是在参与运算处理时按照实型处理。
文章来源:http://www.cnblogs.com/Tisty/archive/2008/07/22/1248994.html
http://jxnu-csu.blog.sohu.com/95810098.html

原文链接:http://tezhengku.com/topic/?p=669

转载于:https://www.cnblogs.com/sddai/p/6250094.html

归一化方法 Normalization Method相关推荐

  1. 对数坐标归一化_归一化方法 Normalization Method

    @walterchen better than never in most condition =============================== 关于神经网络归一化方法的整理 由于采集的 ...

  2. python 归一化_几种归一化方法(Normalization Method)python实现

    数据归一化问题是数据挖掘中特征向量表达时的重要问题,当不同的特征成列在一起的时候,由于特征本身表达方式的原因而导致在绝对数值上的小数据被大数据"吃掉"的情况,这个时候我们需要做的就 ...

  3. 几种归一化方法(Normalization Method)python实现

    数据归一化问题是数据挖掘中特征向量表达时的重要问题,当不同的特征成列在一起的时候,由于特征本身表达方式的原因而导致在绝对数值上的小数据被大数据"吃掉"的情况,这个时候我们需要做的就 ...

  4. 归一化方法(Normalization Method)

    机器学习.数据挖掘工作中,数据前期准备.数据预处理过程.特征提取等几个步骤几乎要花费数据工程师一半的工作时间.同时,数据预处理的效果也直接影响了后续模型能否有效的工作.然而,目前的大部分学术研究主要集 ...

  5. 再谈机器学习中的归一化方法(Normalization Method)

    机器学习.数据挖掘工作中,数据前期准备.数据预处理过程.特征提取等几个步骤几乎要花费数据工程师一半的工作时间.同时,数据预处理的效果也直接影响了后续模型能否有效的工作.然而,目前的大部分学术研究主要集 ...

  6. 数据处理之标准化/归一化方法

    数据处理之标准化/归一化方法 归一化方法(Normalization Method) 1.把数变为(0,1)之间的小数 主要是为了数据处理方便提出来的,把数据映射到0-1范围之内处理,更加便捷快速,应 ...

  7. 深度学习特征归一化方法——BN、LN、IN、GN

    前言 最近看到Group Normalization的论文,主要提到了四个特征归一化方法:Batch Norm.Layer Norm.Instance Norm.Group Norm.此外,论文还提到 ...

  8. 常见分数值归一化方法

    数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可 ...

  9. 归一化mysql函数_数据归一化和两种常用的归一化方法

    数据归一化和两种常用的归一化方法 一.总结 一句话总结: min-max标准化:x* =(x-min)/(max-min):新数据加入,需重新计算max和min Z-score标准化:x* =(x-μ ...

最新文章

  1. 2022-2028年中国量子点膜行业市场调查分析及未来前景分析报告
  2. linux中文乱码怎么办
  3. Effective.Java第23-33条(泛型相关)
  4. CLR Via CSharp读书笔记(14):字符、字符串和文本处理
  5. 一种新的在线学习的方法:能够克服单人多任务学习的困难!
  6. rds_dbsync数据源同步工具
  7. Linux 系统安全加固
  8. Qt中的测试 枚举与 QFlags详解
  9. 快乐学习 Ionic Framework+PhoneGap 手册1-3 {面板切换}
  10. 一个简单的.NET MVC 实例
  11. 腾讯自研分布式远程Shuffle服务Firestorm正式开源
  12. C++ 堆区内存分配
  13. arduino串口监视器显示nan_Arduino常用的三种通信协议UART, I2C和SPI
  14. Linux 小知识翻译 - 「GCC」
  15. 华三服务器管理口地址_各种服务器、存储默认管理IP地址以及用户名密码
  16. 【python】TCP协议编程
  17. matlab开环传递函数 求单位负反馈的系统传递函数,利用matlab由开环传递函数求闭环传递函数并求其单位冲击和阶跃响应...
  18. 如何关闭搜狗输入法软键盘的热键
  19. 怎么把原本一页的PDF拆分成单独的两页?
  20. ubuntu软件商店提示has install-snap change in progress问题

热门文章

  1. java整合groove实战—xml文件解析
  2. 编译C#和C++共存的解决方案的小结
  3. Blas SGEMM launch failed
  4. C++11 随机数生成
  5. c++ 圆上任意点坐标计算_已知圆弧的一些信息,求得圆弧上中间点的坐标的方法(C++语言描述)...
  6. Pytest之参数化
  7. E: Malformed line 60 in source list /etc/apt/sources.list (dist parse)
  8. TokenInsight:反映区块链行业整体表现的TI指数较昨日同期上涨0.54%
  9. 韩国拟监管加密相关国际汇款,以限制资金流向海外
  10. DeFi 保险协议InsurAce将于3月15日在Balancer开启代币首发