Есть ли алгоритм для оценки медианы, режима, асимметрии и / или эксцесса набора значений, но он НЕ требует одновременного сохранения всех значений в памяти?
Я хочу посчитать основную статистику:
- среднее: среднее арифметическое
- дисперсия: среднее квадратов отклонений от среднего
- стандартное отклонение: квадратный корень из дисперсии
- медиана: значение, отделяющее большую половину чисел от меньшей половины.
- режим: наиболее частое значение в наборе
- асимметрия: 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, сохраняя как дисперсию.
- Среднее значение и дисперсия вывода.
У этого «оперативного» алгоритма есть слабые места (например, проблемы с точностью, поскольку сумма_квадратов быстро становится больше, чем целочисленный диапазон или точность с плавающей запятой), но он в основном дает мне то, что мне нужно, без необходимости хранить каждое значение в каждом наборе.
Но я не знаю, существуют ли подобные методы для оценки дополнительной статистики (медиана, мода, асимметрия, эксцесс). Я мог бы жить со смещенной оценкой или даже с методом, который в определенной степени ставит под угрозу точность, пока память, необходимая для обработки N значений, существенно меньше O (N).
Указание мне на существующую библиотеку статистики тоже поможет, если в библиотеке есть функции для вычисления одной или нескольких из этих операций «в режиме онлайн».