机器学习中的标准化/归一化
数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间。在一些数据比较和评价中常用到。典型的有归一化法,还有比如极值法、标准差法。
归一化方法的主要有两种形式:一种是把数变为(0,1)之间的小数,一种是把有量纲表达式变为无量纲表达式。在数字信号处理中是简化计算的有效方式。
归一化处理的好处:
1 加快梯度下降的求解速度,即提升模型的收敛速度
两个特征区间相差非常大时,如左图中的x1[0-2000]和x2[1-5],形成的等高线偏椭圆,迭代时很有可能走“之字型”路线(垂直长轴),从而导致需要迭代很多次才能收敛。
而右图对两个特征进行了归一化,对应的等高线就会变圆,在梯度下降进行求解时能较快的收敛。
因此在机器学习中使用梯度下降法求最优解时,归一化也很有必要,否则模型很难收敛甚至有时不能收敛。
2 有可能提高模型的精度
一些分类器需要计算样本之间的距离,如果一个特征的值域范围非常大,那么距离计算就会主要取决于这个特征,有时就会偏离实际情况。
标准化/归一化处理的类型及含义:
线性归一化(min-max normalization)
这种归一化适合数值比较集中的情况,缺陷就是如果max和min不稳定,很容易使得归一化结果不稳定,使得后续的效果不稳定,实际使用中可以用经验常量来代替max和min。
# 使用scikit-learn函数
min_max_scaler = preprocessing.MinMaxScaler()
feature_scaled = min_max_scaler.fit_transform(feature)
# 使用numpy自定义函数
def min_max_norm(x):
x = np.array(x)
x_norm = (x-np.min(x))/(np.max(x)-np.min(x))
return x_norm
标准差标准化(z-score standardization)
经过处理的数据符合标准正态分布,均值为0,标准差为1。
# 使用scikit-learn函数
standar_scaler = preprocessing.StandardScaler()
feature_scaled = standar_scaler.fit_transform(feature)
# 使用numpy自定义函数
def min_max_norm(x):
x = np.array(x)
x_norm = (x-np.mean(x))/np.std(x)
return x_norm
非线性归一化
经常用在数据分化较大的场景,有些数值大,有些很小。通过一些数学函数,将原始值进行映射。该方法包括log、指数、反正切等。需要根据数据分布的情况,决定非线性函数的曲线。
log函数:x = lg(x)/lg(max);反正切函数:x = atan(x)*2/pi
上一篇: iOS-自定义交互式转场动画
下一篇: Ruby语言规范发布