El algoritmo P2 es un buen hallazgo. Funciona haciendo varias estimaciones del cuantil, actualizándolas periódicamente y usando interpolación cuadrática (no lineal, no cúbica) para estimar el cuantil. Los autores afirman que la interpolación cuadrática funciona mejor en las colas que la interpolación lineal y que la cúbica se volvería demasiado exigente y difícil.
No indica exactamente cómo falla este enfoque para sus datos de "cola pesada", pero es fácil de adivinar: las estimaciones de cuantiles extremos para distribuciones de cola pesada serán inestables hasta que se recopile una gran cantidad de datos. Pero esto va a ser un problema (en menor medida) incluso si tuviera que almacenar todos los datos, ¡así que no espere milagros!
En cualquier caso, ¿por qué no establecer marcadores auxiliares, llamémoslos y x 6, dentro de los cuales está muy seguro de que el cuantil se ubicará y almacenará todos los datos que se encuentran entre x 0 y x 6 ? Cuando se llene el búfer, deberá actualizar estos marcadores, manteniendo siempre x 0 ≤ x 6 . Se puede idear un algoritmo simple para hacer esto a partir de una combinación de (a) la estimación actual P2 del cuantil y (b) los recuentos almacenados del número de datos menor que x 0 y el número de datos mayor que x 6x0x6x0x6x0≤x6x0x6. De esta manera, puede, con gran certeza, estimar el cuantil tan bien como si tuviera todo el conjunto de datos siempre disponible, pero solo necesita un búfer relativamente pequeño.
Específicamente, propongo una estructura de datos para mantener información parcial sobre una secuencia de n valores de datos x 1 , x 2 , ... , x n . Aquí, y es una lista vinculada(k,y,n)nx1,x2,…,xny
y=(x(n)[k+1]≤x(n)[k+2]≤⋯≤x(n)[k+m]).
En esta notación denota el i ésimo más pequeño de los n x valores leído hasta ahora. m es una constante, el tamaño del búfer y .x(n)[i]ithn xmy
El algoritmo comienza rellenando con los primeros m valores de datos encontrados y colocándolos en orden, de menor a mayor. Sea q el cuantil a estimar; por ejemplo, q = 0.99. Al leer x n + 1 hay tres acciones posibles:ymqqxn+1
Si , incremente k .xn+1<x(n)[k+1]k
Si , no haga nada.xn+1>x(n)[k+m]
De lo contrario, inserte en y .xn+1y
En cualquier caso, incremente .n
El procedimiento de inserción coloca en y en orden ordenado y luego elimina uno de los valores extremos en y :xn+1yy
Si , entonces elimine x ( n ) [ k + 1 ] de y e incremente k ;k+m/2<nqx(n)[k+1]yk
De lo contrario, elimine de y .x(n)[k+m]y
Siempre que sea suficientemente grande, este procedimiento incluirá el verdadero cuantil de la distribución con alta probabilidad. En cualquier etapa n se puede estimar de la manera habitual en términos de x ( n ) [ ⌊ q n ⌋ ] y x ( n ) [ ⌈ q n ⌉ ] , que probablemente se encuentre en y . (Creo que m solo tiene que escalar como la raíz cuadrada de la cantidad máxima de datos ( Nmnx(n)[⌊qn⌋]x(n)[⌈qn⌉]ymN), Pero no he llevado a cabo un análisis riguroso para demostrar que.) En cualquier caso, el algoritmo detectará si se ha tenido éxito (mediante la comparación de y ( k + m ) / n a q ).k/n(k+m)/nq
Prueba con hasta 100,000 valores, usando yq=.5(el caso más difícil) indica que este algoritmo tiene una tasa de éxito del 99.5% para obtener el valor correcto de x ( n ) [ ⌊ q n ⌋ ] . Para una secuencia deN=10 12 valores, eso requeriría un búfer de solo dos millones (pero tres o cuatro millones sería una mejor opción). El uso de una lista ordenada doblemente vinculada para el búfer requiereO(log( √m=2N−−√q=.5x(n)[⌊qn⌋]N=1012=O(log(N))esfuerzo al identificar y eliminar el máximo o mínimo sonoperacionesO(1). La inserción relativamente costosa generalmente debe hacerse soloO( √O(log(N−−√))O(log(N))O(1)veces. Por lo tanto, los costos computacionales de este algoritmo sonO(N+ √O(N−−√)en el tiempo yO( √O(N+N−−√log(N))=O(N)en almacenamiento.O(N−−√)