¿Cómo funcionan los filtros de floración escalables?

15

Estaba leyendo sobre filtros de floración escalables y no podía entender cómo cada vez que se llena un filtro de floración constituyente, se agrega un nuevo filtro de floración con un tamaño más grande.

No se puede buscar la presencia de los elementos que contribuyeron a los bits establecidos en los filtros creados inicialmente. ¿Quizás estoy equivocado en mi comprensión de esto?

Entiendo los filtros básicos de floración. Sin embargo, no puedo entender los filtros dinámicos de floración.

usuario434345
fuente

Respuestas:

7

Permítanme intentar darle una oportunidad a esto para ver cuánto puedo matarlo. :-)

Entonces, para comenzar, debe ser capaz de crear un filtro de floración regular que permita un número finito de elementos con una probabilidad máxima de un falso positivo. Es necesario agregar estas características a su filtro básico antes de intentar construir una implementación escalable.

Antes de intentar controlar y optimizar cuál es la probabilidad, descubramos cuál es la probabilidad para un tamaño de filtro de floración dado.

Primero dividimos el campo de bits por la cantidad de funciones hash que tenemos (número total de bits / número de funciones hash = sectores) para obtener k segmentos de bits que representan cada función hash para que cada elemento siempre se describa con k bits.

Si aumenta el número de cortes o el número de bits por corte, la probabilidad de falsos positivos disminuirá.

También se deduce que a medida que se agregan elementos, se establecen más bits en 1, por lo que aumentan los falsos positivos. Nos referimos a esto como la "relación de relleno" de cada segmento.

Cuando el filtro contiene una gran cantidad de datos, podemos suponer que la probabilidad de falsos positivos para este filtro es la relación de relleno elevada al número de sectores (si tuviéramos que contar los bits en lugar de usar una relación, esto se simplifica en una permutación con problema de repetición).

Entonces, ¿cómo descubrimos cómo elegir una probabilidad de falsos positivos en un filtro de floración? Podemos modificar el número de cortes (lo que afectará la relación de relleno).

Para determinar cuántas rebanadas deberíamos tener, comenzamos por calcular la relación de relleno óptima para una rebanada. Dado que la proporción de relleno está determinada por el número de bits en un segmento que son 1 versus el número de bits que son 0, podemos determinar que cada bit permanecerá sin establecer con una probabilidad de (100% - (1 / bits en un segmento) ) Dado que vamos a tener múltiples elementos insertados, tenemos otra permutación con un problema de reputación y ampliamos las cosas a la relación de llenado esperada, que es (100% - ((100% - (1 / bits en un segmento)) ^ "elementos insertados")). Bueno, resulta que esto es muy similar a otra ecuación. En el documento, relacionan la relación de relleno con otra ecuación, por lo que encaja perfectamente en una serie taylor (1-e ^ (- n / m)). Después de un poco de frustración con esto, resulta que la relación de llenado óptima siempre es de aproximadamente 50%,

Entonces, dado que la probabilidad de un filtro es la proporción de relleno elevada al número de cortes, podemos completar el 50% y obtener P = (50%) ^ k o k = log_2 (1 / P). Entonces podemos usar esta función para calcular la cantidad de cortes que deberíamos generar para un filtro dado en la lista de filtros para un filtro de floración escalable.

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

Editar: Después de escribir esto, me encontré con una mención de la "regla del cincuenta por ciento" al leer sobre la asignación de memoria dinámica basada en el sistema de amigos en TAoCP Vol 1, pp 442-445 con un razonamiento mucho más limpio en lugar de ajustar la curva a (1 -e ^ (- n / m)). Knuth también hace referencia a un documento "La regla del cincuenta por ciento revisado" con algunos antecedentes sobre el concepto ( pdf disponible aquí ).

Jon Bringhurst
fuente
No hay discusión de los filtros de Bloom en ese documento, así que no veo ninguna justificación para esta "regla del cincuenta por ciento" aquí. A priori, esperaría que la "regla del cincuenta por ciento" sea solo una de las personas de compilación de pocus porque la respuesta real implica un montón de consideraciones que van más allá de los criterios de diseño de su módulo en particular.
Jeff Burdges
1
Hola @JeffBurdges, ¿no te parece al menos curioso que los dos conceptos sean tan similares?
Jon Bringhurst
4

Un elemento está en el filtro de floración escalable si algún filtro devuelve verdadero. Por lo tanto, puede agregar filtros sin afectar las consultas de membresía para elementos anteriores.

Para asegurarse de que todavía tiene una garantía de falsos positivos en el peor de los casos, se agregan nuevos filtros con tasas de falsos positivos que disminuyen geométricamente. Por ejemplo, el primer filtro tiene la tasa de falso positivo p, la segunda rp, la tercera r^2p, etc. La probabilidad de un falso positivo sobre el filtro floración escalable está delimitada entonces por la unión con destino: sum_{k>=0} r^k p = p/(1-r).

usuario145031
fuente
3
¿Qué representa 'r' en estas fórmulas?
zslayton
1

Estaba leyendo sobre filtros de floración escalables y no podía entender cómo cada vez que se llena un filtro de floración constituyente, se agrega un nuevo filtro de floración con un tamaño más grande.

No se puede buscar la presencia de los elementos que contribuyeron a los bits establecidos en los filtros creados inicialmente. ¿Quizás estoy equivocado en mi comprensión de esto?

Hola,
la idea básica es agregar al primer filtro hasta que el campo de bits del filtro de primer nivel esté saturado. Estar saturado no significa que se utilicen todos los bits, pero significa que el filtro contiene tantas entradas que entradas adicionales crearían demasiados falsos positivos.

Desde el punto de saturación, cualquier elemento nuevo no se agregará al filtro saturado, sino a un subfiltro nuevo y más grande (el filtro de segundo nivel).

Para encontrar un valor, lo buscaría en el filtro de primer nivel, y si no puede encontrarlo allí, lo buscaría en el filtro de segundo nivel. Si puede encontrarlo en cualquiera de estos filtros, es (por casualidad) "conocido" por el filtro (pueden producirse falsos positivos como resultado de la naturaleza de los filtros Bloom). Si no puede encontrar el valor en ninguno de los filtros, se garantiza que el filtro no lo haya visto. Esto, por supuesto, puede expresarse como una estructura de datos recursiva.

Es posible que desee leer la publicación de mi blog que contiene una implementación escalable del filtro Bloom en Java y una explicación de cómo funciona en detalle.

Brixomatic
fuente