@kofon
Я человек

Как рассчитать среднеквадратичное отклонение, если среднее значение неизвестно?

Пусть есть некоторый очень, очень большой файл, где в каждой строке числа, для простоты - целые.
Рассчитать среднее значения через формулу сумма/кол-во нельзя, т.к. файл огромен, в оперативку сумма не поместится (просто смеритесь с этим!). Поэтому я придумал форму (наверняка не я первый):
((i-1) * avg + nextValue) / i где
i - это текущее кол-во рассчитанных чисел (текущий шаг начиная с 1);
avg - текущее среднее значение;
nextValue - следующее значение (из файла).

Например:
3
3
6
читаем построчно
для 3: (0 * 0 + 3) / 1 = 3
для 3: (1 * 3 + 3) / 2 = 3
для 6: (2 * 3 + 6) / 3 = 4

т.е. в любой момент можно остановиться и узнать текущее средн. арифм. значение.

Итого: Среднее значение меняется на каждом шаге, а в будущее заглянуть не дано.
Вопрос: как узнать среднеквадратичное отклонение, если для него нужно заранее узнать среднее значение?

Википедия: Среднеквадратическое отклонение

P.S. Пожалуйста, учтите, что файл очень большой. Представьте себе, самый мощный супер компьютер и SSD диском бесконечно большого объёма (но с ничтожной ОЗУ) будет считывать данные неделями. И остановится он по сигналу, после чего должен сразу же выдать ответ, а не начать считывание повторно (зная среднее значение).
  • Вопрос задан
  • 3090 просмотров
Пригласить эксперта
Ответы на вопрос 4
@Andy_U
Если вы знаете количество чисел, их сумму и сумму их квадратов, то можете вычислить и среднее, и дисперсию. Любой учебник по мат.статистике и/или стат.обработке данных Вам поможет. Единственно, что надо следить за накоплением ошибок округления и возможным переполнением при суммировании.
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Формула в таком виде смысла не имеет.
Причина: (i-1) * avg = SUM(Value0...Valuei-1), что, по вашим же словам, в память не поместится.
Можно считать среднее блока (например, 100 чисел), затем суммировать эти средние и делить на количество блоков. Продолжая алгоритм, средние для каждых 100 блоков можно считать отдельно, как суперблок, затем суммировать их и т.д.

Точное значение среднего квадратического отклонения без знания среднего арифметического не посчитать. Соответственно, надо знать, что представляют из себя эти числа. Вполне может быть, что достаточно взять небольшую случайную выборку, чтобы получить оценочные значения нужных параметров.
Ответ написан
Комментировать
@evgeniy_lm
Вы считаете среднеквадратическое отклонение, т.е. предполагается, что все ваши числа приближенно равны и в принципе не имеет значения сколько вы возьмете чисел из файла 10, 100, 1000 или
1 000 000. Количество значений выборки влияет исключительно на точность результата, само собой разумеется идеальную точность ни кто не требует, по этому выберите несколько случайный значений и не парьтесь
Ответ написан
Комментировать
@Cheshire-Cat
Можно рассчитать по алгоритму Велфорда https://ru.qwe.wiki/wiki/Standard_deviation#Rapid_... https://en.wikipedia.org/wiki/Algorithms_for_calcu...
Он позволяет рассчитывать последовательно среднее и среднеквадратичное отклонение.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы