【问题标题】:sklearn MinMaxScaler: Inverse does not equal originalsklearn MinMaxScaler:逆不等于原始
【发布时间】:2018-05-23 17:43:53
【问题描述】:

考虑以下 python3 示例,我们使用 scikit-learn 中的 MinMaxScaler 对一系列数字进行归一化,然后将它们反归一化为原始值。

from pandas import Series
from sklearn.preprocessing import MinMaxScaler

data = [10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0]
series = Series(data)

values = series.values
values = values.reshape((len(values), 1))

scaler = MinMaxScaler(feature_range=(0,1))
scaler = scaler.fit(values)

normalized = scaler.transform(values)
inversed = scaler.inverse_transform(normalized)

人们会认为inversed 等于values。唉:

>>> inversed == values
array([[ True],
       [ True],
       [False],
       [ True],
       [ True],
       [False],
       [ True],
       [ True],
       [ True],
       [ True]])

>>> print(values)
[[ 10.]
 [ 20.]
 [ 30.]
 [ 40.]
 [ 50.]
 [ 60.]
 [ 70.]
 [ 80.]
 [ 90.]
 [100.]]

>>> print(inversed)
[[ 10.]
 [ 20.]
 [ 30.]
 [ 40.]
 [ 50.]
 [ 60.]
 [ 70.]
 [ 80.]
 [ 90.]
 [100.]]

这里发生了什么?为什么inversed[2]inversed[5]不等于values[2]values[5]

【问题讨论】:

  • 您将两个浮点数与等号进行比较。由于我假设的舍入差异,这可能会产生意想不到的结果。你能提供浮点值的位模式吗?您可能还想查看floating point guide。如果这已经回答了您的问题,我会将我的评论变成答案
  • 我认为@Quickbeam2k1 是对的:您应该尝试计算值和倒数之间的差异
  • 如果输入数据是int,可以观察到类似的行为

标签: python scikit-learn


【解决方案1】:

您正在将两个浮点数与等号进行比较。由于我假设的舍入差异,这可能会产生意想不到的结果。你能提供浮点值的位模式吗?您可能还想查看floating point guide

正如@CoMartel 建议的那样,您可以观察值和反转之间的差异(到目前为止,我还没有在 numpy 中找到浮点数的一点表示), 你得到

values - inversed
array([[ 0.00000000e+00],
       [ 0.00000000e+00],
       [-3.55271368e-15],
       [ 0.00000000e+00],
       [ 0.00000000e+00],
       [-7.10542736e-15],
       [ 0.00000000e+00],
       [ 0.00000000e+00],
       [ 0.00000000e+00],
       [ 0.00000000e+00]])

你看到对应的值不能相同

【讨论】:

    猜你喜欢
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 2014-11-11
    • 1970-01-01
    • 2017-10-05
    • 2013-09-16
    • 2018-03-20
    相关资源
    最近更新 更多