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

如何用sklearn的MinMaxScaler实现全量数据整体归一化而非按列归一化

全局维度MinMaxScaler归一化实现方法

使用sklearn.preprocessing.MinMaxScaler做数据归一化时,若原始数据为4行2列的二维数组,默认配置会按每列单独计算归一化参数,导致两列归一化结果完全一致。若需要基于整个数据集的全局最大值、最小值做归一化,最终保留原有的2列结构,且不想采用先合并成一列、归一化后再拆分的方案,可参考以下实现:


初始默认实现(按列归一化)

from sklearn.preprocessing import MinMaxScaler

data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
scaler = MinMaxScaler()
print(data)
print(scaler.fit_transform(data))

输出结果:

[[-1, 2],
 [-0.5, 6],
 [0, 10],
 [1, 18]]

[[0.   0.  ]
 [0.25 0.25]
 [0.5  0.5 ]
 [1.   1.  ]]

期望输出(全局归一化)

所有数值拉平计算归一化参数后,恢复原2列结构的结果:

[[0.        , 0.15789474]
 [0.02631579, 0.36842105]
 [0.05263158, 0.57894737]
 [0.10526316, 1.        ]]

实现方案

方案1:基于numpy直接计算,无维度转换开销

不需要做任何数组合并、拆分操作,直接基于原数组全局极值做广播运算,性能最优:

import numpy as np

data = np.array([[-1, 2], [-0.5, 6], [0, 10], [1, 18]])
# 取全局最大最小值
data_min = data.min()
data_max = data.max()
# 直接按公式计算,自动保留原数组结构
scaled_data = (data - data_min) / (data_max - data_min)
print(scaled_data)

方案2:复用MinMaxScaler接口的实现

如果需要用到MinMaxScaler的内置能力(比如反归一化inverse_transform),可使用numpy视图操作实现,不会产生额外数据拷贝,不属于显式的合并拆分操作:

from sklearn.preprocessing import MinMaxScaler
import numpy as np

data = np.array([[-1, 2], [-0.5, 6], [0, 10], [1, 18]])
scaler = MinMaxScaler()
# reshape操作为视图操作,无数据复制开销
scaled_data = scaler.fit_transform(data.reshape(-1, 1)).reshape(data.shape)
print(scaled_data)

反归一化调用方式:

origin_data = scaler.inverse_transform(scaled_data.reshape(-1, 1)).reshape(data.shape)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:27:03