归一化和标准化是否改变数据分布的问题

归一化和标准化关于是否改变原始数据分布的探讨


最近在做关于ECG的降噪实验,在数据处理过程中需要进行归一化的操作,因此对常见的标准化和归一化做一下总结。

归一化

归一化的目的

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

归一化的优点

  1. 提升模型的收敛速度
  2. 提升模型的精度
  3. 深度学习中数据归一化可以防止模型梯度爆炸

常见的数据归一化方法

  1. min-max归一化: x=xmin(x)max(x)min(x)x^{'}=\frac{x-min(x)}{max(x)-min(x)}

这种是对数据的数值范围进行特定缩放,但不改变其数据分布的一种线性特征变换

#min-max数据归一化
import numpy as np
import matplotlib.pyplot as plt
import numpy as np
import scipy.io as sio
import os
import seaborn as sns
#Seaborn是一种基于matplotlib的图形可视化python libraty。它提供了一种高度交互式界面,便于用户能够做出各种有吸引力的统计图表。
import matplotlib
font_set=matplotlib.font_manager.FontProperties(fname='C:\\Windows\\Fonts\\simsun.ttc')

path="C:\\Users\OneDrive\matlab\data\mit_bih\\100_1hour.mat"
ECG_all=[]

data=sio.loadmat(path)#data读取出来是一个字典
data=data['sig']
x=data[180:1440]
x_scale=(x-x.min())/(x.max()-x.min())

fig,ax=plt.subplots(1,2)
sns.distplot(x,ax=ax[0])
ax[0].set_title('原始数据',fontproperties=font_set)
sns.distplot(x_normal,ax=ax[1])
ax[1].set_title('归一化后数据',fontproperties=font_set)
plt.show()

归一化和标准化是否改变数据分布的问题

  1. z-score归一化: x=xμσx^{'}=\frac{x-\mu}{\sigma}

将数值范围缩放到0附近,但没有改变数据分布

最常见的标准化方法就是Z标准化,也是SPSS中最为常见的标准化方法,SPSS默认的标准化方法就是z-score标准化,也叫标准差标准化,这种方法涉及原始数据的均值(mean)和标准差(standard deviation)

进过处理的数据符合标准正态分布,即均值为0,标准差为1,注意,一般来说z-score不是归一化,而是标准化,归一化只是标准化的一种

#z-score归一化
x_normal=(x-x.mean())/(x.std())

fig,ax=plt.subplots(1,2)
sns.distplot(x,ax=ax[0])
ax[0].set_title('原始数据',fontproperties=font_set)
sns.distplot(x_normal,ax=ax[1])
ax[1].set_title('z-score归一化后数据',fontproperties=font_set)
plt.show()

归一化和标准化是否改变数据分布的问题

标准化

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

  1. box-cox标准化x(λ)={xλ1λif λ /=0ln(x)if λ=0x(\lambda)=\begin{cases}\frac{x^{\lambda}-1}{\lambda}&\text{if }\lambda\mathrlap{\,/}{=}0 \\ ln(x) &\text{if }\lambda=0 \end{cases}

katex编辑命令:{https://katex.org/docs/supported.html}
对数据的分布的进行转换,使其符合某种分布(比如正态分布)的一种非线性特征变换 [3]

from scipy import stats
x=np.random.exponential(size=1000)
x_normal=stats.boxcox(x)[0]

fig,ax=plt.subplots(1,2)
sns.distplot(x,ax=ax[0])
ax[0].set_title('原始数据',fontproperties=font_set)
sns.distplot(x_normal,ax=ax[1])
ax[1].set_title('box-cox标准化后数据',fontproperties=font_set)
plt.show()

归一化和标准化是否改变数据分布的问题

参考文章:
1:Python绘图总结(seaborn篇)之数据分布
2:10分钟python图表绘制 | seaborn入门(一):distplot与kdeplot
3:标准化和归一化什么区别?
4:数据标准化/归一化normalization

.js/