Есть ли алгоритм для оценки медианы, режима, асимметрии и/или эксцесса набора значений, но это НЕ требует хранения всех значений в памяти сразу?
Я бы хотел рассчитать основную статистику:
- означает: среднее арифметическое
- дисперсия: среднее значение квадратов отклонений от среднего
- стандартное отклонение: квадратный корень дисперсии
- медиана: значение, которое отделяет большую половину чисел от меньшей половины
- режим: наиболее частое значение, найденное в наборе
- асимметрия: TL;DR
- эксцесс: TL;DR
Основными формулами для расчета любого из них являются арифметика школьной школы, и я их знаю. Существует множество библиотек статистики, которые их также реализуют.
Моя проблема - большое количество (миллиардов) значений в наборах, которые я обрабатываю: работая в 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.
- Вычитает квадрат_выражения из среднего_значения, сохраняя как дисперсию.
- Среднее значение и дисперсия вывода.
Этот алгоритм "on-line" имеет слабые места (например, проблемы с точностью, поскольку sum_of_squares быстро растет больше, чем целочисленный диапазон или точность float), но в основном дает мне то, что мне нужно, без необходимости хранить каждое значение в каждом наборе.
Но я не знаю, существуют ли подобные методы для оценки дополнительной статистики (медиана, режим, асимметрия, эксцесс). Я мог бы жить с предвзятой оценкой или даже методом, который в определенной степени компрометирует точность, если память, необходимая для обработки значений N, существенно меньше, чем O (N).
Указание на существующую библиотеку статистики также поможет, если библиотека имеет функции для вычисления одной или нескольких из этих операций "on-line".