ブルームフィルターのおおよその母集団の計算


12

サイズNビットのブルームフィルターとK個のハッシュ関数があり、そのうちMビット(M <= N)のフィルターが設定されているとします。

ブルームフィルターに挿入された要素の数を概算することはできますか?

簡単な例

100ビットのBFと、10ビットが設定されている5つのハッシュ関数を想定して、次の例を熟考しています...

ベストケースのシナリオ:ハッシュ関数が本当に完璧で、X個の値にビットを一意にマッピングし、10ビットが設定されていると仮定すると、BFに挿入された要素は2つだけであると言えます。

最悪の場合のシナリオ:ハッシュ関数が不良であり、常に同じビットにマップされていると仮定すると(相互に一意である場合)、BFに10個の要素が挿入されたと言えます

範囲は[2,10]のようです。この範囲の約は、おそらくフィルターの偽陽性確率によって決定されます-私はこの時点で立ち往生しています。


4
挿入された要素の数のカウンターを保持しないのはなぜですか?n個の要素を挿入した場合、追加のビットのみが必要です。O(log⁡n)n
— ジョー

@Joe、それは良い考えですが、本当に興味深い質問を台無しにします。
— dan_waterworth

重複があることに注意してください。Joeのメソッドには、要素を追加するときに、要素が既に存在するかどうかを常に確認できないため(したがって、カウントをインクリメントする必要があるため)、小さなエラーが発生します。
— -usul

回答:


5

はい。ウィキペディアから:

k個のハッシュ関数を使用して、サイズnのフィルターに要素を挿入した場合、特定のビットがまだ0である確率はink

z=(1−1n)ki

この確率は、フィルターの0ビットの割合として測定できます。解くいますi

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

実際にこれを使用しましたが、フィルターがその容量を超えない限り、最大数百万ビットのフィルターのエラーは通常0.1%未満です。フィルターがその容量を超えると、もちろんエラーが上がります。


3

各オブジェクトの各ハッシュ関数について、ビットがランダムに均一に設定され、設定されたビット数にカウントがあると仮定すると、挿入されたオブジェクト数が発生する確率を制限できるはずです。特定の範囲内で、おそらくボールとビンの処方を使用します。各ビットはビンであり、少なくとも1つのボールがある場合に設定され、挿入された各オブジェクトはボールをスローします。ここで、kはハッシュ関数の数、n kはn個のオブジェクトが挿入された後にスローされるボールの数です。ことを考えると、Bビンがそれらに少なくとも1個のボールを持って、少なくとも確率何トンのボールが投げられましたの?ここでは、次の事実を使用できると思います。 kknknbt しかし、その製剤の問題は、私が計算する簡単な方法が表示されないということである P (トンを)または P (b )が、その確率を最大化する tの値を見つけることは難しくありません。

P(t balls|b bins)=P(b bins|t balls)⋅P(t)/P(b)
P(t)P(b)t

2

興味深い質問、いくつかの特定のケースを見てみましょう。

そこであるとするキー、N 、O 、N上のビット、N T O 、T Lの合計とのビットM挿入要素。最初に、状態が発生する確率である関数P (k 、n o n、n t o t a l、m )を見つけようとします。knonntotalmP(k,non,ntotal,m)

場合、次にP (K 、N oは、N、N T O 、T 、L、Mが)でなければならない0、すなわち、それは不可能です。km<nonP(k,non,ntotal,m)0

場合、k m 個のハッシュが同じバケットに入る可能性を探しています。最初のハッシュは他のハッシュがどこに行くべきかをマークできます。そのため、k m − 1ハッシュが特定のバケットに入る確率を見つけたいと思います。non=1kmkm−1

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

それは本当に簡単なケースです。場合、k mが2つの異なるバケットに着地し、それぞれに少なくとも1つのバケットが落ちる確率を求めます。あるN T O 、T L(N T O 、T L - 1 )バケットの組と、任意の特定におけるハッシュランド確率2がある(2 / N T O 、T L)のk Mはnon=2km21ntotal(ntotal−1)2(2/ntotal)kmそのため、ハッシュが最大バケットに入る確率は次のとおりです。2

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

それらがバケットに収まる確率はすでにわかっているので、それらを減算して、正確に2に収まる確率を求めます。12

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

今、これを一般化できると思います。

P(k,non,ntotal,m)=(ntotalnon)(non/ntotal)km−∑i=1i<nonP(k,i,ntotal,m)

この式をより計算しやすくする方法が正確にはわかりません。単純に実装された場合、実行時間は指数関数的になりますが、メモ化を介して線形時間を達成するのは簡単です。その場合、最も可能性の高いを見つけるだけです。私の本能によれば、単一のピークが存在するため、非常に迅速に検出できる可能性がありますが、単純にO (n 2)で最も可能性の高いmを見つけることができます。mO(n2)


あなたの式は(定数因子を無視)。この最大値を分析的に計算できます。2番目の項の最初の因子を展開し、定数因子を削除してすべてを削除すると、式は非常に簡単になります。(ntotalnon)nonkm−(ntotalnon−1)(non−1)kmn choose k
— ジュール

@Jules、素晴らしい、私はそのようなことが起こると確信していましたが、それを理解する時間がありませんでした。
— dan_waterworth

また、次のように直接その式に到達することができる:。次に、プラグイン( n t o t a lP(non=x)=P(non≤x)−P(non<x)=P(non≤x)−P(non≤x−1)用のP(NON≤X)。(ntotalx)(x/ntotal)kmP(non≤x)
— ジュール

2

ハッシュが均一に分散されていると仮定します。

ましょう挿入ハッシュの数です。我々が持っているので、私はにハッシュメートルの私たちが持っている場合は、ビンI - 1つのにハッシュをm個のビンと次のハッシュは、それらの一つに入るメートルのうちn個のビンか、我々は持っている場合は、私- 1つのにハッシュメートル- 1つのビンを、次のハッシュを行きます他のn − (m − 1 )ビンの1つに入れると、次のようになります。iimi−1mmni−1m−1n−(m−1)

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

書き換え:

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

我々はまた、持っているとP (M 、0 )= 0場合、M ≠ 0 とP (0 、iが)= 0場合、I ≠ 0。これにより、Pを計算するためのO (m i )動的プログラミングアルゴリズムが得られます。P (m 、i )を最大化するiの計算P(0,0)=1P(m,0)=0m≠0P(0,i)=0i≠0O(mi)iP(m,i) 最尤推定値を提供します。

このブルームフィルターに回ハッシュし、アイテムごとにk個のハッシュがあることがわかっている場合、アイテムの数はi / kです。iki/k

スピードアップするために、いくつかのことができます。1の係数は最大位置を変更しないため、省略できます。動的プログラミングテーブルをP(m、i)の複数の呼び出しと共有して、(漸近的な)実行時間をO(nm)に短縮できます。単一の最大値があると考えている場合は、iの反復を早期に停止し、実行時間O(jm)を取得できます。ここで、jはPが最大値をとるポイントですO(mlogn)。1nP(m,i)O(nm)iO(jm)jPO(mlog⁡n)


2

重要な考え方は、ゼロビットの数の期待値を概算することです。

各ビットについて、K個のハッシュ関数を使用したt挿入後にゼロになる可能性は次のとおりです:。(1−1N)Kt≈e−KtN

次に、ゼロのビット数の期待値は次のとおりです。

は観測値N−Mで近似Ne−KtNN−M

最後に、t = − Nを得ましたt=−NKln(1−MN)


1

n回の挿入後、特定のビットが1になる確率は、P = 1-(1-1 / m)^(kn)です。

X_iを離散ランダム変数とし、i番目の位置のビットが1の場合は1、それ以外の場合は0とします。X = X_1 + X_2 + .... + X_mとします。次に、E [X] = m *P。

セットされたビットの総数がSの場合、E [X] = Sはm * P = Sを意味します。これはnで解決できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.