解读Cardinality Estimation算法(第二部分:Linear Counting)
在上一篇文章中,我們知道傳統的精確基數計數算法在數據量大時會存在一定瓶頸,瓶頸主要來自于數據結構合并和內存使用兩個方面。因此出現了很多基數估計的概率算法,這些算法雖然計算出的結果不是精確的,但誤差可控,重要的是這些算法所使用的數據結構易于合并,同時比傳統方法大大節省內存。
在這一篇文章中,我們討論Linear Counting算法。
簡介
Linear Counting(以下簡稱LC)在1990年的一篇論文“A linear-time probabilistic counting algorithm for database applications”中被提出。作為一個早期的基數估計算法,LC在空間復雜度方面并不算優秀,實際上LC的空間復雜度與上文中簡單bitmap方法是一樣的(但是有個常數項級別的降低),都是O(Nmax)O(Nmax),因此目前很少單獨使用LC。不過作為Adaptive Counting等算法的基礎,研究一下LC還是比較有價值的。
基本算法
思路
LC的基本思路是:設有一哈希函數H,其哈希結果空間有m個值(最小值0,最大值m-1),并且哈希結果服從均勻分布。使用一個長度為m的bitmap,每個bit為一個桶,均初始化為0,設一個集合的基數為n,此集合所有元素通過H哈希到bitmap中,如果某一個元素被哈希到第k個比特并且第k個比特為0,則將其置為1。當集合所有元素哈希完成后,設bitmap中還有u個bit為0。則:
推導及證明
(對數學推導不感興趣的讀者可以跳過本節)
顯然每個桶的值服從參數相同0-1分布,因此u服從二項分布。由概率論知識可知,當n很大時,可以用正態分布逼近二項分布,因此可以認為當n和m趨于無窮大時u漸進服從正態分布。
因此u的概率密度函數為:
由于我們觀察到的空桶數u是從正態分布中隨機抽取的一個樣本,因此它就是μ的最大似然估計(正態分布的期望的最大似然估計是樣本均值)。
又由如下定理:
偏差分析
下面不加證明給出如下結論:
以上結論的推導在“A linear-time probabilistic counting algorithm for database applications”可以找到。
算法應用
在應用LC算法時,主要需要考慮的是bitmap長度m的選擇。這個選擇主要受兩個因素的影響:基數n的量級以及容許的誤差。這里假設估計基數n的量級大約為N,允許的誤差為??,則m的選擇需要遵循如下約束。
誤差控制
這里以標準差作為誤差。由上面標準差公式可以推出,當基數的量級為N,容許誤差為??時,有如下限制:
將量級和容許誤差帶入上式,就可以得出m的最小值。
滿桶控制
由LC的描述可以看到,如果m比n小太多,則很有可能所有桶都被哈希到了,此時u的值為0,LC的估計公式就不起作用了(變成無窮大)。因此m的選擇除了要滿足上面誤差控制的需求外,還要保證滿桶的概率非常小。
上面已經說過,u滿足二項分布,而當n非常大,p非常小時,可以用泊松分布近似逼近二項分布。因此這里我們可以認為u服從泊松分布(注意,上面我們說u也可以近似服從正態分布,這并不矛盾,實際上泊松分布和正態分布分別是二項分布的離散型和連續型概率逼近,且泊松分布以正態分布為極限):
下圖是論文作者預先計算出的關于不同基數量級和誤差情況下,m的選擇表:
可以看出精度要求越高,則bitmap的長度越大。隨著m和n的增大,m大約為n的十分之一。因此LC所需要的空間只有傳統的bitmap直接映射方法的1/10,但是從漸進復雜性的角度看,空間復雜度仍為O(Nmax)O(Nmax)。
合并
LC非常方便于合并,合并方案與傳統bitmap映射方法無異,都是通過按位或的方式。
小結
這篇文章主要介紹了Linear Counting。LC算法雖然由于空間復雜度不夠理想已經很少被單獨使用,但是由于其在元素數量較少時表現非常優秀,因此常被用于彌補LogLog Counting在元素較少時誤差較大的缺陷,實際上LC及其思想是組成HyperLogLog Counting和Adaptive Counting的一部分。
在下一篇文章中,我會介紹空間復雜度僅有O(log2(log2(Nmax)))O(log2(log2(Nmax)))的基數估計算法LogLog Counting。
總結
以上是生活随笔為你收集整理的解读Cardinality Estimation算法(第二部分:Linear Counting)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解读Cardinality Estima
- 下一篇: 解读Cardinality Estima