Calcular la población aproximada de un filtro de floración

12

Dado un filtro de floración de tamaño N-bits y K funciones hash, de las cuales se establecen M-bits (donde M <= N) del filtro.

¿Es posible aproximar el número de elementos insertados en el filtro de floración?

Ejemplo simple

He estado reflexionando sobre el siguiente ejemplo, suponiendo un BF de 100 bits y 5 funciones hash donde se establecen 10 bits ...

El mejor de los casos: suponiendo que las funciones hash son realmente perfectas y mapean un bit de forma única para un número X de valores, luego, dado que se han establecido 10 bits, podemos decir que solo se han insertado 2 elementos en el BF

En el peor de los casos: suponiendo que las funciones hash sean malas y se asignen consistentemente al mismo bit (pero únicas entre sí), entonces podemos decir que se han insertado 10 elementos en el BF

El rango parece ser [2,10], donde los valores aproximados en este rango probablemente estén determinados por la probabilidad de filtro de falsos positivos. Estoy atascado en este punto.

Tander Kulip
fuente
44
¿Por qué no mantener un contador del número de elementos insertados? Solo toma unos bits adicionales , si insertó elementos. nO(logn)n
Joe
@ Joe, si bien es una buena idea, arruina una pregunta realmente interesante.
dan_waterworth
Solo notando que con los duplicados, el método de Joe tendrá un pequeño error ya que no siempre podemos decir con certeza al agregar un elemento si ya está presente (y, por lo tanto, deberíamos aumentar el recuento o no).
usul

Respuestas:

5

Si. De Wikipedia :

Si ha insertado elementos en un filtro de tamaño usando funciones hash, la probabilidad de que cierto bit sea 0 esn kink

z=(11n)ki

Puede medir esta probabilidad como la proporción de 0 bits en su filtro. Resolver para dai

i=ln(z)kln(11n)

Lo he usado en la práctica, y siempre que su filtro no exceda su capacidad, el error generalmente es inferior al 0.1% para filtros de hasta millones de bits. A medida que el filtro excede su capacidad, el error, por supuesto, aumenta.

Jay Hacker
fuente
3

Si supone que para cada función hash para cada objeto, un bit se establece de manera uniforme al azar, y tiene un recuento del número de bits que se han establecido, debería poder vincular la probabilidad de que el número de objetos insertados fuera dentro de un cierto rango, tal vez usando una formulación de bolas y contenedores. Cada bit es un contenedor, y se establece si tiene al menos 1 bola, cada objeto insertado arroja bolas, donde es el número de funciones hash y es el número de bolas lanzadas después de que se hayan insertado objetos. Teniendo en cuenta que contenedores tienen al menos 1 bola en ellos, ¿cuál es la probabilidad de que al menos bolas fueron arrojados? Creo que aquí puedes usar el hecho de que: k n k n b t P ( t  bolas | b  bins ) = P ( b  bins | t  bolas ) P ( t ) / P ( b ) P ( t ) P ( b ) tkknknbt

P(t balls|b bins)=P(b bins|t balls)P(t)/P(b)
Pero el problema con esa formulación es que no veo una manera directa de calcular o , pero encontrar el valor de que maximice esa probabilidad no debería ser demasiado difícil.P(t)P(b)t
Joe
fuente
2

Pregunta interesante, veamos algunos casos específicos.

Deje que haya claves, bits , bits en total y elementos insertados. Primero intentaremos encontrar una función que es la probabilidad de que ocurra un estado.knonntotalmP(k,non,ntotal,m)

Si , entonces debe ser , es decir, es imposible.km<nonP(k,non,ntotal,m)0

Si , entonces estamos buscando la probabilidad de que los hashes de caigan en el mismo cubo, el primero puede marcar dónde deben ir los otros. Por lo tanto, queremos encontrar la probabilidad de que los hashes caigan en un cubo específico.non=1kmkm1

P(k,1,ntotal,m)=(1/ntotal)(km1)

Esos son los casos realmente simples. Si entonces queremos encontrar la probabilidad de que los hashes caigan en cubos distintos y al menos caiga en cada uno. Hay pares de cubos y la probabilidad de que los hashes caigan en un específico es por lo que la probabilidad de que los hashes caigan a cubos es:non=2km21ntotal(ntotal1)2(2/ntotal)km2

ntotal(ntotal1)(2/ntotal)km

Ya sabemos la probabilidad de que caigan en cubo, así que restemos eso para dar la probabilidad de que caigan exactamente en .12

P(k,2,ntotal,m)=ntotal(ntotal1)(2/ntotal)km(1/ntotal)(km1)

Creo que podemos generalizar esto ahora.

P(k,non,ntotal,m)=(ntotalnon)(non/ntotal)kmi=1i<nonP(k,i,ntotal,m)

No estoy exactamente seguro de cómo hacer que esta fórmula sea más adecuada para el cálculo. Implementado ingenuamente, daría como resultado un tiempo de ejecución de tiempo exponencial, aunque es trivial, a través de la memorización, lograr un tiempo lineal. Es solo un caso de encontrar el más probable . Mi instinto dice que habrá un solo pico, por lo que es posible encontrarlo muy rápidamente, pero ingenuamente, definitivamente puedes encontrar el m más probablemente en .mO(n2)

dan_waterworth
fuente
Creo que su fórmula se cancela a (ignorando factores constantes). Puede calcular el máximo de esto analíticamente: expanda el primer factor del segundo término y elimine los factores constantes para deshacerse de todo , y luego su fórmula se vuelve muy simple. (ntotalnon)nonkm(ntotalnon1)(non1)kmn choose k
Jules
@Jules, genial, estaba seguro de que algo así sucedería, pero no tuve tiempo de resolverlo.
dan_waterworth
También puede llegar a esa fórmula directamente de la siguiente manera: . Luego, conecte para . P(non=x)=P(nonx)P(non<x)=P(nonx)P(nonx1)(ntotalx)(x/ntotal)kmP(nonx)
Jules
2

Suponga que los hashes están distribuidos uniformemente.

Deja que sea el número de hashes insertados. Como tenemos hashes en bins si tenemos hashes en bins y el siguiente hash va a uno de esos de bins O si tenemos hashes en bins y el siguiente hash va en uno de los otros contenedores, tenemos:iimi1mmni1m1n(m1)

P(m,i)=P(m,i1)(m/n)+P(m1,i1)(n(m1))/n

Reescribiendo:

P(m,i)=1n(mP(m,i1)+(nm+1)P(m1,i1))

También tenemos y cuando y cuando . Esto le proporciona un algoritmo de programación dinámica para calcular P. Calcular el que maximiza le proporciona la estimación de máxima verosimilitud.P(0,0)=1P(m,0)=0m0P(0,i)=0i0O(mi)iP(m,i)

Si sabemos que hemos introducido hash en este filtro de floración veces y tenemos hashes por elemento, entonces el número de elementos es .iki/k

Para acelerarlo puedes hacer algunas cosas. El factor de puede omitirse ya que no cambia la posición del máximo. Puede compartir las tablas de programación dinámica con múltiples llamadas a para reducir el tiempo de ejecución (asintótico) a . Si está dispuesto a creer que hay un máximo único, puede detener la iteración sobre temprano y obtener el tiempo de ejecución donde es el punto donde adquiere su máximo, o incluso hacer una búsqueda binaria y obtener . P(m,i)O(nm)iO(jm)jPO(mlogn)1nP(m,i)O(nm)iO(jm)jPO(mlogn)

Jules
fuente
2

La idea clave es aproximar la expectativa del número de bits cero.

Para cada bit, la posibilidad de ser cero después de t inserciones con funciones K hash es: .(11N)KteKtN

Entonces la expectativa de números de bit cero debería ser:

N-MNeKtN aproximado por la observaciónNM

Finalmente tenemost=NKln(1MN)

Yanghong Zhong
fuente
1

La probabilidad de que un bit particular sea 1 después de n inserciones es: P = 1 - (1 - 1 / m) ^ (kn)

Supongamos que X_i es una variable aleatoria discreta que es 1 si el bit en la posición i es 1 y 0 en caso contrario. Deje X = X_1 + X_2 + .... + X_m. Entonces, E [X] = m * P.

Si el número total de bits establecidos es S, entonces: E [X] = S, lo que implica m * P = S. Esto podría resolverse para n.

Nikhil
fuente