You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

sklearn MinMaxScaler逆变换结果与原始数据不等的原因探究

MinMaxScaler反归一化后数值看似相等但比较返回False的原因

这其实是浮点数精度误差在搞鬼!相信不少人都踩过这个坑😅

先拆解一下MinMaxScaler的计算逻辑:
归一化公式是:

X_scaled = (X - X_min) / (X_max - X_min)

反归一化则是逆运算:

X = X_scaled * (X_max - X_min) + X_min

在你的数据里,X_min=10.0,X_max=100.0,差值是90.0。拿30.0举例,归一化后的值是(30-10)/90 = 2/9——这是一个无限循环的二进制小数,计算机没办法用浮点数精确存储它。当你反归一化时,这个近似存储的数值再乘90加10,得到的结果会非常接近30.0,但并不是严格等于30.0(比如可能是30.000000000000004或者29.999999999999996),只是Python默认的打印格式把这个极小的差异给隐藏了,所以你看起来两者完全一样。

你可以手动打印差值验证一下:

print(inversed[2] - values[2])
print(inversed[5] - values[5])

输出会是类似4.440892098500626e-16这样的极小值,这就是浮点数精度带来的“隐形误差”。

直接用==比较浮点数是非常不严谨的,因为浮点数的存储和计算天生就有精度限制。正确的做法是用numpy.allclose()来比较,它会自动考虑一个合理的误差范围:

import numpy as np
print(np.allclose(inversed, values))  # 这个会返回True

最后总结下关键点:

  • 浮点数无法精确表示所有十进制分数,计算中必然存在微小误差
  • 打印输出的格式化规则会掩盖这些误差,让数值看起来完全一致
  • 比较浮点数一定要用带误差容忍的方法,比如np.allclose(),而不是直接用==

内容的提问来源于stack exchange,提问作者user9799326

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:40:32