Недостаточно памяти при выполнении стандартизации для всего набора данных - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть модель нейронной сети, которую я хотел бы обучить, и я решил, что было бы неплохо выполнить стандартизацию по всему обучающему набору вместо того, чтобы выполнять стандартизацию по образцу.

Мой обучающий набор существует из 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')

Я понимаю, почему оба моих метода терпят неудачу, и мне интересно, как я мог / должен был быть сделан?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...