scikit-learn MinMaxScaler产生的结果与NumPy实现略有不同

时间:2014-07-13 16:17:52

标签: python numpy normalization scikit-learn scaling

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

使用以下等式进行最小 - 最大缩放:

enter image description here

应该与scikit-learn one:(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()

enter image description here

1 个答案:

答案 0 :(得分:11)

scikit-learn分别处理每个功能。因此,您需要在执行axis=0时指定min,否则numpy.min将是所有数组元素的最小值,而不是每个列分别:< / p>

>>> 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)

这样做可以得到完全匹配:

exact match