HyperLogLogは、カウント・ディスティンクト問題のためのアルゴリズムで、多重集合内の異なる要素の数を概算します。[1]多重集合の異なる要素の正確な 濃度を計算するには、濃度に比例した量のメモリが必要ですが、これは非常に大きなデータ セットでは非現実的です。HyperLogLog アルゴリズムなどの確率的濃度推定器は、これよりもはるかに少ないメモリを使用しますが、濃度を概算することしかできません。HyperLogLog アルゴリズムは、1.5 kB のメモリを使用して、10 9を超える濃度を2% の標準精度 (標準誤差) で推定できます。[1] HyperLogLog は、以前の LogLog アルゴリズム[2]の拡張版であり、それ自体は 1984 年のFlajolet–Martin アルゴリズムから派生したものです。[3]
用語
Flajoletらによる原著論文[1]およびcount-distinct 問題に関する関連文献では、「カーディナリティ」という用語は、繰り返し要素を含むデータ ストリーム内の異なる要素の数を意味するために使用されています。ただし、多重集合の理論では、この用語は多重集合の各メンバーの多重度の合計を指します。この記事では、ソースとの一貫性を保つために Flajolet の定義を使用することにします。
アルゴリズム
HyperLogLogアルゴリズムの基礎は、均一に分布する乱数の多重集合の濃度は、集合内の各数値の2進表現における先頭のゼロの最大数を計算することによって推定できるという観察である。観測される先頭のゼロの最大数が nである場合、集合内の異なる要素の数の推定値は2nである。 [ 1]
HyperLogLog アルゴリズムでは、元のマルチセットの各要素にハッシュ関数を適用して、元のマルチセットと同じカーディナリティを持つ均一に分散された乱数のマルチセットを取得します。このランダムに分散されたセットのカーディナリティは、上記のアルゴリズムを使用して推定できます。
上記のアルゴリズムを使用して得られた単純な基数推定値には、分散が大きいという欠点があります。HyperLogLogアルゴリズムでは、マルチセットを多数のサブセットに分割し、これらのサブセットのそれぞれに含まれる数値の先頭のゼロの最大数を計算し、調和平均を使用して各サブセットの推定値を組み合わせてセット全体の基数の推定値を生成することで、分散が最小化されます。[4]
オペレーション
HyperLogLog には、セットに新しい要素を追加するadd 、セットのカーディナリティを取得するcount 、 2 つのセットの結合を取得するmergeという 3 つの主要な操作があります。派生操作の中には、交差のカーディナリティや、 merge 操作と count 操作を組み合わせた 2 つの HyperLogLog 間の差のカーディナリティなど、包含排他原理を使用して計算できるものもあります。
HyperLogLog のデータは、0 に初期化されたm 個のカウンター (または「レジスタ」)の配列Mに格納されます。多重集合Sから初期化された配列M は、S のHyperLogLogスケッチと呼ばれます。
追加
加算演算は、ハッシュ関数hを使用して入力データvのハッシュを計算し、最初のbビット ( bは) を取得し、それに 1 を加えて変更するレジスタのアドレスを取得します。残りのビットを使用して を計算し、左端の 1 の位置を返します。左端の位置は 1 です (つまり、先頭のゼロの数に 1 を加えた値です)。レジスタの新しい値は、レジスタの現在の値と の間の最大値になります。
カウント
カウント アルゴリズムは、 m 個のレジスタの調和平均を計算し、定数を使用してカウントの推定値を導出することから構成されます。
直感的には、n はMの未知の基数であり、各サブセットには要素 が含まれます。すると、はに近くなります。これらの量の 2 の調和平均は で、これは に近いはずです。したがって、 は近似的にnになります。
最後に、ハッシュ衝突によって 存在する体系的な乗法バイアスを修正するために定数が導入されます。
実用的な考慮事項
この定数は計算が簡単ではないが、次の式で近似できる[1]。
しかし、HyperLogLog 手法は、しきい値 を下回る小さな基数に対しては偏りがあります。元の論文では、小さな基数に対して、線形カウントと呼ばれる別のアルゴリズムを使用することを提案しています。[5]上記の推定値がしきい値 より小さい場合は、別の計算を使用できます。
- レジスタのカウントを 0 にします。
- の場合は、上記の標準 HyperLogLog 推定値を使用します。
- それ以外の場合は、線形カウントを使用します。
さらに、レジスタのサイズの限界に近づく非常に大きなカーディナリティ(32 ビット レジスタの場合)の場合、カーディナリティは次のように推定できます。
上記の下限と上限の補正により、誤差は次のように推定できます。
マージ
2つのHLL()のマージ操作は、レジスタの各ペアの最大値を取得することです。
複雑
複雑さを分析するために、データストリーミングモデル[6]が使用され、これは、固定された成功確率で近似値を得るために必要なスペースを分析する。HLLの相対誤差はであり、必要なスペースは、nがセットの基数、mがレジスタの数(通常は1バイト未満のサイズ)である。
追加操作はハッシュ関数の出力のサイズに依存します。このサイズは固定されているため、追加操作の実行時間は と見なすことができます。
カウント操作とマージ操作はレジスタの数mに依存し、理論的なコストはである。いくつかの実装( Redis ) [7]ではレジスタの数は固定されており、コストはドキュメントに記載されていると考えられる。
HLL++
HyperLogLog++アルゴリズムは、メモリ要件を削減し、いくつかの範囲の基数での精度を向上させるために、HyperLogLogアルゴリズムにいくつかの改良を提案している。[6]
- 元の論文で使用されていた 32 ビットの代わりに 64 ビットのハッシュ関数が使用されます。これにより、大きな基数でのハッシュ衝突が軽減され、広範囲の補正が不要になります。
- 線形カウントから HLL カウントに切り替えると、基数が小さい場合にバイアスが見つかります。この問題を軽減するために、経験的なバイアス補正が提案されています。
- レジスタのスパース表現は、小さな基数に対するメモリ要件を削減するために提案されており、基数が大きくなった場合には後で密な表現に変換できます。
ストリーミングHLL
データが単一のストリームで到着する場合、ヒストリカル逆確率推定器またはマルチンゲール推定器[8] [9]は HLLスケッチの精度を大幅に向上させ、所定のエラーレベルを達成するために36%少ないメモリを使用します。この推定器は、単一のストリーム上の重複を考慮に入れない近似個別カウントスケッチに最適であることが証明されています。
単一ストリームのシナリオでは、HLLスケッチの構築にもバリエーションが生まれます。HLL-TailCut+は、元のHLLスケッチよりもメモリ使用量が45%少なくなりますが、データの挿入順序に依存し、スケッチをマージできないという欠点があります。[10]
さらに読む
- 「HyperLogLog スケッチの新しいカーディナリティ推定アルゴリズム」(PDF) 。2016年 10 月 29 日閲覧。
参考文献
- ^ abcde Flajolet, Philippe; Fusy, Éric; Gandouet, Olivier; Meunier, Frédéric (2007). 「Hyperloglog: 近似最適カーディナリティ推定アルゴリズムの分析」(PDF) .離散数学および理論計算機科学論文集. AH .ナンシー、フランス: 137–156. CiteSeerX 10.1.1.76.4286 . 2016-12-11に取得。
- ^ Durand, M.; Flajolet, P. (2003). 「LogLog counting of large cardinality.」(PDF) . G. Di Battista および U. Zwick (編) 著。Lecture Notes in Computer Science . Annual European Symposium on Algorithms (ESA03). Vol. 2832. Springer. pp. 605–617.
- ^ Flajolet, Philippe; Martin, G. Nigel (1985). 「データベースアプリケーションのための確率的カウントアルゴリズム」(PDF) . Journal of Computer and System Sciences . 31 (2): 182–209. doi :10.1016/0022-0000(85)90041-8.
- ^ S Heule、M Nunkesser、A Hall (2013)。「HyperLogLog の実践: 最先端のカーディナリティ推定アルゴリズムのアルゴリズムエンジニアリング」(PDF)。第 4 節。
- ^ Whang, Kyu-Young; Vander-Zanden, Brad T; Taylor, Howard M (1990). 「データベースアプリケーションのための線形時間確率カウントアルゴリズム」. ACM Transactions on Database Systems . 15 (2): 208–229. doi : 10.1145/78922.78925 . S2CID 2939101.
- ^ ab 「HyperLogLog の実践: 最先端のカーディナリティ推定アルゴリズムのアルゴリズム エンジニアリング」 。2014年 4 月 19 日閲覧。
- ^ 「PFCOUNT – Redis」.
- ^ Cohen, E. (2015 年 3 月). 「全距離スケッチの再考: 大規模グラフ解析のための HIP 推定量」. IEEE Transactions on Knowledge and Data Engineering . 27 (9): 2320–2334. arXiv : 1306.3284 . doi :10.1109/TKDE.2015.2411606.
- ^ Ting, D. ( 2014年 8 月)。「Streamedapproximate counting of distinct elements」。知識発見とデータマイニングに関する第 20 回 ACM SIGKDD 国際会議の議事録。pp. 442–451。doi : 10.1145 /2623330.2623669。ISBN 978-1-4503-2956-9. S2CID 13179875。
- ^ Xiao, Q.; Zhou, Y.; Chen, S. (2017 年 5 月)。「少ないビット数でより良く: 大規模データ ストリームのカーディナリティ推定のパフォーマンスを向上」IEEE INFOCOM 2017 - IEEE コンピュータ通信会議。pp. 1–9。doi :10.1109 / INFOCOM.2017.8057088。ISBN 978-1-5090-5336-0. S2CID 27159273。
