HyperLogLog es un algoritmo para el problema de conteo de elementos distintos , que aproxima el número de elementos distintos en un multiconjunto . [ 1 ] Calcular la cardinalidad exacta de los elementos distintos de un multiconjunto requiere una cantidad de memoria proporcional a la cardinalidad, lo cual es impracticable para conjuntos de datos muy grandes. Los estimadores de cardinalidad probabilísticos, como el algoritmo HyperLogLog, utilizan mucha menos memoria, pero solo pueden aproximar la cardinalidad. El algoritmo HyperLogLog puede estimar cardinalidades > 10 9 con una precisión típica (error estándar) del 2%, utilizando 1,5 kB de memoria. [ 1 ] HyperLogLog es una extensión del algoritmo LogLog anterior, [ 2 ] que a su vez deriva del algoritmo Flajolet-Martin de 1984. [ 3 ]
Terminología
En el artículo original de Flajolet et al. [ 1 ] y en la literatura relacionada sobre el problema de conteo de elementos distintos , el término "cardinalidad" se utiliza para referirse al número de elementos distintos en un flujo de datos con elementos repetidos. Sin embargo, en la teoría de multiconjuntos , el término se refiere a la suma de las multiplicidades de cada miembro de un multiconjunto. Este artículo opta por utilizar la definición de Flajolet para mantener la coherencia con las fuentes.
Algoritmo
La base del algoritmo HyperLogLog es la observación de que la cardinalidad de un multiconjunto de números aleatorios distribuidos uniformemente puede estimarse calculando el número máximo de ceros iniciales en la representación binaria de cada número del conjunto. Si el número máximo de ceros iniciales observado es n , una estimación para el número de elementos distintos en el conjunto es 2n . [ 1 ]
En el algoritmo HyperLogLog, se aplica una función hash a cada elemento del multiconjunto original para obtener un multiconjunto de números aleatorios distribuidos uniformemente con la misma cardinalidad que el multiconjunto original. La cardinalidad de este conjunto distribuido aleatoriamente se puede estimar utilizando el algoritmo descrito anteriormente.
La estimación simple de cardinalidad obtenida mediante el algoritmo anterior tiene la desventaja de una gran varianza . En el algoritmo HyperLogLog, la varianza se minimiza dividiendo el multiconjunto en numerosos subconjuntos, calculando el número máximo de ceros iniciales en los números de cada uno de estos subconjuntos y utilizando una media armónica para combinar estas estimaciones de cada subconjunto en una estimación de la cardinalidad del conjunto completo. [ 4 ]
Operaciones
El HyperLogLog tiene tres operaciones principales: agregar para añadir un nuevo elemento al conjunto, contar para obtener la cardinalidad del conjunto y fusionar para obtener la unión de dos conjuntos. Algunas operaciones derivadas se pueden calcular utilizando el principio de inclusión-exclusión , como la cardinalidad de la intersección o la cardinalidad de la diferencia entre dos HyperLogLog combinando las operaciones de fusión y conteo.
Los datos del HyperLogLog se almacenan en una matriz M de m contadores (o "registros") que se inicializan a 0. La matriz M inicializada a partir de un multiconjunto S se denomina boceto HyperLogLog de S.
Agregar
La operación de suma consiste en calcular el hash de los datos de entrada v con una función hash h , obteniendo los primeros b bits (donde b es), y sumándoles 1 para obtener la dirección del registro a modificar (suponiendo una indexación basada en 1). Con los bits restantes como w , calculeque devuelve la posición del 1 más a la izquierda, donde la posición más a la izquierda es 1 (en otras palabras: número de ceros iniciales más 1). El nuevo valor del registro será el máximo entre el valor actual del registro y.
Contar
El algoritmo de conteo consiste en calcular la media armónica de los m registros y usar una constante para obtener una estimación.del recuento:
La intuición es que n es la cardinalidad desconocida de M , cada subconjuntotendráelementos. Entonces debería estar cerca de. La media armónica de 2 a estas cantidades esque debería estar cerca. De este modo,debería ser n aproximadamente.
Finalmente, la constantese introduce para corregir un sesgo multiplicativo sistemático presente endebido a colisiones de hash.
Consideraciones prácticas
La constanteno es sencillo de calcular y se puede aproximar con la fórmula [ 1 ].
Sin embargo, la técnica HyperLogLog está sesgada hacia cardinalidades pequeñas por debajo de un umbral deEl artículo original propone utilizar un algoritmo diferente para cardinalidades pequeñas conocido como Conteo Lineal. [ 5 ] En el caso de que la estimación proporcionada anteriormente sea menor que el umbralSe puede utilizar el cálculo alternativo:
- Dejarsea el recuento de registros igual a 0.
- Si, utilice el estimador HyperLogLog estándararriba.
- De lo contrario, utilice el conteo lineal:
Además, para cardinalidades muy grandes que se aproximan al límite del tamaño de los registros ((para registros de 32 bits), la cardinalidad se puede estimar con:
Con las correcciones anteriores para los límites inferior y superior, el error se puede estimar como.
Unir
La operación de fusión para dos HLL () consiste en obtener el máximo para cada par de registros
Complejidad
Para analizar la complejidad, el flujo de datosSe utiliza el modelo [ 6 ] , que analiza el espacio necesario para obtener unaproximación con una probabilidad de éxito fija. El error relativo de HLL esy lo necesitaespacio, donde n es la cardinalidad del conjunto y m es el número de registros (normalmente de menos de un byte).
La operación de suma depende del tamaño de la salida de la función hash. Como este tamaño es fijo, podemos considerar que el tiempo de ejecución de la operación de suma es.
Las operaciones de conteo y fusión dependen del número de registros m y tienen un costo teórico de. En algunas implementaciones ( Redis ) [ 7 ] el número de registros es fijo y el costo se consideraen la documentación.
HLL++
El algoritmo HyperLogLog++ propone varias mejoras en el algoritmo HyperLogLog para reducir los requisitos de memoria y aumentar la precisión en algunos rangos de cardinalidades: [ 6 ]
- En lugar de la función hash de 32 bits empleada en el artículo original, se utiliza una función hash de 64 bits. Esto reduce las colisiones de hash para cardinalidades grandes, lo que permite eliminar la corrección de rango amplio.
- Se observa cierto sesgo para cardinalidades pequeñas al cambiar del conteo lineal al conteo HLL. Se propone una corrección empírica del sesgo para mitigar el problema.
- Se propone una representación dispersa de los registros para reducir los requisitos de memoria para cardinalidades pequeñas, que posteriormente se puede transformar en una representación densa si la cardinalidad aumenta.
Transmisión de HLL
Cuando los datos llegan en un único flujo, el estimador de probabilidad inversa histórica o de martingala [ 8 ] [ 9 ] mejora significativamente la precisión del esquema HLL y utiliza un 36 % menos de memoria para alcanzar un nivel de error determinado. Este estimador es demostrablemente óptimo para cualquier esquema de conteo distinto aproximado insensible a duplicados en un único flujo.
El escenario de flujo único también genera variantes en la construcción del boceto HLL. HLL-TailCut+ utiliza un 45 % menos de memoria que el boceto HLL original, pero a costa de depender del orden de inserción de datos y no poder fusionar bocetos. [ 10 ]
Lecturas adicionales
- "Nuevos algoritmos de estimación de cardinalidad para bocetos HyperLogLog" (PDF) . Consultado el 29 de octubre de 2016 .
Referencias
- 1 2 3 4 5 Flajolet, Philippe; Fusy, Éric; Gandouet, Olivier; Meunier, Frédéric (2007). "Hyperloglog: Análisis de un algoritmo de estimación de cardinalidad casi óptimo" (PDF) . Actas de Matemáticas Discretas e Informática Teórica . AH . Nancy, Francia : 137–156 . CiteSeerX 10.1.1.76.4286 . Consultado el 11 de diciembre de 2016 .
- ↑ Durand, M.; Flajolet, P. (2003). "LogLog counting of large cardinalities." (PDF) . En G. Di Battista y U. Zwick (eds.). Lecture Notes in Computer Science . Simposio Europeo Anual sobre Algoritmos (ESA03). Vol. 2832. Springer. pp. 605–617 .
- ↑ Flajolet, Philippe; Martin, G. Nigel (1985). "Algoritmos de conteo probabilístico para aplicaciones de bases de datos" (PDF) . Journal of Computer and System Sciences . 31 (2): 182– 209. doi : 10.1016/0022-0000(85)90041-8 .
- ↑ S Heule; M Nunkesser; A Hall (2013). "HyperLogLog en la práctica: ingeniería algorítmica de un algoritmo de estimación de cardinalidad de última generación" (PDF) . sec. 4.
- ↑ Whang, Kyu-Young; Vander-Zanden, Brad T; Taylor, Howard M (1990). "Un algoritmo de conteo probabilístico de tiempo lineal para aplicaciones de bases de datos" . ACM Transactions on Database Systems . 15 (2): 208– 229. doi : 10.1145/78922.78925 . S2CID 2939101 .
- 1 2 "HyperLogLog en la práctica: ingeniería algorítmica de un algoritmo de estimación de cardinalidad de última generación" . Recuperado el 19 de abril de 2014 .
- ↑ "PFCOUNT – Redis" .
- ↑ Cohen, E. (marzo de 2015). "Esbozos de todas las distancias, revisados: estimadores HIP para el análisis de grafos masivos". IEEE Transactions on Knowledge and Data Engineering . 27 (9): 2320– 2334. arXiv : 1306.3284 . doi : 10.1109/TKDE.2015.2411606 .
- ↑ Ting, D. (agosto de 2014). "Recuento aproximado en tiempo real de elementos distintos" . Actas de la 20.ª conferencia internacional ACM SIGKDD sobre descubrimiento de conocimiento y minería de datos . págs. 442–451 . doi : 10.1145/2623330.2623669 . ISBN 978-1-4503-2956-9. S2CID 13179875 .
- ↑ Xiao, Q.; Zhou, Y.; Chen, S. (mayo de 2017). "Mejor con menos bits: Mejora del rendimiento de la estimación de cardinalidad de grandes flujos de datos". IEEE INFOCOM 2017 - Conferencia IEEE sobre Comunicaciones Informáticas . págs. 1–9 . doi : 10.1109/INFOCOM.2017.8057088 . ISBN 978-1-5090-5336-0. S2CID 27159273 .
- Estructuras de datos probabilísticas
- Algoritmos estadísticos