数据归一化 minmax_scale()函数解析

minmax_scale()函数是来自sklearn.preprocessing包中。sklearn.preprocessing.minmax_scale(X, feature_range=(0, 1), axis=0, copy=True)
该方法将每个特征放缩到给定范围内(默认范围0-1)

为什么要进行归一化:
  1. 数据存在不同的评价指标,其量纲或量纲单位不同,处于不同的数量级。解决特征指标之间的可比性,经过归一化处理后,各指标处于同一数量级,便于综合对比。
  2. 求最优解的过程会变得平缓,更容易正确收敛。即能提高梯度下降求最优解时的速度
  3. 提高计算精度。

但是归一化过程中会造成信息糗事

归一化方法常用方法有两种:
  • 线性归一化(minmax_scale)
    minmax_scale()变换函数为min-max标准化,也称为离差标准化,是对原始数据的线性变换,min-max标准化方法的缺陷在当有新数据加入时,可能会导致X.max和X.min的值发生变化,需要重新计算。
    Xscaled=XX.min(axis=0)X.max(axis=0)X.min(axis=0)(maxmin)+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

  • 20
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值