如何对3D数组的特定维度进行归一化处理

3

sklearn.preprocessing.normalize只支持2D数组的标准化。但是,我目前有一个用于LSTM模型训练的3D数组(批处理、步骤和特征),我希望对特征进行标准化。

我已经尝试了tf.keras.utils.normalize(X_train, axis=-1, order=2 ),但它是不正确的。

另一种方法是将3D数组折叠成2D数组。

print(X_train.shape)
print(max(X_train[0][0]))

输出

(1883, 100, 68)
6.028588763956215

scaler = StandardScaler()
X_train = scaler.fit_transform(X_train.reshape(X_train.shape[0], -1)).reshape(X_train.shape)
X_test = scaler.transform(X_test.reshape(X_test.shape[0], -1)).reshape(X_test.shape)
print(X_train.shape)
print(max(X_train[0][0]))
print(min(X_train[0][0]))

输出

(1883, 100, 68)
3.2232538993444533
-1.9056918449890343

这个值仍然不在1和-1之间。

我该如何解决?


1
@MarcoCerliani,我建议您将此作为答案发布,具体涉及MinMaxScaler,以便OP随后接受并解决问题(这不是完全重复)。 - desertnaut
1个回答

6

根据评论建议,我提供了答案。

你可以使用sklearn的预处理方法来缩放3D数组。你只需将其转化为2D数据来适应它们,然后再转回3D。这可以通过几行代码轻松完成。

如果你想让缩放后的数据在(-1,1)范围内,可以简单地使用MinMaxScaler并指定feature_range=(-1,1)

X_train = np.random.uniform(-20,100, (1883, 100, 68))
X_test = np.random.uniform(-20,100, (100, 100, 68))

print(X_train.shape)
print(X_train.min().round(5), X_train.max().round(5)) # -20, 100

scaler = MinMaxScaler(feature_range=(-1,1))
X_train = scaler.fit_transform(X_train.reshape(X_train.shape[0], -1)).reshape(X_train.shape)
X_test = scaler.transform(X_test.reshape(X_test.shape[0], -1)).reshape(X_test.shape)

print(X_train.shape)
print(X_train.min().round(5), X_train.max().round(5)) # -1, 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接