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

为什么sklearn的MinMaxScaler归一化稀疏矩阵仅输出-1和1的值

问题原因

你遇到的MinMaxScaler输出只有-1、1两个值是正常计算结果,根因为参与拟合的样本量过少,每个特征维度仅包含2个样本。

MinMaxScaler默认按列(单个特征维度)做归一化,计算逻辑如下:

  1. 首先对每个特征维度做标准差缩放:X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
  2. 再映射到指定的特征范围:X_scaled = X_std * (feature_max - feature_min) + feature_min

你当前输入的list_1为2行3列结构,每个特征(每一列)仅包含2个取值,刚好对应该维度的最大值、最小值,所以映射到[-1,1]范围后,最小值对应-1、最大值对应1,自然只会出现这两个取值。

解决方法
  • 不要仅提取前2行样本做拟合,使用全量训练集数据完成MinMaxScaler拟合后,再对需要的子集做变换,就能得到[-1,1]范围内的连续归一化值,修改后的代码逻辑参考:
import h5py
import numpy
from sklearn.preprocessing import MinMaxScaler

file = h5py.File('HDF5s\\xy_train&std_data.hdf5', 'r')
# 用全量训练集拟合缩放器
full_dataset = numpy.array(file['s1']['V1']['cnn1']['n_train'], dtype='float64')
file.close()

scaler_1 = MinMaxScaler(feature_range=(-1, 1))
# 全量拟合
scaler_1.fit(full_dataset)

# 再对需要的子集做变换
list_1 = full_dataset[:2, :3]
s_list_1 = scaler_1.transform(list_1)

print('list_1: ', list_1, '\n')
print('scaled: ', s_list_1, '\n')
print('transfer: ', scaler_1.inverse_transform(s_list_1), '\n')
  • 如果你的业务场景允许按单样本维度做归一化,可以调整归一化的计算维度为行维度,不需要依赖全量数据集的统计值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:51:01