Я ищу хороший алгоритм (подразумевающий минимальные вычисления, минимальные требования к хранилищу) для оценки медианы набора данных, который слишком велик для хранения, так что каждое значение может быть прочитано только один раз (если вы явно не сохраните это значение). На данных, которые можно предположить, нет границ.
Аппроксимации хороши, пока точность известна.
Есть указатели?
algorithms
median
large-data
PeterR
источник
источник
Ответы:
Не могли бы вы сгруппировать набор данных в гораздо меньшие наборы данных (скажем, 100, 1000 или 10000 точек данных)? Если затем вы рассчитали медиану каждой из групп. Если вы сделали это с достаточным количеством наборов данных, вы могли бы построить что-то вроде среднего значения результатов каждого из меньших наборов и этого анализа, запустив достаточно небольшие наборы данных, сходящиеся к «среднему» решению.
источник
Как насчет процедуры биннинга? Предположим (в целях иллюстрации), что вы знаете, что значения находятся в диапазоне от 1 до 1 миллиона. Установите N лотков размера S. Поэтому, если S = 10000, у вас будет 100 лотков, соответствующих значениям [1: 10000, 10001: 20000, ..., 990001: 1000000]
Затем, шаг за шагом значения. Вместо того, чтобы хранить каждое значение, просто увеличьте счетчик в соответствующей ячейке. Используя среднюю точку каждой ячейки в качестве оценки, вы можете сделать разумное приближение к медиане. Вы можете масштабировать его до точного или грубого разрешения, изменяя размер ячеек. Вы ограничены только тем, сколько у вас памяти.
Поскольку вы не знаете, насколько велики могут быть ваши значения, просто выберите размер корзины, достаточно большой, чтобы вы не могли исчерпать память, используя несколько быстрых вычислений за пределами конверта. Вы также можете хранить корзины редко, так что вы можете добавить корзину только в том случае, если она содержит значение.
Редактировать:
Ссылка, предоставленная ryfm, дает пример того, как это сделать, с дополнительным шагом использования кумулятивных процентов для более точной оценки точки в пределах среднего бина, а не просто с использованием средних точек. Это хорошее улучшение.
источник
Я перенаправляю вас к моему ответу на подобный вопрос . В двух словах, это алгоритм чтения «на лету», с сложностью в худшем случае для вычисления (точной) медианы.O(n)
источник
Алгоритм Ривест-Тарьян-Selection (иногда также называют медианы из-медиана алгоритм) позволит вам вычислить средний элемент в линейное время без какой - либо сортировки. Для больших наборов данных это может быть немного быстрее, чем логарифмическая сортировка. Тем не менее, это не решит проблему с памятью.
источник
Я реализовал алгоритм P-квадрата для динамического вычисления квантилей и гистограмм без сохранения наблюдений в аккуратном Python-модуле, который я написал под названием LiveStats . Это должно решить вашу проблему довольно эффективно.
источник
Мне никогда не приходилось это делать, так что это всего лишь предложение.
Я вижу две (другие) возможности.
Половина данных
Выборочное распределение
Другой вариант - использовать приближение, включающее распределение выборки. Если ваши данные нормальные, то стандартная ошибка для умеренного n :
1,253 * SD / sqrt (н)
Чтобы определить размер n, которым вы будете довольны, я запустил быстрое моделирование Монте-Карло в R
Для n = 10000 15% единообразных медианных оценок были вне CI.
источник
Вы можете попытаться найти медиану, основанную на распределении сгруппированных частот, вот некоторые детали
источник
Вот ответ на вопрос, заданный на stackoverflow: https://stackoverflow.com/questions/1058813/on-line-iterator-algorithms-for-estimating-statistical-median-mode-skewness/2144754#2144754
Итеративное обновление медиана + = eta * sgn (образец - медиана) звучит так, как будто это может быть путь.
источник
Remedian Алгоритм (PDF) дает однопроходную медианную оценку с низкими требованиями к хранению и хорошо определенной точностью.
источник
Если значения, которые вы используете, находятся в определенном диапазоне, скажем, от 1 до 100000, вы можете эффективно вычислять медиану для чрезвычайно большого числа значений (скажем, триллионов записей) с целочисленным сегментом (этот код взят из лицензии BSD ea). -utils / САМ-stats.cpp)
источник