网上各种资料,对深度学习中的Normalization和Standardization概念都没有解释清楚,导致"标准化"和"归一化"这两个词长期被混用并被传播。本文重新梳理一遍。
归一化(Normalization):归一化是一种简化计算的方式,即将有量纲的数据,经过变换,化为无量纲的数据,即纯量;归一化有同一、统一和合一的意思。在机器学习中,用于特征缩放(Feature scaling)把不同量纲,不同尺度的特征数据放缩到同一尺度,同一分布,并消除量纲,这样可以达到加速梯度下降法收敛,让损失函数的正则化效果更好,消除Internal Covariate Shift问题(BatchNormalization),保证训练效果的目的。
实现机器学习领域中的特征放缩的归一化(Normalization)方法主要有4种:
-
min-max normalization (又称,Rescaling),这是最简单的特征缩放方法,将特征值缩放到[0,1]区间,对均值和方差不做要求,不改变原始数据的分布,公式为:
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
def plot(data, title):
sns.set_style('dark')
f, ax = plt.subplots()
ax.set(ylabel='probability desity')
ax.set(xlabel='height(blue) : weight(green)')
ax.set(title=title)
sns.distplot(data[:, 0:1], color='blue')
sns.distplot(data[:, 1:2], color='red')
plt.show()
# 生成不同分布的身高体重数据
np.random.seed(0)
height = np.random.uniform(low=150, high=190, size=1000).reshape(-1, 1)
weight = np.random.normal(loc=70, scale=10, size=1000).reshape(-1, 1)
# 原始数据
original_data = np.concatenate((height, weight), axis=1)
plot(original_data, 'Original')
# min-max normalization
min_max_data = (original_data - np.min(original_data, axis=0)) / (
np.max(original_data, axis=0) - np.min(original_data, axis=0))
plot(min_max_data, 'min-max normalization')
-
Mean normalization,跟min-max normalization类似,只是原始数据减去最小值变为减去平均值。Mean normalization处理后,将特征值缩放到[-1,1]区间,均值变为=0(以零对称),方差不做要求,不改变原始数据的分布,公式为
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
def plot(data, title):
sns.set_style('dark')
f, ax = plt.subplots()
ax.set(ylabel='probability desity')
ax.set(xlabel='height(blue) : weight(green)')
ax.set(title=title)
sns.distplot(data[:, 0:1], color='blue')
sns.distplot(data[:, 1:2], color='red')
plt.show()
# 生成不同分布的身高体重数据
np.random.seed(0)
height = np.random.uniform(low=150, high=190, size=1000).reshape(-1, 1)
weight = np.random.normal(loc=70, scale=10, size=1000).reshape(-1, 1)
# 原始数据
original_data = np.concatenate((height, weight), axis=1)
plot(original_data, 'Original')
# Mean normalization
mean_normal_data = (original_data - np.mean(original_data, axis=0)) / (
np.max(original_data, axis=0) - np.min(original_data, axis=0))
plot(mean_normal_data, 'Mean normalization')