У меня есть модель нейронной сети, которую я хотел бы обучить, и я решил, что было бы неплохо выполнить стандартизацию по всему обучающему набору вместо того, чтобы выполнять стандартизацию по образцу.
Мой обучающий набор существует из 630 образцы. Каждый образец состоит из 7 каналов (force_x, force_y, force_z, accel_x, accel_y, accel_z, AE). Каждый канал имеет + - 200 000 измерений.
Таким образом, чтобы найти среднее значение и стандартное значение для каждого канала по всему обучающему набору, я попробовал что-то вроде этого:
import pandas as pd
total_df = None
for sample_file in sample_files:
df = pd.read_csv(sample_file)
if total_df is None:
total_df = df
else:
total_df.append(df)
print(df["force_x"].mean())
print(df["force_x"].std())
Хотя это дает ошибку нехватки памяти, потому что не все данные может одновременно храниться в памяти
Чтобы избежать этого, я попытался вычислить среднее значение и стандартное значение на основе выборки и объединить эти значения в глобальное значение следующим образом:
import pandas as pd
amount_measurements = 0
force_x_mean = None
force_x_std = None
def combine_stds(std_1, n_1, std_2, n_2):
return ((std_1 ** 2) * (n_1 - 1) + (std_2 ** 2) * (n_2 - 1)) / (n_1 + n_2 - 1)
def combine_means(mean_1, n_1, mean_2, n_2):
return mean_1 * (n_1 / (n_1 + n_2)) + mean_2 * (n_2 / (n_1 + n_2))
for sample_file in sample_files:
df = pd.read_csv(sample_file)
if amount_measurements == 0:
force_x_mean = df["force_x"].mean()
force_x_std = df["force_x"].std()
else:
force_x_mean = combine_means(force_x_mean, amount_measurements, df["force_x"].mean(), df.shape[0])
force_x_std = combine_stds(force_x_std, amount_measurements, df["force_x"].std(), df.shape[0])
amount_measurements += df.shape[0]
print(force_x_mean)
print(force_x_std)
Опять же, мой метод терпит неудачу:
return ((std_1 ** 2) * (n_1 - 1) + (std_2 ** 2) * (n_2 - 1)) / (n_1 + n_2 - 1)
OverflowError: (34, 'Result too large')
Я понимаю, почему оба моих метода терпят неудачу, и мне интересно, как я мог / должен был быть сделан?