Я хочу оценить квантиль некоторых данных. Данные настолько огромны, что их невозможно разместить в памяти. И данные не являются статичными, новые данные продолжают поступать. Кто-нибудь знает какой-либо алгоритм для мониторинга квантилей данных, наблюдаемых до сих пор с очень ограниченными памятью и вычислениями? Я считаю, что алгоритм P2 полезен, но он не очень хорошо работает для моих данных, которые чрезвычайно сильно распределены.
algorithms
quantiles
sinoTrinity
источник
источник
Ответы:
Алгоритм P2 - хорошая находка. Он работает, делая несколько оценок квантиля, периодически обновляя их и используя квадратичную (не линейную, не кубическую) интерполяцию для оценки квантиля. Авторы утверждают, что квадратичная интерполяция работает лучше в хвостах, чем линейная интерполяция, а кубическая будет слишком суетливой и сложной.
Вы точно не заявляете, как этот подход не подходит для ваших данных с «тяжелыми хвостами», но легко догадаться: оценки экстремальных квантилей для распределений с «тяжелыми хвостами» будут нестабильными, пока не будет собран большой объем данных. Но это будет проблемой (в меньшей степени), даже если вы будете хранить все данные, так что не ждите чудес!
В любом случае, почему бы не установить вспомогательные маркеры - давайте назовем их и x 6 - в которых, как вы уверены, будет лежать квантиль, и хранить все данные, которые лежат между x 0 и x 6 ? Когда ваш буфер заполнится, вам нужно будет обновить эти маркеры, всегда сохраняя x 0 ≤ x 6 . Простой алгоритм для этого может быть разработан из комбинации (а) текущей оценки P2 квантиля и (б) сохраненных подсчетов количества данных, меньшего, чем х 0, и количества данных, превышающего х 6.x0 x6 x0 x6 x0≤x6 x0 x6 , Таким образом, вы можете с высокой степенью достоверности оценить квантиль точно так же, как если бы у вас всегда был доступен весь набор данных, но вам нужен только относительно небольшой буфер.
В частности, я предлагаю структуру данных для хранения частичной информации о последовательности из n значений данных x 1 , x 2 , … , x n . Здесь у - это связанный список(k,y,n) n x1,x2,…,xn y
В этом обозначении обозначает i- е наименьшее из n x значений, прочитанных до сих пор. m - константа, размер буфера y .x(n)[i] ith n x m Y
Алгоритм начинается с заполнения первыми m найденными значениями данных и размещения их в отсортированном порядке, от наименьшего к наибольшему. Пусть q - квантиль, которая будет оценена; например, q = 0,99. После прочтения x n + 1 возможны три действия:Y м Q Q Иксn + 1
Если , увеличить k .Иксn + 1< х( н )[ k + 1 ] К
Если , ничего не делать.Иксn + 1> х( н )[ к + м ]
В противном случае вставьте в y .Иксn + 1 Y
В любом случае, увеличьте .N
Процедура вставки помещает в y в отсортированном порядке, а затем удаляет одно из крайних значений в y :Иксn + 1 Y Y
Если , то удалить x ( n ) [ k + 1 ] из y и увеличить k ;k + m / 2 < n q Икс( н )[ k + 1 ] Y К
В противном случае удалите из y .Икс( н )[ к + м ] Y
При условии, что достаточно велико, эта процедура с высокой вероятностью будет заключать в скобки истинный квантиль распределения. На любом этапе n его можно оценить обычным способом в терминах x ( n ) [ ⌊ q n ⌋ ] и x ( n ) [ ⌈ q n ⌉ ] , которые, вероятно, будут лежать в y . (Я полагаю, что m должен масштабироваться как квадратный корень из максимального количества данных ( Nм N Икс( н )[ ⌊ qn ⌋] Икс( н )[ ⌈ qn ⌉] Y м N ), но я не провел строгий анализ, чтобы доказать это.) Во всяком случае, алгоритм определит, был ли он успешным (сравнивая и ( k + m ) / n с q ).к / н ( к +m)/n Q
Тестирование до 100 000 значений с использованием иq=.5(самый сложный случай) указывают, что этот алгоритм имеет 99,5% успеха в получении правильного значения x ( n ) [ n q n ⌋ ] . Для потока сN=10 12 значений это потребовало бы буфера только из двух миллионов (но три или четыре миллиона были бы лучшим выбором). Использование отсортированного двусвязного списка для буфера требуетO(log( √м = 2N−−√ Q= .5 Икс( н )[ ⌊ qn ⌋] N= 1012 =O(log(N))усилия при определении и удалении max или min являютсяO(1)операциями. Относительно дорогая вставка обычно должна быть сделана толькоO( √O ( журнал( N--√) ) O(log(N)) O(1) раз. Таким образом, вычислительные затраты этого алгоритма составляютO(N+ √O(N−−√) во времени иO( √O ( N+ N--√журнал( N) ) = O ( N) в хранилище.O ( N--√)
источник
Я думаю, что предложение Whuber велико, и я бы попробовал это в первую очередь. Тем не менее, если вы обнаружите, что вы действительно не можете разместить хранилище или оно не работает по какой-то другой причине, вот идея для другого обобщения P2. Это не так подробно, как то, что предлагает whuber - больше похоже на исследовательскую идею, а не на решение.O(N−−√)
Вместо отслеживания квантилей в , p / 2 , p , ( 1 + p ) / 2 и 1 , как предполагает оригинальный алгоритм P2, вы можете просто отслеживать больше квантилей (но все же постоянное число). Похоже, что алгоритм учитывает это очень просто; все, что вам нужно сделать, это вычислить правильное «ведро» для входящих точек и правильный способ обновления квантилей (квадратично, используя соседние числа).0 p/2 p (1+p)/2 1
Скажем, вы отслеживаете очков. Вы можете попробовать отслеживать квантиль на 0 , р / 12 , ... , р ⋅ 11 / 12 , р , р + ( 1 - р ) / 12 , ... , р + 11 ⋅ ( 1 - р ) / 12 , 1 (сбор точки равноудалены между 0 и р , и между р25 0 p/12 … p⋅11/12 p p+(1−p)/12 … p+11⋅(1−p)/12 1 0 p p и ) или даже используя 22 чебышевских узла вида p / 2 ⋅ ( 1 + cos ( 2 i - 1 ) π1 22 иp+(1-p)/2⋅(1+cos(2i-1)πp/2⋅(1+cos(2i−1)π22) . Еслиpблизко к0или1, вы можете попытаться разместить меньше точек на той стороне, где меньше вероятность, а на другой стороне больше.p+(1−p)/2⋅(1+cos(2i−1)π22) p 0 1
Если вы решите заняться этим, мне (и, возможно, другим на этом сайте) было бы интересно узнать, работает ли это ...
источник
Press et al., Числовые рецепты 8.5.2 «Однопроходная оценка произвольных квантилей» с. 435, дать класс C ++ IQAgent, который обновляет кусочно-линейный приближенный cdf.
источник
Это может быть адаптировано из алгоритмов, которые определяют медиану онлайн-набора данных. Для получения дополнительной информации см. Этот пост stackoverflow - /programming/1387497/find-median-value-from-a-growing-set
источник
Я бы посмотрел на квантильную регрессию. Вы можете использовать его для определения параметрической оценки того квантиля, на который вы хотите посмотреть. Он не делает никаких предположений относительно нормальности, поэтому он довольно хорошо справляется с гетероскедастичностью и может использоваться на основе скользящего окна. По сути, это регрессия, оштрафованная на L1-норму, поэтому она не слишком интенсивна по численности, и есть довольно полнофункциональные пакеты R, SAS и SPSS плюс несколько реализаций matlab. Вот основной и R пакет вики для получения дополнительной информации.
Отредактировано:
Проверьте сшивку обмена математическим стеком: кто-то написал пару статей, в которых, по сути, изложена очень простая идея простого использования скользящего окна статистики заказов для оценки квантилей. Буквально все, что вам нужно сделать, это отсортировать значения от наименьшего к наибольшему, выбрать, какой квантиль вы хотите, и выбрать самое высокое значение в этом квантиле. Очевидно, что вы можете придать больший вес последним наблюдениям, если считаете, что они в большей степени отражают текущие условия. Это, вероятно, даст приблизительные оценки, но это довольно просто сделать, и вам не нужно проходить движения количественного тяжелого подъема. Просто мысль.
источник
Можно оценивать (и отслеживать) квантили в режиме онлайн (то же самое относится к параметрам квантильной регрессии). По сути, это сводится к стохастическому градиентному спуску по функции чековых потерь, которая определяет квантильную регрессию (квантили представлены моделью, содержащей только перехват), например, обновляя неизвестные параметры по мере поступления наблюдений.
См. Статью Bell Labs «Инкрементная квантильная оценка для массового отслеживания» ( ftp://ftp.cse.buffalo.edu/users/azhang/disc/disc01/cd1/out/papers/kdd/p516-chen.pdf ).
источник
Другим важным алгоритмом является М. Гринвальд и С. Ханна, 2004 г. - Экономически эффективные онлайн-вычисления квантильных сводок.
источник