Ölçeklenebilir çiçek filtreleri nasıl çalışır?


15

Ölçeklenebilir çiçek filtreleri üzerinde okuyordum ve her ne zaman bir bileşen çiçek filtresi her dolduğunda, daha büyük boyutlu yeni bir çiçek filtresi eklendiğini anlayamıyordum.

Başlangıçta oluşturulan filtrelerdeki set bitlerine katkıda bulunan elemanlar mevcudiyet için aranamaz. Belki de bunu anlamamda yanılıyorum?

Temel çiçeklenme filtrelerini anlıyorum. Ancak, kafamı dinamik çiçek filtrelerinin etrafına satamıyorum.

Yanıtlar:


7

Ne kadar kasap yapabileceğimi görmek için bunu denememe izin verin. :-)

Bu nedenle, başlamak için, maksimum yanlış pozitif olasılığına sahip sınırlı sayıda öğeye izin veren düzenli bir çiçeklenme filtresi oluşturabilmeniz gerekir. Ölçeklenebilir bir uygulama oluşturmaya çalışmadan önce bu özelliklerin temel filtrenize eklenmesi gerekir.

Olasılığın ne olduğunu kontrol etmeye ve optimize etmeye çalışmadan önce, belirli bir bloom filtre boyutu için olasılığın ne olduğunu anlayalım.

İlk önce her bir hash fonksiyonunu temsil eden k bit dilimlerini elde etmek için bit alanını kaç hash fonksiyonumuza (toplam bit sayısı / hash fonksiyonlarının sayısı = dilim) böleriz, böylece her eleman her zaman k bitleri tarafından tanımlanır.

Dilim sayısını veya dilim başına bit sayısını artırırsanız, yanlış pozitif olasılığı azalacaktır.

Ayrıca, elemanlar eklendikçe, daha fazla bit 1'e ayarlandığından, yanlış pozitifler artar. Buna her dilimin "doldurma oranı" diyoruz.

Filtre büyük miktarda veri içerdiğinde, bu filtre için yanlış pozitif olma olasılığının dilim sayısına yükseltilen doldurma oranı olduğunu varsayabiliriz (Bir oranı kullanmak yerine bitleri gerçekten sayacak olsaydık, tekrar sorunu olan bir permütasyon).

Peki, bir çiçek filtresinde yanlış pozitif olasılığını nasıl seçeceğimizi nasıl anlayabiliriz? Dilim sayısını değiştirebiliriz (doldurma oranını etkiler).

Kaç dilim almamız gerektiğini anlamak için, bir dilim için en uygun doldurma oranını bulmaya başlıyoruz. Doldurma oranı bir dilimdeki bit sayısı ile 1 olan bit sayısı ile belirlendiğinden, 0 olan bit sayısına göre, her bitin (% 100 - (bir dilimde 1 / bit) olasılığı ile ayarlanmadan kalacağını belirleyebiliriz. ). Birden fazla öğe ekleyeceğimiz için, itibar sorunuyla başka bir permütasyonumuz var ve işleri beklenen doluluk oranına genişletiyoruz, bu da (% 100 - ((% 100 - (bir dilimde 1 / bit)) ^ "öğeler eklendi")). Bunun başka bir denkleme çok benzediği ortaya çıktı. Bu makalede, doldurma oranını başka bir denkleme bağlarlar, böylece bir taylor serisine (1-e ^ (- n / m)) iyi uyum sağlar. Bununla biraz heyecanlandıktan sonra, optimum dolum oranının her zaman yaklaşık% 50 olduğu ortaya çıkıyor,

Bu nedenle, bir filtrenin olasılığı dilim sayısına yükseltilmiş dolgu oranı olduğundan,% 50'yi doldurabilir ve P = (% 50) ^ k veya k = log_2 (1 / P) elde edebiliriz. Ardından bu işlevi, ölçeklenebilir bir çiçek filtresi filtresi listesinde belirli bir filtre için oluşturmamız gereken dilim sayısını hesaplamak için kullanabiliriz.

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

Düzenleme: Bunu yazdıktan sonra, (1 elli yüzde kural "bir söz geldi eğri uydurma karşı çok daha temiz bir akıl yürütme ile TAoCP Vol 1, s. 442-445 dost sistem tabanlı dinamik bellek ayırma okurken -e ^ (- n / m)). Knuth ayrıca, kavram hakkında biraz bilgi sahibi olan "yüzde elli kural yeniden ziyaret edildi" başlıklı makaleye atıfta bulunmaktadır ( pdf burada bulunabilir ).


Bu makalede Bloom filtreleri hakkında bir tartışma yok, bu yüzden bu "yüzde elli kural" için herhangi bir gerekçe görmüyorum. Bir a priori, "yüzde elli kuralı" bekliyorum sadece bazı hocus pocus comp sci insanlar çevrede çünkü gerçek cevap kendi modüllerinin tasarım kriterlerini aşan bir sürü dikkate içerir.
Jeff Burdges

1
Hey @JeffBurdges, en azından iki kavramın bu kadar benzer olduğunu merak etmiyor musunuz?
Jon Bringhurst

4

Herhangi bir filtre true değerini döndürürse, öğe ölçeklenebilir çiçeklenme filtresindedir. Bu nedenle, önceki öğeler için üyelik sorgularını etkilemeden filtreler ekleyebilirsiniz.

Hala en kötü durumda yanlış pozitif garantiniz olduğundan emin olmak için, geometrik olarak azalan yanlış pozitif oranlarla yeni filtreler eklenir. Örneğin, birinci filtrenin yanlış pozitif oranı p, ikincisi rp, üçüncüsü r^2pvs. vardır sum_{k>=0} r^k p = p/(1-r).


3
Bu formüllerde 'r' neyi temsil eder?
zslayton

2

Ölçeklenebilir çiçek filtreleri üzerinde okuyordum ve bir bileşen çiçek filtresinin her dolduruşunda, daha büyük boyutlu yeni bir çiçek filtresi eklendiğini anlayamıyordum.

Başlangıçta oluşturulan filtrelerdeki set bitlerine katkıda bulunan elemanlar mevcudiyet için aranamaz. Belki de bunu anlamamda yanılıyorum?

Merhaba,
Temel fikir, ilk düzey filtrenin bit alanı doygun olana kadar ilk filtreye eklemektir. Yok doymuş olmak değil her bit kullanılır istemem, ama, filtre, ek girişler çok fazla yanlış pozitif yaratacak şekilde fazla girdi içerir anlamına gelir.

Doygunluk açısından, doymuş filtreye herhangi bir yeni öğe eklenmeyecek, yeni ve daha büyük bir alt filtreye (ikinci seviye filtre) eklenecektir.

Bir değer bulmak için, onu ilk seviye filtresinde ararsınız ve orada bulamazsanız, ikinci seviye filtresinde ararsınız. Bu filtrelerden herhangi birinde bulabilirseniz (iyi bir şansla) filtreye "bilinir" (Bloom filtrelerinin doğasının bir sonucu olarak yanlış pozitifler oluşabilir). Değeri filtrelerin hiçbirinde bulamazsanız, filtrenin görmediği garanti edilir. Bu, elbette, özyinelemeli bir veri yapısı olarak ifade edilebilir.

Java'da ölçeklenebilir bir Bloom filtre uygulaması ve bunun nasıl çalıştığına dair bir açıklama içeren blog yayınımı okumak isteyebilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.