minmax_scale()函数是来自sklearn.preprocessing
包中。sklearn.preprocessing.minmax_scale(X, feature_range=(0, 1), axis=0, copy=True)
该方法将每个特征放缩到给定范围内(默认范围0-1)
为什么要进行归一化:
- 数据存在不同的评价指标,其量纲或量纲单位不同,处于不同的数量级。解决特征指标之间的可比性,经过归一化处理后,各指标处于同一数量级,便于综合对比。
- 求最优解的过程会变得平缓,更容易正确收敛。即能提高梯度下降求最优解时的速度
- 提高计算精度。
但是归一化过程中会造成信息糗事
归一化方法常用方法有两种:
- 线性归一化(minmax_scale)
minmax_scale()变换函数为min-max标准化,也称为离差标准化,是对原始数据的线性变换,min-max标准化方法的缺陷在当有新数据加入时,可能会导致X.max和X.min的值发生变化,需要重新计算。
Xscaled=X−X.min(axis=0)X.max(axis=0)−X.min(axis=0)⋅(max−min)+min X s c a l e d = X − X . m i n ( a x i s = 0 ) X . m a x ( a x i s = 0 ) − X . m i n ( a x i s = 0 ) ⋅ ( m a x − m i n ) + m i n
max,min是给定放缩范围的最大值和最小值
通俗地解释 :
归一化结果=该点样本值与最小样本的差样本该轴跨度⋅放缩范围+放缩最小值 归 一 化 结 果 = 该 点 样 本 值 与 最 小 样 本 的 差 样 本 该 轴 跨 度 ⋅ 放 缩 范 围 + 放 缩 最 小 值 - Z-score标准差标准化方法。
Xscaled=X−μσ X s c a l e d = X − μ σ
x为某一具体数值 μ μ 是平均值 σ σ 是标准差
调用方法:
>>> from sklearn.preprocessing import minmax_scale
>>> x = [0,1,2,3,4,5]
>>> minmax_scale(x)
array([0. , 0.2, 0.4, 0.6, 0.8, 1. ])
>>> y = [[0,0,0],[1,1,1],[2,2,2]]
>>> minmax_scale(y)
array([[0. , 0. , 0. ],
[0.5, 0.5, 0.5],
[1. , 1. , 1. ]])
>>> minmax_scale(y, axis=1)
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
>>> y = [[0,1,2],[1,2,3],[2,3,4]]
>>> minmax_scale(y)
array([[0. , 0. , 0. ],
[0.5, 0.5, 0.5],
[1. , 1. , 1. ]])
>>> minmax_scale(y, axis=1)
array([[0. , 0.5, 1. ],
[0. , 0.5, 1. ],
[0. , 0.5, 1. ]])
用于将数据归一化处理
minmax_scale()函数源码如下(加注释)
def minmax_scale(X, feature_range=(0, 1), axis=0, copy=True):
# sklearn.utils.check_array() 数据转化numpy
# FLOAT_DTYPES = (numpy.float64, numpy.float32, numpy.float16)
X = check_array(X, copy=False, ensure_2d=False, warn_on_dtype=True, dtype=FLOAT_DTYPES)
# ndim数据纬度
original_ndim = X.ndim
if original_ndim == 1:
# 如果数据纬度为n*1 reshape 1*n
X = X.reshape(X.shape[0], 1)
# 将属性放缩到一个指定的最大值和最小值之间
s = MinMaxScaler(feature_range=feature_range, copy=copy)
# fit_transform 先拟合数据,再进行标准化
if axis == 0:
X = s.fit_transform(X)
else:
X = s.fit_transform(X.T).T
if original_ndim == 1:
# 将多维数组降位一维 返回视图(会改变原矩阵)
X = X.ravel()
return X
Reference:
http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.minmax_scale.html#sklearn.preprocessing.minmax_scale
https://github.com/scikit-learn/scikit-learn/blob/a24c8b46/sklearn/preprocessing/data.py#L390
https://www.zhihu.com/question/20455227