归一化公式 - 使用 Whole/Train 数据集计算公式内的均值和 STD?

Normalization Formula - Using Whole/Train Dataset To Calculate Mean and STD Within Formula?

标准化数据集的公式如下:

Standardzied_X = (X - 平均值)/(标准差)

我想知道我是否应该在整个数据集(训练和测试的串联)或仅在训练数据集上找到均值和标准差。我在某处读到,训练数据集的 STD 应该用于训练和测试数据集的标准化公式,但这对我来说没有意义。

假设数据在变量 Xtr、Ytr、Xte、Yte 中,形状分别为 [n,d]、[n,1]、[m,d]、[m,1]。

我的回答如下:

X_mean = numpy.mean(numpy.concatenate(X_tr , X_te))

X_std = numpy.std(numpy.concatenate(X_tr , X_te))

X_tr_norm = (X_tr - X_mean)/X_std

X_te_norm = (X_te - X_mean)/X_std

mean and STD of train dataset should be used in normalization formula for both train and test dataset, but it doesnt make sense to me

这对我来说很有意义。首先,训练数据集应该足够大以提供对均值和标准差的良好估计。其次,通过这种方式,您不会在训练期间通过使用测试数据来“作弊”。

如果您真的想计算训练数据和测试数据的平均值,则不必将它们连接起来。您可以自己计算加权均值和标准差。

combined_mean = (len(train_data) * train_data.mean() + len(test_data) * test_data.mean()) \
                / (len(train_data) + len(test_data))
# std is more tricky
train_second_moment = np.mean((train_data - combined_mean) ** 2)
test_second_moment = np.mean((test_data - combined_mean) ** 2)
combined_std = np.sqrt((len(train_data) * train_second_moment + len(test_data) * test_second_moment) \
               / (len(train_data) + len(test_data)))