Calcolo della popolazione approssimativa di un filtro di fioritura


12

Dato un filtro bloom di dimensioni N-bit e funzioni hash K, di cui sono impostati i bit M (dove M <= N) del filtro.

È possibile approssimare il numero di elementi inseriti nel filtro bloom?

Esempio semplice

Ho riflettuto sul seguente esempio, supponendo un BF di 100 bit e 5 funzioni hash in cui sono impostati 10 bit ...

Scenario migliore: supponendo che le funzioni hash siano davvero perfette e mappino in modo univoco un po 'per un numero X di valori, quindi dati 10 bit sono stati impostati possiamo dire che ci sono stati solo 2 elementi inseriti nel BF

Scenario peggiore: supponendo che le funzioni di hash siano cattive e siano coerentemente associate allo stesso bit (ma uniche tra loro), allora possiamo dire che 10 elementi sono stati inseriti nel BF

L'intervallo sembra essere [2,10] dove circa questo intervallo è probabilmente determinato dalla probabilità falsa positiva del filtro - sono bloccato a questo punto.


4
Perché non tenere un contatore del numero di elementi inseriti? Ci vogliono solo bit aggiuntivi , se sono stati inseriti n elementi. O(logn)n
Joe

@Joe, sebbene sia una buona idea, rovina una domanda davvero interessante.
dan_waterworth,

Solo notando che con i duplicati, il metodo di Joe avrà qualche piccolo errore poiché non possiamo sempre dire con certezza quando si aggiunge un elemento se è già presente (e quindi dovremmo aumentare o meno il conteggio).
usul

Risposte:


5

Sì. Da Wikipedia :

Se hai inserito elementi in un filtro di dimensione n usando k funzioni hash, la probabilità che un determinato bit sia ancora 0 èink

z=(11n)ki

È possibile misurare questa probabilità come proporzione di 0 bit nel filtro. Risolvendo per i

i=ln(z)kln(11n)

L'ho usato in pratica e finché il filtro non supera la sua capacità, l'errore è generalmente inferiore allo 0,1% per filtri fino a milioni di bit. Poiché il filtro supera la sua capacità, l'errore ovviamente aumenta.


3

kknknbt

P(t balls|b bins)=P(b bins|t balls)P(t)/P(b)
P(t)P(b)t

2

Domanda interessante, diamo un'occhiata ad alcuni casi specifici.

knonntotalmP(k,non,ntotal,m)

km<nonP(k,non,ntotal,m)0

non=1kmkm1

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

non=2km21ntotal(ntotal1)2(2/ntotal)km2

ntotal(ntotal1)(2/ntotal)km

12

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

Penso che possiamo generalizzare questo ora.

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

Non sono esattamente sicuro di come rendere questa formula più suscettibile al calcolo. Implementato ingenuamente, si tradurrebbe in un tempo di esecuzione del tempo esponenziale, anche se è banale, tramite la memoizzazione, ottenere un tempo lineare. È quindi solo il caso di trovare la più probabile . Il mio istinto dice che ci sarà un singolo picco, quindi potrebbe essere possibile trovarlo molto rapidamente, ma ingenuamente, puoi sicuramente trovare il m probabilmente in .mO(n2)


Penso che la tua formula si annulli a (ignorando i fattori costanti). Puoi calcolare il massimo di questo analiticamente: espandi il primo fattore del secondo termine e rimuovi i fattori costanti per sbarazzarti di tutto , e quindi la tua formula diventa molto semplice. (ntotalnon)nonkm(ntotalnon1)(non1)kmn choose k
Jules,

@Jules, fantastico, ero sicuro che sarebbe successo qualcosa del genere, ma non ho avuto il tempo di capirlo.
dan_waterworth,

Puoi anche arrivare a quella formula direttamente nel modo seguente: . Quindi collegare per . P(non=x)=P(nonx)P(non<x)=P(nonx)P(nonx1)(ntotalx)(x/ntotal)kmP(nonx)
Jules il

2

Supponiamo che gli hash siano distribuiti uniformemente.

Permettetemi essere il numero di hash inseriti. Dal momento che abbiamo hash in bidoni se abbiamo hash in bidoni e la prossima hash va in una di quelle di bidoni o se ci sono hash in bidoni e la prossima hash va in uno degli altri bin, abbiamo:iimi1mmni1m1n(m1)

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

riscrittura:

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

Abbiamo anche e quando e quando . Questo ti dà un algoritmo di programmazione dinamica per il calcolo di P. Il calcolo che massimizza ti dà la stima della massima verosimiglianza.P(0,0)=1P(m,0)=0m0P(0,i)=0i0O(mi)iP(m,i)

Se sappiamo che abbiamo hash in questo filtro fioritura tempi e abbiamo hash per articolo, quindi il numero di elementi è .iki/k

Per accelerare puoi fare alcune cose. Il fattore di può essere lasciato fuori dal momento che non cambia la posizione del massimo. È possibile condividere le tabelle di programmazione dinamica con più chiamate a per ridurre il tempo di esecuzione (asintotico) a . Se sei disposto a credere che ci sia un singolo massimo, puoi interrompere l'iterazione prima di e ottenere il tempo di esecuzione dove è il punto in cui assume il suo massimo, o persino fare una ricerca binaria e ottenere . P(m,i)O(nm)iO(jm)jPO(mlogn)1nP(m,i)O(nm)iO(jm)jPO(mlogn)


2

L'idea chiave è approssimare l'aspettativa del numero di zero bit.

Per ogni bit, la possibilità di essere zero dopo l'inserimento di t con funzioni hash K è: .(11N)KteKtN

Quindi l'aspettativa di numeri a zero bit dovrebbe essere:

N-MNeKtN approssimato dall'osservazioneNM

Alla fine abbiamo ottenutot=NKln(1MN)


1

La probabilità che un determinato bit sia 1 dopo n inserimenti è: P = 1 - (1 - 1 / m) ^ (kn)

Sia X_i una variabile casuale discreta che è 1 se il bit nella posizione 1 è 1 e 0 altrimenti. Lascia X = X_1 + X_2 + .... + X_m. Quindi, E [X] = m * P.

Se il numero totale di bit impostati è S, allora: E [X] = S che implica m * P = S. Questo potrebbe essere risolto per n.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.