归一化公式 - 使用 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)))
标准化数据集的公式如下:
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)))