【问题标题】:scikit-learn MinMaxScaler produces slightly different results than a NumPy implemantationscikit-learn MinMaxScaler 产生的结果与 NumPy 实现略有不同
【发布时间】:2014-09-03 16:07:45
【问题描述】:

我将来自 preprocessing 模块的 scikit-learn Min-Max 缩放器与使用 NumPy 的“手动”方法进行了比较。但是,我注意到结果略有不同。有人对此有解释吗?

使用以下等式进行 Min-Max 缩放:

应该和scikit-learn一样:(X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))

我使用两种方法如下:

def numpy_minmax(X):
    xmin =  X.min()
    return (X - xmin) / (X.max() - xmin)

def sci_minmax(X):
    minmax_scale = preprocessing.MinMaxScaler(feature_range=(0, 1), copy=True)
    return minmax_scale.fit_transform(X)

在随机样本上:

import numpy as np

np.random.seed(123)

# A random 2D-array ranging from 0-100

X = np.random.rand(100,2)
X.dtype = np.float64
X *= 100 

结果略有不同:

from matplotlib import pyplot as plt

sci_mm = sci_minmax(X)
numpy_mm = numpy_minmax(X)

plt.scatter(numpy_mm[:,0], numpy_mm[:,1],
        color='g',
        label='NumPy bottom-up',
        alpha=0.5,
        marker='o'
        )

plt.scatter(sci_mm[:,0], sci_mm[:,1],
        color='b',
        label='scikit-learn',
        alpha=0.5,
        marker='x'
        )

plt.legend()
plt.grid()

plt.show()

【问题讨论】:

    标签: python numpy normalization scikit-learn scaling


    【解决方案1】:

    scikit-learn 单独处理每个功能。因此,您需要在获取min 时指定axis=0,否则numpy.min 将是所有 数组元素的最小值,而不是单独的每一列:

    >>> xs
    array([[1, 2],
           [3, 4]])
    >>> xs.min()
    1
    >>> xs.min(axis=0)
    array([1, 2])
    

    numpy.max 也一样;所以正确的函数是:

    def numpy_minmax(X):
        xmin =  X.min(axis=0)
        return (X - xmin) / (X.max(axis=0) - xmin)
    

    这样做你会得到一个完全匹配的:

    【讨论】:

      猜你喜欢
      • 2017-02-02
      • 2012-09-03
      • 2014-07-29
      • 2020-09-16
      • 2019-09-11
      • 1970-01-01
      • 2018-07-14
      • 2022-11-25
      • 2017-12-22
      相关资源
      最近更新 更多