写作不易,转载请注明出处:
http://blog.csdn.net/wbin233/article/details/78752597 ,谢谢。
简介
Linear Counting是KYU-YOUNG WHANG,BRAD T. VANDER-ZANDEN和HOWARD M. TAYLOR大佬们1990年发表的论文《A linear-time probabilistic counting algorithm for database applications》中提出的基于概率的基数估计算法。
基本思想及实现
Linear Counting的实现方式非常简单。
首先定义一个hash函数:
function hash(x): -> [0,1,2,…,m-1],假设该hash函数的hash结果服从均匀分布。
接着定义一个长度为m的bit数组,开始每一位上都初始化为0.
然后对可重复集合里的每个元素进行hash得到k,如果bitmap[k]为0则置1。
最后统计bitmap数组里为0的位数u。
设集合基数为n,则有:
n^=−mlnum ,且其为n的最大似然估计。
简单的伪代码如下:
举个例子说明下吧,如下:
集合中共有11个元素,hash函数映射到[0,7]中(m=8)且结果服从均匀分布。如图hash结果后共有2个bit为0,即u=2。代入上述公式可得估计结果为11.1(实际值为10)。
【该例子只为了说明算法的过程,实际中都是大数据中估计。】
公式证明
先说明下述中使用到的变量。
变量 | 含义 |
---|---|
n | 基数 |
q | 总数 |
m | bit数组的长度(hash区间) |
t | n/m |
Un | hash后bit数组为0的位数 |
Vn | Un/m |
p | E(Vn) |
由于hash函数映射后的hash结果服从均匀分布,因此任意一数选中bitmap数组的某一个bit概率为 1m 。
设 Aj 为事件“经过n个不同元素哈希后,第j个桶值为0”,则:
P(Aj)=(1−1m)n ,
P(Aj∩Ak)=(1−2m)n,j≠k.
又每个bit是相互独立的,即 Aj 服从均匀分布。
则 Un 的数学期望为:
E(Un)=∑mj=1P(Aj)=m(1−1m)n=m(((1+1−m)−m)−nm)≅me−nm=me−t,当n,m→∞
【数学上证明: limx→∞(1+1x)x=e 】
所以: E(Un)=me−nm
即: n=−mlnE(Un)m
显然,bitmap里每个bit的值服从相同的0-1分布,因此 Un 服从二项分布。
由概率论与数理统计知识可知,当n很大时,可以用正态分布逼近二项分布,因此可以认为当n和m趋于无穷大时 Un 渐进服从正态分布。
由于我们观察到的空桶数 Un 是从正态分布中随机抽取的一个样本,因此它就是μ的最大似然估计(正态分布的期望的最大似然估计是样本均值)。又由如下定理:
设f(x)是可逆函数且 x^ 是x的最大似然估计,则f( x^ )是f(x)的最大似然估计。
且 −mlnxm 是可逆函数,则 n^=−mlnUnm 是 n=−mlnE(Un)m 的最大似然估计。
Un和Vn的期望和方差
先给出结论,在 m,n→∞ 的前提下有:
E(Un)=me−nm=me−t.
Var(Un)=me−t(1−(1+t)e−t).
又有 Vn=Unm,
E(Vn)=e−t.