¿Cuál es la mejor manera de estimar computacionalmente la cardinalidad de conjuntos muy grandes?

Hasta hace poco, pensaba que los filtros de floración eran una forma bastante inteligente de contar elementos distintos en un conjunto.

Pero un comentario reciente del usuario de Quora me señaló en la dirección del conteo probabilístico , que estima la cardinalidad mediante el hashing de elementos a un vector de bits, donde la probabilidad de hashing a un bit disminuye exponencialmente a medida que aumenta la importancia del bit. La implicación es que los conjuntos más grandes incluyen elementos “más raros”, y esta relación puede explotarse de manera muy similar al problema del tanque alemán (http://en.wikipedia.org/wiki/Ger…). El documento que Mateusz señaló está aquí:

http://algo.inria.fr/flajolet/Pu…

Así que pensé que esto era bastante bueno durante aproximadamente un día más o menos, hasta que Norman Casagrande señaló un medio aún más efectivo de estimación de cardinalidad para tasas de error muy bajas. Los científicos de Ask.com compararon un montón de métodos de estimación diferentes, tanto teórica como prácticamente (en un gran corpus de datos de búsqueda del mundo real) y descubrieron que el conteo lineal era aún más efectivo. El recuento lineal también divide elementos a bits en un vector de bits, pero todos los valores tienen la misma probabilidad uniforme, y la cardinalidad se estima al observar la probabilidad de que un bit en el vector de bits esté vacío, esencialmente la relación de cero bits en el vector de bits. El papel está aquí:

http://www.edbt.org/Proceedings/…

Entonces, al observar las fechas de publicación de esos dos documentos, de acuerdo con mi propia estimación de cardinalidad interna, ¡probablemente haya una técnica aún mejor ahora! También me interesaría cualquier buena implementación de código abierto de las técnicas anteriores.

Solo agrega la historia de implementaciones a la respuesta de Erik como mencionó al final de su respuesta
Usando una memoria auxiliar de m unidades (típicamente, “bytes cortos”), el algoritmo HYPERLOGLOG realiza un solo paso sobre los datos y produce una estimación
de la cardinalidad de modo que la precisión relativa (el error estándar) es típicamente sobre [matemática] \ frac {1.04} {\ sqrt {m}} [/ matemática]. Esto mejora el mejor estimador de cardinalidad conocido anteriormente, LOGLOG, cuya precisión puede igualarse al consumir solo el 64% de la memoria original. Por ejemplo, el nuevo algoritmo permite estimar cardinalidades mucho más allá de [matemáticas] 10 ^ 9 [/ matemáticas] con una precisión típica del 2% mientras se usa una memoria de solo 1.5 kilobytes. El algoritmo se paraleliza de manera óptima y se adapta al modo de ventana deslizante.

HyperLogLog aprovecha la distribución aleatoria de bits de las funciones de hash para estimar cuántas cosas habría necesitado ver para experimentar un fenómeno específico. Fuente y ejemplos a continuación [1]

Es bien sabido que la cardinalidad de un gran conjunto de datos puede calcularse con precisión

si la complejidad del almacenamiento es proporcional al número de elementos en el conjunto de datos.

Requisitos que aborda:
Dada la escala y la complejidad de algunos conjuntos de datos druidas (con recuentos de registros rutinarios en miles de millones), el conjunto de datos a menudo es demasiado grande para mantenerse en la memoria central. Además, dado que los conjuntos de datos druidas pueden consultarse arbitrariamente con granularidades de tiempo y conjuntos de filtros variables, necesitábamos la capacidad de estimar cardinalidades de dimensión sobre la marcha a través de múltiples cubos granulares.

[1]
Rápido, barato y correcto al 98%: estimación de cardinalidad para Big Data
http://algo.inria.fr/flajolet/Pu

He trabajado bastante en la estimación de la cardinalidad para mi último trabajo y mi empleador fue lo suficientemente bueno como para lanzar la biblioteca de Java que escribí como un proyecto de código abierto. Echa un vistazo a: https://github.com/oby1/mainstream .

Actualmente incluye implementaciones de conteo lineal, conteo LogLog y conteo adaptativo, junto con fábricas fáciles de usar que eligen el algoritmo correcto según la cardinalidad esperada de su flujo de datos.

Que yo sepa, es la única implementación de código abierto de varios de los algoritmos de estimación de flujo de datos en línea que se prueba a fondo y se usa en vivo en aplicaciones de producción a gran escala.

More Interesting

¿Cuáles son buenos temas para una tesis de informática?

¿Cuáles son algunas de las ventajas de usar modelos de proceso gaussianos frente a redes neuronales?

He oído afirmar que la financiación de la investigación en informática solo está disponible para la investigación aplicada ahora. ¿Es este el caso, y si no, hay ejemplos de áreas de investigación "pura" que se están financiando?

¿Cuáles son algunos documentos que demuestran el uso de la teoría de la representación en informática?

¿Qué tipo de técnicas de visión por computadora que aún no se exploran para la conducción autónoma?

¿Representando materiales de mundos 3D utilizando datos químicos?

¿Qué es la complejidad del tiempo polinomial?

¿Cuál es la mejor manera de estimar computacionalmente la cardinalidad de conjuntos muy grandes?

Cómo realizar una nueva investigación en el campo de VLSI y electrónica integrada y publicarla en revistas internacionales

¿Cuál es la diferencia entre computer graphics y computer vision?

¿Cuáles son algunos aspectos de investigación basados ​​en aplicaciones de big data?

¿Cómo es el Vietnam Journal of Computer Science en términos de reputación, tasa de aceptación y calidad de los documentos aceptados?

¿Qué temas de informática debo entender bien?

¿Cuáles son algunos documentos notables en la investigación de lenguajes de programación?

¿Cuáles son las principales diferencias entre una idea de investigación y una idea producible en informática?