Алгоритм динамического мониторинга квантилей


24

Я хочу оценить квантиль некоторых данных. Данные настолько огромны, что их невозможно разместить в памяти. И данные не являются статичными, новые данные продолжают поступать. Кто-нибудь знает какой-либо алгоритм для мониторинга квантилей данных, наблюдаемых до сих пор с очень ограниченными памятью и вычислениями? Я считаю, что алгоритм P2 полезен, но он не очень хорошо работает для моих данных, которые чрезвычайно сильно распределены.


Некоторые идеи (в контексте оценки медианы) см. В теме по адресу stats.stackexchange.com/q/346/919 .
whuber

3
Этот вопрос ставится по математике.
кардинал

Ответы:


16

Алгоритм P2 - хорошая находка. Он работает, делая несколько оценок квантиля, периодически обновляя их и используя квадратичную (не линейную, не кубическую) интерполяцию для оценки квантиля. Авторы утверждают, что квадратичная интерполяция работает лучше в хвостах, чем линейная интерполяция, а кубическая будет слишком суетливой и сложной.

Вы точно не заявляете, как этот подход не подходит для ваших данных с «тяжелыми хвостами», но легко догадаться: оценки экстремальных квантилей для распределений с «тяжелыми хвостами» будут нестабильными, пока не будет собран большой объем данных. Но это будет проблемой (в меньшей степени), даже если вы будете хранить все данные, так что не ждите чудес!

В любом случае, почему бы не установить вспомогательные маркеры - давайте назовем их и x 6 - в которых, как вы уверены, будет лежать квантиль, и хранить все данные, которые лежат между x 0 и x 6 ? Когда ваш буфер заполнится, вам нужно будет обновить эти маркеры, всегда сохраняя x 0x 6 . Простой алгоритм для этого может быть разработан из комбинации (а) текущей оценки P2 квантиля и (б) сохраненных подсчетов количества данных, меньшего, чем х 0, и количества данных, превышающего х 6.Икс0Икс6Икс0Икс6Икс0Икс6Икс0Икс6, Таким образом, вы можете с высокой степенью достоверности оценить квантиль точно так же, как если бы у вас всегда был доступен весь набор данных, но вам нужен только относительно небольшой буфер.

В частности, я предлагаю структуру данных для хранения частичной информации о последовательности из n значений данных x 1 , x 2 , , x n . Здесь у - это связанный список(К,Y,N)NИкс1,Икс2,...,ИксNY

Yзнак равно(Икс[К+1](N)Икс[К+2](N)Икс[К+м](N)),

В этом обозначении обозначает i- е наименьшее из n x значений, прочитанных до сих пор. m - константа, размер буфера y .Икс[я](N)ягоN ИксмY

Алгоритм начинается с заполнения первыми m найденными значениями данных и размещения их в отсортированном порядке, от наименьшего к наибольшему. Пусть q - квантиль, которая будет оценена; например, q = 0,99. После прочтения x n + 1 возможны три действия:YмQQИксN+1

  • Если , увеличить k .ИксN+1<Икс[К+1](N)К

  • Если , ничего не делать.ИксN+1>Икс[К+м](N)

  • В противном случае вставьте в y .ИксN+1Y

В любом случае, увеличьте .N

Процедура вставки помещает в y в отсортированном порядке, а затем удаляет одно из крайних значений в y :ИксN+1YY

  • Если , то удалить x ( n ) [ k + 1 ] из y и увеличить k ;К+м/2<NQИкс[К+1](N)YК

  • В противном случае удалите из y .Икс[К+м](N)Y

При условии, что достаточно велико, эта процедура с высокой вероятностью будет заключать в скобки истинный квантиль распределения. На любом этапе n его можно оценить обычным способом в терминах x ( n ) [ q n] и x ( n ) [ q n] , которые, вероятно, будут лежать в y . (Я полагаю, что m должен масштабироваться как квадратный корень из максимального количества данных ( NмNИкс[QN](N)Икс[QN](N)YмN), но я не провел строгий анализ, чтобы доказать это.) Во всяком случае, алгоритм определит, был ли он успешным (сравнивая и ( k + m ) / n с q ).К/N(k+m)/NQ

Тестирование до 100 000 значений с использованием иq=.5(самый сложный случай) указывают, что этот алгоритм имеет 99,5% успеха в получении правильного значения x ( n ) [ n q n] . Для потока сN=10 12 значений это потребовало бы буфера только из двух миллионов (но три или четыре миллиона были бы лучшим выбором). Использование отсортированного двусвязного списка для буфера требуетO(log(m=2Nqзнак равно0,5Икс[QN](N)Nзнак равно1012=O(log(N))усилия при определении и удалении max или min являютсяO(1)операциями. Относительно дорогая вставка обычно должна быть сделана толькоO(О(журнал(N))O(log(N))O(1)раз. Таким образом, вычислительные затраты этого алгоритма составляютO(N+O(N)во времени иO(О(N+Nжурнал(N))знак равноО(N)в хранилище.О(N)


Это расширенная работа алгоритма P2. [ссылка] sim.sagepub.com/content/49/4/159.abstract . Памяти все еще слишком много для моего приложения, которое работает на небольших сенсорах с общей оперативной памятью 10 КБ. Я могу потреблять максимум несколько сотен байтов только для квантильной оценки.
sinoTrinity

@whuber На самом деле я реализую расширенный P2 и тестирую его с помощью сгенерированных образцов из различных распределений, таких как равномерное и экспоненциальное, где он прекрасно работает. Но когда я применяю его к данным из моего приложения, распространение которого неизвестно, иногда оно не сходится и дает относительную ошибку (абс (оценка - факт) / факт) до 300%.
sinoTrinity

2
@sino Качество алгоритма по сравнению с использованием всех данных не должно зависеть от тяжести хвостов. Более справедливый способ измерения ошибки заключается в следующем: пусть будет эмпирическим cdf. Для оценки д о д процентиля, какова разница между F ( д ) и F ( д ) ? Если он порядка 1 / n, у вас все отлично. Другими словами, какой процентиль возвращает алгоритм P2 для ваших данных? FQ^QF(Q^)F(Q)1/N
whuber

Вы правы. Я только что измерил F (qˆ) и F (q) для упомянутого мной случая с относительной погрешностью до 300%. При q 0,7 qˆ почти 0,7, что приводит к незначительной ошибке. Тем не менее, при q 0,9, qˆ составляет около 0,95. Наверное, поэтому у меня огромная ошибка до 300%. Есть идеи, почему 0,95, а не 0,9? Кстати, я могу опубликовать рисунок здесь и как я могу опубликовать математическую формулу, как вы сделали?
sinoTrinity

2
@whuber Я уверен, что моя реализация соответствует расширенному P2. 0,9 все еще идет к 0,95 или даже больше, когда я одновременно оцениваю 0,8, 0,85, 0,9, 0,95 квантилей. Однако 0,9 идет очень близко к 0,9, если отслеживаются квантили 0,8, 0,85, 0,9, 0,95 и 1,0 одновременно.
sinoTrinity

5

Я думаю, что предложение Whuber велико, и я бы попробовал это в первую очередь. Тем не менее, если вы обнаружите, что вы действительно не можете разместить хранилище или оно не работает по какой-то другой причине, вот идея для другого обобщения P2. Это не так подробно, как то, что предлагает whuber - больше похоже на исследовательскую идею, а не на решение.O(N)

Вместо отслеживания квантилей в , p / 2 , p , ( 1 + p ) / 2 и 1 , как предполагает оригинальный алгоритм P2, вы можете просто отслеживать больше квантилей (но все же постоянное число). Похоже, что алгоритм учитывает это очень просто; все, что вам нужно сделать, это вычислить правильное «ведро» для входящих точек и правильный способ обновления квантилей (квадратично, используя соседние числа).0p/2p(1+p)/21

Скажем, вы отслеживаете очков. Вы можете попробовать отслеживать квантиль на 0 , р / 12 , ... , р 11 / 12 , р , р + ( 1 - р ) / 12 , ... , р + 11 ( 1 - р ) / 12 , 1 (сбор точки равноудалены между 0 и р , и между р250p/12p11/12pp+(1p)/12p+11(1p)/1210ppи ) или даже используя 22 чебышевских узла вида p / 2 ( 1 + cos ( 2 i - 1 ) π122 иp+(1-p)/2(1+cos(2i-1)πp/2(1+cos(2i1)π22). Еслиpблизко к0или1, вы можете попытаться разместить меньше точек на той стороне, где меньше вероятность, а на другой стороне больше.p+(1p)/2(1+cos(2i1)π22)p01

Если вы решите заняться этим, мне (и, возможно, другим на этом сайте) было бы интересно узнать, работает ли это ...


+1 Я думаю, что это отличная идея, учитывая ограничения ОП. Все, на что можно надеяться, это приближение, поэтому хитрость заключается в том, чтобы выбрать контейнеры, которые с высокой вероятностью являются узкими и содержат желаемый квантиль.
whuber


2

Это может быть адаптировано из алгоритмов, которые определяют медиану онлайн-набора данных. Для получения дополнительной информации см. Этот пост stackoverflow - /programming/1387497/find-median-value-from-a-growing-set


Вычислительные ресурсы, необходимые для алгоритма, на который вы ссылаетесь, неоправданно велики и не соответствуют требованиям этого вопроса.
whuber

2

Я бы посмотрел на квантильную регрессию. Вы можете использовать его для определения параметрической оценки того квантиля, на который вы хотите посмотреть. Он не делает никаких предположений относительно нормальности, поэтому он довольно хорошо справляется с гетероскедастичностью и может использоваться на основе скользящего окна. По сути, это регрессия, оштрафованная на L1-норму, поэтому она не слишком интенсивна по численности, и есть довольно полнофункциональные пакеты R, SAS и SPSS плюс несколько реализаций matlab. Вот основной и R пакет вики для получения дополнительной информации.

Отредактировано:

Проверьте сшивку обмена математическим стеком: кто-то написал пару статей, в которых, по сути, изложена очень простая идея простого использования скользящего окна статистики заказов для оценки квантилей. Буквально все, что вам нужно сделать, это отсортировать значения от наименьшего к наибольшему, выбрать, какой квантиль вы хотите, и выбрать самое высокое значение в этом квантиле. Очевидно, что вы можете придать больший вес последним наблюдениям, если считаете, что они в большей степени отражают текущие условия. Это, вероятно, даст приблизительные оценки, но это довольно просто сделать, и вам не нужно проходить движения количественного тяжелого подъема. Просто мысль.


1

Можно оценивать (и отслеживать) квантили в режиме онлайн (то же самое относится к параметрам квантильной регрессии). По сути, это сводится к стохастическому градиентному спуску по функции чековых потерь, которая определяет квантильную регрессию (квантили представлены моделью, содержащей только перехват), например, обновляя неизвестные параметры по мере поступления наблюдений.

См. Статью Bell Labs «Инкрементная квантильная оценка для массового отслеживания» ( ftp://ftp.cse.buffalo.edu/users/azhang/disc/disc01/cd1/out/papers/kdd/p516-chen.pdf ).


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.