Quantile을 동적으로 모니터링하는 알고리즘


24

일부 데이터의 Quantile을 추정하고 싶습니다. 데이터가 너무 커서 메모리에 수용 할 수 없습니다. 그리고 데이터는 정적 인 것이 아니며 새로운 데이터가 계속 나오고 있습니다. 누구든지 매우 제한된 메모리 및 계산으로 지금까지 관찰 된 데이터의 Quantile을 모니터링하는 알고리즘을 알고 있습니까? 내가 찾을 수 P2 알고리즘 유용하지만, 매우 꼬리 무거운 분산되어 내 데이터, 아주 잘 작동하지 않습니다.


중간 값 추정의 맥락에서 일부 아이디어는 stats.stackexchange.com/q/346/919 의 스레드를 참조하십시오 .
whuber

3
이 질문은 math.SE에 게시 되어 있습니다.
추기경

답변:


16

P2 알고리즘은 좋은 발견입니다. 그것은 Quantile의 몇 가지 추정을하고, 주기적으로 갱신하고, 2 차 (입방이 아닌 선형) 보간법을 사용하여 Quantile을 추정함으로써 작동합니다. 저자들은 2 차 보간법이 선형 보간법보다 꼬리에서 더 잘 작동하며 입방체가 너무 까다 롭고 어려워 질 것이라고 주장합니다.

"헤비 테일 (heavy-tailed)"데이터에 대해이 방법이 어떻게 실패하는지 정확하게 설명하지는 않지만 쉽게 추측 할 수 있습니다. 많은 양의 데이터가 수집 될 때까지 헤비 테일 분포에 대한 극단적 인 Quantile의 추정치는 불안정합니다. 그러나 모든 데이터를 저장하더라도 문제가 될 것이므로 기적을 기대하지 마십시오!

어쨌든 보조 마커를 설정하지 말고 x 6 이라고 부르십시오.이 범위에서 Quantile이 놓여 있고 x 0x 6 사이에있는 모든 데이터를 저장하는 것이 확실 합니까? 버퍼가 채워지면 항상 x 0x 6을 유지하면서 이러한 마커를 업데이트해야합니다 . 이를 수행하는 간단한 알고리즘은 (a) Quantile의 현재 P2 추정치 및 (b) x 0 보다 작은 데이터 수와 x 6 보다 큰 데이터 수의 저장된 개수의 조합으로 구성 할 수 있습니다.x0x6x0x6x0x6x0x6. 이러한 방식으로 확실하게 전체 데이터 세트를 항상 사용할 수있는 것처럼 Quantile을 추정 할 수 있지만 상대적으로 작은 버퍼 만 있으면됩니다.

구체적으로, n 개의 데이터 값 x 1 , x 2 , , x n 의 시퀀스에 대한 부분 정보를 유지하기 위해 데이터 구조 를 제안하고 있습니다 . 여기서 y 는 연결리스트입니다(k,y,n)nx1,x2,,xny

y=(x[k+1](n)x[k+2](n)x[k+m](n)).

이 표기법에서 는 지금까지 읽은 n x 값 중 가장 작은 i 번째 값을 나타냅니다 . m 은 상수, 버퍼 y 의 크기입니다 .x[i](n)ithn xmy

알고리즘은 처음으로 발견 된 m 개의 데이터 값으로 를 채우고 가장 작은 것부터 가장 큰 것까지 정렬 된 순서로 배치하는 것으로 시작합니다. q 를 추정 할 Quantile 이라고하자 . 예를 들어, q = 0.99. x n + 1 을 읽으면 가능한 세 가지 동작이 있습니다.ymqqxn+1

  • 만약 , 증분 K .xn+1<x[k+1](n)k

  • 경우 , 아무것도하지 않는다.xn+1>x[k+m](n)

  • 그렇지 않으면, x n + 1y에 삽입하십시오 .xn+1y

어쨌든 증가시킵니다 .n

삽입 절차 둔다 Y 정렬 순서는 다음의 극단 값 중 하나를 제거 Y :xn+1yy

  • 만약 를 제거한 후 , X ( N ) [ K + 1 ] 에서 , Y 및 증분 K ;k+m/2<nqx[k+1](n)yk

  • x[k+m](n)y

mnx[qn](n)x[qn](n)ymNk/n(k+m)/nq

사용하여 최대 100,000 개의 값으로 테스트m=2Nq=.5x[qn](n)N=1012O(log(N))O(log(N))O(1)O(N)O(N+Nlog(N))=O(N)O(N)


이것은 P2 알고리즘의 확장 된 작업입니다. [링크] sim.sagepub.com/content/49/4/159.abstract . 스토리지는 여전히 내 응용 프로그램에 비해 너무 많아서 총 10K RAM의 작은 센서에서 실행됩니다. Quantile 추정에만 최대 수백 바이트를 소비 할 수 있습니다.
sinoTrinity

@ whuber 실제로 확장 P2를 구현하고 균일하고 지수와 같은 다양한 분포에서 생성 된 샘플로 테스트하여 훌륭하게 작동합니다. 그러나 분포를 알 수없는 응용 프로그램의 데이터에 대해 적용하면 때로는 수렴하지 못하고 최대 300 %의 상대 오류 (abs (estimation-actual) / actual)를 생성합니다.
sinoTrinity

2
Fq^qF(q^)F(q)1/n

네 말이 맞아 방금 상대 오류가 300 %까지 언급 된 경우 F (qˆ) 및 F (q)를 측정했습니다. q가 0.7 인 경우 qˆ는 거의 0.7이므로 무시할 수있는 오류가 발생합니다. 그러나 q가 0.9 인 경우 q는 약 0.95 인 것으로 보인다. 그것이 내가 최대 300 %의 큰 오류를 갖는 이유라고 생각합니다. 왜 0.9가 아닌 0.95인지 아십니까? BTW, 여기에 그림을 게시 할 수 있습니까? 어떻게 수학 공식을 게시 할 수 있습니까?
sinoTrinity

2
@ whuber 내 구현이 확장 P2를 준수한다고 확신합니다. 0.8, 0.85, 0.9, 0.95 Quantile을 동시에 추정하면 0.9는 여전히 0.95 이상으로갑니다. 그러나 0.8, 0.85, 0.9, 0.95 및 1.0 Quantile이 동시에 추적되는 경우 0.9는 0.9에 매우 가깝습니다 .
sinoTrinity

5

O(N)

0p/2p(1+p)/21

250p/12p11/12pp+(1p)/12p+11(1p)/1210pp122 p/2(1+cos(2i1)π22)p+(1p)/2(1+cos(2i1)π22)p01

당신이 이것을 추구하기로 결정한다면, 나는 (그리고 아마도이 사이트의 다른 사람들도) 그것이 작동하는지 알고 싶어 할 것입니다 ...


+1 OP의 제약 조건을 고려할 때 이것이 좋은 아이디어라고 생각합니다. 기대할 수있는 것은 모두 근사치이므로 트릭은 좁고 원하는 Quantile을 포함 할 가능성이 높은 빈을 선택하는 것입니다.
whuber



2

Quantile 회귀 분석을 살펴 보겠습니다. 이를 사용하여보고자하는 Quantile의 파라 메트릭 추정값을 결정할 수 있습니다. 그것은 정규성에 대한 가정을하지 않으므로, 이분산성을 잘 처리하고 롤링 윈도우 단위로 사용될 수 있습니다. 기본적으로 L1-Norm이 처벌 된 회귀이므로 수치 적으로 너무 집중적이지 않으며 완전한 기능을 갖춘 R, SAS 및 SPSS 패키지와 몇 가지 matlab 구현이 있습니다. 자세한 내용 은 기본R 패키지 위키입니다.

편집 :

수학 스택 교환 교차점을 확인하십시오. 어떤 사람은 기본적으로 롤링 주문 통계 창을 사용하여 Quantile을 추정하는 매우 간단한 아이디어를 제시하는 몇 가지 논문을 배치했습니다. 말 그대로해야 할 일은 가장 작은 값에서 가장 큰 값으로 값을 정렬하고 원하는 Quantile을 선택한 다음 해당 Quantile 내에서 가장 높은 값을 선택하는 것입니다. 실제 현재 상태를 더 잘 나타내고 있다고 생각되면 가장 최근의 관측치에 더 많은 가중치를 부여 할 수 있습니다. 이것은 아마도 대략적인 추정치를 줄 것이지만, 수행하기가 매우 간단하며 양이 많은 양력 운동을 거칠 필요가 없습니다. 그냥 생각이야


1

온라인으로 Quantile을 추정 (추적) 할 수 있습니다 (Quantle Regression의 매개 변수에도 동일하게 적용됨). 본질적으로 이것은 Quantile-Regression (인터셉트 만 포함 된 모델로 표현 된 사 분위수)을 정의하는 체크-로스 함수에서 확률 적 그라디언트 하강으로 요약됩니다.

Bell Labs 논문 "대량 추적을위한 증분 Quantile 추정"( ftp://ftp.cse.buffalo.edu/users/azhang/disc/disc01/cd1/out/papers/kdd/p516-chen.pdf )을 참조하십시오.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.