Come funzionano i filtri bloom scalabili?


15

Stavo leggendo i filtri di fioritura scalabili e non riuscivo a capire come ogni volta che si riempie un filtro di fioritura costituente, viene aggiunto un nuovo filtro di fioritura con dimensioni maggiori.

Non è possibile cercare la presenza degli elementi che hanno contribuito ai bit impostati nei filtri creati inizialmente. Forse sbaglio nella mia comprensione di questo?

Capisco i filtri base per la fioritura. Tuttavia, non riesco ad avvolgere la mia testa attorno ai filtri dinamici di fioritura.

Risposte:


7

Vorrei provare a provarlo per vedere quanto posso macellarlo. :-)

Quindi, per iniziare, devi essere in grado di creare un filtro di fioritura regolare che consenta un numero finito di elementi con una probabilità massima di un falso positivo. L'aggiunta di queste funzionalità al filtro di base è necessaria prima di tentare di creare un'implementazione scalabile.

Prima di provare a controllare e ottimizzare la probabilità, cerchiamo di capire qual è la probabilità per una determinata dimensione del filtro di fioritura.

Innanzitutto dividiamo il campo di bit per quante funzioni hash abbiamo (numero totale di bit / numero di funzioni hash = sezioni) per ottenere k sezioni di bit che rappresentano ogni funzione di hash, quindi ogni elemento è sempre descritto da k bit.

Se si aumenta il numero di sezioni o il numero di bit per sezione, la probabilità di falsi positivi diminuirà.

Ne consegue anche che quando vengono aggiunti elementi, vengono impostati più bit su 1, quindi aumentano i falsi positivi. Ci riferiamo a questo come al "rapporto di riempimento" di ogni sezione.

Quando il filtro contiene una grande quantità di dati, possiamo supporre che la probabilità di falsi positivi per questo filtro sia il rapporto di riempimento elevato al numero di sezioni (se dovessimo contare effettivamente i bit invece di utilizzare un rapporto, questo semplifica in una permutazione con problema di ripetizione).

Quindi, come possiamo capire come scegliere una probabilità di falsi positivi in ​​un filtro di fioritura? Possiamo modificare il numero di sezioni (che influenzeranno il rapporto di riempimento).

Per capire quante fette dovremmo avere, iniziamo con il capire il rapporto di riempimento ottimale per una fetta. Poiché il rapporto di riempimento è determinato dal numero di bit in una sezione che sono 1 rispetto al numero di bit che sono 0, possiamo determinare che ciascun bit rimarrà non impostato con probabilità di (100% - (1 / bit in una sezione) ). Poiché avremo più elementi inseriti, abbiamo un'altra permutazione con problemi di reputazione ed espandiamo le cose al rapporto di riempimento previsto, che è (100% - ((100% - (1 / bit in una sezione)) ^ "elementi inseriti")). Bene, si scopre che questo è molto simile a un'altra equazione. Nel documento, mettono in relazione il rapporto di riempimento con un'altra equazione, quindi si adatta perfettamente a una serie di Taylor (1-e ^ (- n / m)). Dopo un po 'di inutilità con questo, si scopre che il rapporto di riempimento ottimale è sempre di circa il 50%,

Quindi, poiché la probabilità di un filtro è il rapporto di riempimento elevato al numero di sezioni, possiamo riempire il 50% e ottenere P = (50%) ^ k oppure k = log_2 (1 / P). Possiamo quindi utilizzare questa funzione per calcolare il numero di sezioni che dovremmo generare per un determinato filtro nell'elenco di filtri per un filtro bloom scalabile.

    def slices_count(false_positive_probability):
        return math.ceil(math.log(1 / false_positive_probability, 2))

Modifica: dopo aver scritto questo, mi sono imbattuto in una menzione della "regola del cinquanta per cento" quando ho letto sull'allocazione dinamica della memoria basata sul sistema amico in TAoCP Vol 1, pp 442-445 con un ragionamento molto più pulito rispetto al montaggio della curva (1 -e ^ (- n / m)). Knuth fa anche riferimento a un articolo "La regola del cinquanta per cento rivisitata" con un po 'di background sul concetto ( pdf disponibile qui ).


Non c'è discussione sui filtri Bloom in quel documento, quindi non vedo alcuna giustificazione per questa "regola del cinquanta per cento" qui. A priori, mi aspetto che la "regola del cinquanta per cento" sia solo un po 'di gente ad hoc in tutto il mondo perché la vera risposta implica una serie di considerazioni che vanno oltre i criteri di progettazione del loro particolare modulo.
Jeff Burdges,

1
Ehi @JeffBurdges, non trovi almeno curioso che i due concetti siano così simili?
Jon Bringhurst,

4

Un elemento si trova nel filtro bloom scalabile se un filtro restituisce true. Pertanto, è possibile aggiungere filtri senza influire sulle query di appartenenza per gli elementi precedenti.

Per assicurarti di avere ancora una garanzia di falsi positivi nel caso peggiore, vengono aggiunti nuovi filtri con tassi di falsi positivi che diminuiscono geometricamente. Ad esempio, il primo filtro ha percentuale di falsi positivi p, il secondo rp, il terzo r^2p, ecc La probabilità di un falso positivo sul filtro fioritura scalabile viene quindi delimitata dall'unione vincolato: sum_{k>=0} r^k p = p/(1-r).


3
Cosa rappresenta 'r' in queste formule?
Zslayton,

1

Stavo leggendo i filtri di fioritura scalabili e non riuscivo a capire come ogni volta che si riempie un filtro di fioritura costituente, viene aggiunto un nuovo filtro di fioritura con dimensioni maggiori.

Non è possibile cercare la presenza degli elementi che hanno contribuito ai bit impostati nei filtri creati inizialmente. Forse sbaglio nella mia comprensione di questo?

Ciao,
L'idea di base è quella di aggiungere al primo filtro fino a quando il campo bit del filtro di primo livello è saturo. Essere saturi non significa che tutti i bit vengono utilizzati, ma significa che il filtro contiene così tante voci che voci aggiuntive creerebbero troppi falsi positivi.

Dal punto di saturazione, qualsiasi nuovo elemento non verrà aggiunto al filtro saturo, ma a un sotto-filtro nuovo e più grande (il filtro di secondo livello).

Per trovare un valore, dovresti cercarlo nel filtro di primo livello e, se non riesci a trovarlo, lo cercherai nel filtro di secondo livello. Se lo trovi in ​​uno di questi filtri, è (per una buona probabilità) "noto" al filtro (potrebbero verificarsi falsi positivi a causa della natura dei filtri Bloom). Se non riesci a trovare il valore in nessuno dei filtri, il filtro non lo vedrà. Questo, ovviamente, può essere espresso come una struttura di dati ricorsiva.

Potresti voler leggere il mio post sul blog che contiene un'implementazione del filtro Bloom scalabile in Java e una spiegazione di come funziona in dettaglio.

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.