为什么sklearn的MinMaxScaler归一化稀疏矩阵仅输出-1和1的值
问题原因
你遇到的MinMaxScaler输出只有-1、1两个值是正常计算结果,根因为参与拟合的样本量过少,每个特征维度仅包含2个样本。
MinMaxScaler默认按列(单个特征维度)做归一化,计算逻辑如下:
- 首先对每个特征维度做标准差缩放:
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0)) - 再映射到指定的特征范围:
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
相关产品推荐
相关产品推荐

