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(log⁡n)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=(1−1n)ki

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

i=ln⁡(z)kln⁡(1−1n)

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=1kmkm−1

P(k,1,ntotal,m)=(1/ntotal)(km−1)

non=2km21ntotal(ntotal−1)2(2/ntotal)km2

ntotal(ntotal−1)(2/ntotal)km

12

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

Penso che possiamo generalizzare questo ora.

P(k,non,ntotal,m)=(ntotalnon)(non/ntotal)km−∑i=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−(ntotalnon−1)(non−1)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(non≤x)−P(non<x)=P(non≤x)−P(non≤x−1)(ntotalx)(x/ntotal)kmP(non≤x)
— 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:iimi−1mmni−1m−1n−(m−1)

P(m,i)=P(m,i−1)(m/n)+P(m−1,i−1)(n−(m−1))/n

riscrittura:

P(m,i)=1n(mP(m,i−1)+(n−m+1)P(m−1,i−1))

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)=0m≠0P(0,i)=0i≠0O(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(mlog⁡n)


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 è: .(1−1N)Kt≈e−KtN

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

N-MNe−KtN approssimato dall'osservazioneN−M

Alla fine abbiamo ottenutot=−NKln(1−MN)


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.