HyperLogLog

HyperLogLog, büyük veri setlerindeki benzersiz elemanların sayısını (cardinality) tahmin etmek için kullanılan olasılıksal bir algoritmadır.

Hyperloglog algoritması $10^9$ a kadar olan kardinaliteler için tek bir 32-bit hash fonksiyonu kullanılacak şekilde ve $m = 2^p, p\in [4,16]$ olacak şekilde tasarlanmıştır.

Kaynak: https://chengweihu.com/hyperloglog
Kaynak: https://chengweihu.com/hyperloglog

Algoritma aşağıdaki şekilde özetlenebilir:

  1. Verisetindeki her bir eleman hash fonksiyonundan geçirilerek öğeler sabit boyutlu rastgele dağılmış sayılara dönüştürülür, buna denk olarak $M$ uzunluğunda ikili (binary) dizelere dönüştürülmüş olur:

$$ h(x) = i = \sum_{k=0}^{M-1}i_k\cdot 2^k:=(i_0i_1\ldots i_{M-1})_2,i_k\in{0,1} $$

  1. Hesaplanan hash değerleri iki parçaya bölünür: ilk $k$-bit öğenin hangi kovaya (bucket) olduğunu belirler. Kalan bitler, o kovada saklanacak değerin hesaplanmasında kullanılır.

  2. Her bir kayıtta, hash değerinin ikinci kısmındaki en soldaki 1-bitin konumu izlenir.

    • Örneğin, ilk 4 bitin birinci kısmı ifade ettiği bir hash için, $h(A)=1010\mathbf{1}0...$ ise, en soldaki 1-bitin konumu 1; $h(B)=11001\mathbf{1}$ ise, en soldaki 1-bitin konumu 2 olacaktır.
  3. İlk $k$-bit kova indeksi olarak kullanıldığından, $2^k$ adet kova oluşturulur. Her kova için, o kovada en büyük en soldaki 1-bit konumu saklanır.

  4. Son olarak, bu kovaların en büyük değerleri kullanılarak, tahmini kardinalite hesaplanır:

$$ \hat{n} = \alpha_m \cdot m^2 \cdot \left(\sum_{j=0}^{m-1} 2^{-M[j]}\right)^{-2} $$

Bu formülde:

Düzeltme katsayısı için sık kullanılan bazı değerler aşağıdaki gibidir:

$m$ $\alpha_m$
$2^4$ 0.673
$2^5$ 0.697
$2^6$ 0.709
$\gt 2^7$ $\frac{0.7213\cdot m}{m+1.079}$

Bir sonraki yazıda görüşmek üzere.


Kaynaklar