Существует ли алгоритм для оценки медианы, режима, асимметрии и / или эксцесса набора значений, но который НЕ требует сохранения всех значений в памяти сразу?
Я бы хотел вычислить базовую статистику:
- означает: среднее арифметическое
- дисперсия: среднее квадратов отклонений от среднего
- стандартное отклонение: квадратный корень из дисперсии
- медиана: значение, которое отделяет большую половину чисел от меньшей половины
- : наиболее часто встречающееся значение в наборе
- асимметрия: tl; др
- эксцесс: tl; др
Основные формулы для вычисления любого из них - арифметика начальной школы, и я знаю их. Также есть много библиотек статистики, которые их реализуют.
Моя проблема заключается в большом количестве (миллиарды) значений в наборах, с которыми я работаю: работая в Python, я не могу просто создать список или хэш с миллиардами элементов. Даже если бы я написал это на C, массивы из миллиардов элементов не слишком практичны.
Данные не отсортированы. Он производится случайно, на лету, другими процессами. Размер каждого набора сильно варьируется, и размеры не будут известны заранее.
Я уже понял, как правильно обрабатывать среднее и дисперсию, перебирая каждое значение в наборе в любом порядке. (На самом деле, в моем случае, я беру их в том порядке, в котором они были сгенерированы.) Вот алгоритм, который я использую, любезно http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#On-line_algorithm:
- Инициализировать три переменные: count, sum и sum_of_squares
- Для каждого значения:
- Количество приращений.
- Добавьте значение к сумме.
- Добавьте квадрат значения к sum_of_squares.
- Разделите сумму на число, сохранив ее как среднее значение.
- Разделите sum_of_squares на количество, сохраняя в качестве переменной mean_of_squares.
- Среднее значение квадрата, хранится как square_of_mean.
- Вычесть square_of_mean из mean_of_squares, сохраняя как дисперсию.
- Среднее значение и дисперсия.
У этого «онлайнового» алгоритма есть недостатки (например, проблемы с точностью, так как sum_of_squares быстро растет больше, чем целочисленный диапазон или точность с плавающей точкой), но в основном он дает мне то, что мне нужно, без необходимости хранить каждое значение в каждом наборе. 1054 *
Но я не знаю, существуют ли похожие методы для оценки дополнительной статистики (медиана, мода, асимметрия, эксцесс). Я мог бы жить с предвзятым оценщиком или даже методом, который в определенной степени снижает точность, если объем памяти, необходимый для обработки значений N, существенно меньше, чем O (N).
Указание на существующую библиотеку статистики также поможет, если в библиотеке есть функции для вычисления одной или нескольких из этих операций "в режиме онлайн".