Un insieme probabilistico senza falsi positivi?


35

Quindi, i filtri Bloom sono piuttosto interessanti: sono set che supportano il controllo dell'appartenenza senza falsi negativi, ma con una piccola possibilità di un falso positivo. Di recente, però, ho desiderato un "filtro Bloom" che garantisca il contrario: niente falsi positivi, ma potenzialmente falsi negativi.

La mia motivazione è semplice: dato un enorme flusso di articoli da elaborare (con duplicati), vorremmo evitare di elaborare gli articoli che abbiamo visto prima. Elaborare un duplicato non fa male, è solo una perdita di tempo. Tuttavia, se trascurassimo di elaborare un elemento, sarebbe catastrofico. Con un "filtro Bloom inverso", è possibile archiviare gli oggetti visti con poco spazio in testa ed evitare di elaborare duplicati con alta probabilità testando l'appartenenza al set.

Eppure non riesco a trovare nulla del genere. I più vicini che ho trovato sono i " filtri Bloom ritoccati ", che consentono di scambiare falsi positivi selezionati con un tasso di falsi negativi più elevato. Non so quanto bene la loro struttura di dati si comporti quando si vogliono rimuovere tutti i falsi positivi.

Qualcuno ha visto qualcosa del genere? :)


3
Il complemento del set che mi interessa è infinito. Come lo conserverei?
Christopher Monsanto,

11
Vedo il problema (i dischi moderni non sono ancora abbastanza grandi).
Dave Clarke,

8
Se si disponesse di una tale struttura di dati, è possibile utilizzarlo per "imbrogliare" utilizzandolo insieme a un filtro bloom regolare e archiviando l'appartenenza esatta al set.
Mark Reitblatt,

1
@MarkReitblatt sia i filtri Bloom che le cache sono probabilistici e qualsiasi combinazione di questi sarà probabilistica, cioè non sarà in grado di ottenere test di appartenenza esatti. :)
awdz9nld

Risposte:


25

Una risposta è usare una grande tabella di hash e quando si riempie inizia a sostituire gli elementi in essa anziché trovare slot vuoti (inesistenti) altrove per loro. Non ottieni la simpatica percentuale fissa di false risposte che ottieni con i filtri Bloom, ma è meglio di niente. Credo che questo sia standard, ad esempio nel software di scacchi, per tenere traccia delle posizioni che sono già state cercate.


Grazie per la risposta. Sì, questa è la soluzione ovvia - se è anche la soluzione standard , sembra che io sia sfortunato. Oh bene.
Christopher Monsanto,

2
Questa si chiama cache con mappatura diretta ed è comunemente usata nelle CPU. (Qualsiasi cache o set di hash con perdita di dati si adatta ai requisiti a vari livelli). Il tasso di errore è una funzione della distribuzione della funzione hash (valanga) e il numero di slot disponibili nella cache / set - regolare di conseguenza. :)
awdz9nld,

Si noti inoltre che solo le chiavi testuali possono essere archiviate senza introdurre falsi positivi (ad es
Memorizzazione di

20

La risposta a questa domanda è "no". Per capire perché, possiamo pensare a un caso molto estremo e al funzionamento di un normale filtro bloom rispetto a un filtro bloom "Bizzaro World" teorico, che possiamo chiamare un "filtro oscuro".

La cosa grandiosa di un filtro bloom è che puoi fare test unilaterali per l'appartenenza di articoli (con falsi positivi) usando una struttura di dati che ha una dimensione fissa rispetto alla probabilità di errore e al numero di articoli memorizzati. Le dimensioni degli articoli stessi non contano affatto. Ad esempio, se avessimo impostato un filtro bloom per archiviare fino a 1.000 articoli con un errore inferiore al 3%, potremmo memorizzare 1.000 versioni leggermente diverse dell'intero corpus di Wikipedia, con una lettera cambiata in ciascuna, e continueremmo ottenere le metriche che desideriamo e la struttura dei dati sarebbe molto piccola (meno di un kilobyte). Naturalmente, calcolare questi hash sarà una sfida, ma il principio è ancora valido.

Ora, considera di conservare quelle stesse stringhe enormi in un filtro oscuro! Ora possiamo avere solo falsi negativi. Quindi se diciamo "sì, quella versione dell'intero corpus di Wikipedia è in questo set", allora dobbiamo assolutamente avere ragione. Ciò significa che l'hash non ci aiuterà, poiché ci sarà sempre qualche altra stringa che ha lo stesso valore. L'unico modo per dire "sì" ed essere sicuri è archiviare l'intera stringa o alcuni dati equivalenti della stessa lunghezza. Non potremmo sempre non memorizzarlo e dire "no", ma alla fine il tasso di errore ci raggiungerà. Il meglio che potremmo fare è la compressione, riducendo le dimensioni della struttura al prodotto dell'entropia dei dati archiviati e della precisione che desideriamo.

Quindi, sfortunatamente, il filtro oscurità non esiste. La memorizzazione nella cache è l'unica soluzione, ma in realtà non è l'opposto di un filtro bloom, poiché le sue dimensioni saranno proporzionali al prodotto della quantità di informazioni archiviate e alla velocità di accuratezza desiderata del filtro. Naturalmente, in molti scenari del mondo reale, i dati di grandi dimensioni possono essere rappresentati da un ID, quindi la memorizzazione nella cache può essere ancora abbastanza accettabile. Ma è fondamentalmente diverso dal potente filtro di fioritura.


checkout somethingsimilar.com/2012/05/21/the-opposite-of-a-bloom-filter - cosa c'è di sbagliato in questa implementazione /
Yehosef

@Yehosef va bene e può funzionare per le tue esigenze, ma noterai che l'autore parla di "pochi ID che identificano completamente l'evento". Quindi, ciò che viene implementato è effettivamente ancora l'archiviazione dell'intero oggetto. Quindi, è una variante di una cache. Un vero "opposto di un filtro bloom", se esistesse, non avrebbe bisogno di memorizzare interi oggetti.
Pents90,

Ha citato alcuni id che identificano l'evento, non l'intero oggetto. Devo solo mantenere la "cache" su session_id, non l'intero record di interazione. Ma ho sentito che non è lo stesso tipo di approccio del bloom o di un iperloglog.
Yehosef,

Nella tua "prova" presumi che ci sia un numero illimitato di possibili voci. Tuttavia, ci sono casi in cui la serie di possibili voci è nota in anticipo. Ad esempio, per la garbage collection di una pagina di memoria: sai quali voci contiene. Ora crei un "filtro oscuro" che mappa ogni possibile voce su un indice 0..n. Ora quando una voce viene rimossa, imposta il bit su quell'indice. Quando tutti i bit sono impostati, è possibile eseguire la garbage collection della pagina. Il "filtro oscuro" è un MPHF. Per consentire falsi negativi, modificare l'MPHF in modo tale che alcune voci siano mappate su n + 1.
Thomas Mueller,

@ThomasMueller Corretto, presumo il caso peggiore / contraddittorio, che è il punto di vista della teoria CS standard. È vero che se hai solo un set fisso di N possibili voci, allora ci sono molte soluzioni semplici, con solo N spazio di registro richiesto per ogni elemento. Tuttavia, il filtro bloom non ha tali limiti.
pents90,

13

Vuoi solo una cache , ma ci stai pensando in un modo strano.


1
... ti interessa elaborare? Naturalmente una cache funzionerebbe, ma non è l'ideale, quindi una domanda sullo stato dell'arte nelle strutture di dati probabilistici. Per essere più specifici: le tecniche di memorizzazione nella cache che conosco richiedono molta memoria. Più livelli di cache, più spazio di archiviazione utilizzato. Si potrebbe porre un limite agli elementi memorizzati nella cache, fare trucchi con i modelli di utilizzo, ecc., Ma ciò non si avvicina in alcun modo all'efficienza dello spazio rispetto al rapporto di risposta falsa fornito da un filtro Bloom.
Christopher Monsanto,

1
(continua) Detto questo, potrei dimenticare un'evidente tecnica di memorizzazione nella cache che risolve tutti i miei problemi. In tal caso, potresti rendere esplicita quella tecnica invece di darmi un link a una categoria generale su Wikipedia?
Christopher Monsanto,

2

DISCLAIMER: Non sono un esperto di cache, quindi questa potrebbe essere un'idea ingenua, e potrebbe anche essere un'idea nota di cui non avevo mai sentito parlare prima. Quindi mi scusi se non cito il suo riferimento (se esiste); e per favore informami se c'è un riferimento per modificare il post e aggiungerlo. (Sospetto che potrebbe avere un riferimento perché è così intuitivo).

cc


0

Ho usato alberi AVL (e talvolta rosso-nero) con elementi parziali per fungere da filtro senza falsi negativi. Utilizzare solo i primi X byte dell'elemento durante l'inserimento o l'interrogazione dell'albero. Poiché la struttura dei dati non è probabilistica nella forma, non vi è il rischio di un falso positivo per collisione di bit. E a differenza della memorizzazione nella cache dell'intero elemento, questo approccio offre uno spazio massimo calcolabile. È possibile ottimizzare il tasso di falsi positivi considerando diverse lunghezze di prefisso / profondità degli alberi rispetto al costo dei falsi positivi e dello spazio.


Volevo anche provare con i dati delle stringhe, ma i miei dati tendono ad essere strutture binarie impaccate.
JRideout,

0

Penso che si possa dimostrare un limite inferiore affermando che la struttura di dati di cui sopra non può esistere. Fondamentalmente, se la struttura dei dati utilizza m bit, allora un vettore bit fisso (rappresentazione di un input) può corrispondere al massimo (((un) + n eps) \ scegliere (un)) insiemi di un argomento di conteggio. Dato che 2 ^ m volte questo numero deve essere almeno (u \ scegli n) (tutti gli insiemi devono essere rappresentati), otteniamo un limite inferiore che è sostanzialmente molto vicino alla memorizzazione dell'insieme S con precisione.

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.