基数估计算法(二):Linear Counting算法
写作不易,转载请注明出处:
http://blog.****.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,则有:
简单的伪代码如下:
举个例子说明下吧,如下:
集合中共有11个元素,hash函数映射到[0,7]中(m=8)且结果服从均匀分布。如图hash结果后共有2个bit为0,即u=2。代入上述公式可得估计结果为11.1(实际值为10)。
【该例子只为了说明算法的过程,实际中都是大数据中估计。】
公式证明
先说明下述中使用到的变量。
变量 | 含义 |
---|---|
n | 基数 |
q | 总数 |
m | bit数组的长度(hash区间) |
t | n/m |
|
hash后bit数组为0的位数 |
|
|
p |
|
由于hash函数映射后的hash结果服从均匀分布,因此任意一数选中bitmap数组的某一个bit概率为
设
又每个bit是相互独立的,即
则
【数学上证明:
所以:
即:
显然,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的期望和方差
先给出结论,在
又有
详细推导过程如下:
通过上文,我们已经可以获得
则
因此,可以计算
在上述计算过程中,我们近似了
具体推导过程如下:
其中用到了泰勒展开:
又
偏差-Bias(n^n) 的计算
同样的,先给出结论:
可以得到Bias,t和n之间的关系,如下图:
详细推导如下:
因此可以写成:
令
由著名的泰勒展开公式有:
保留泰勒展开里的第一项和第三项(原因翻阅论文,有点儿复杂),得:
之前已经计算过,
代入得:
因此,
标准误差-StdError(n^n)的计算
可以得到StdError,t和n之间的关系,如下图:
这一次,在
可得:
因此,
bit数组的长度m的选取
先给出结论,m应该满足:
a表示
【下文给出结论,当
详细推导如下:
1.证明
假设用户容许的标准误差(standard error)为
转化得:
因此给定容许的误差
2.证明
显然,如果m远小于n,则显然出现满桶的概率特别大,因此计算不出结果【因为
因此m的选择除了要满足上面误差控制的需求外,还要保证满桶的概率非常小。
我们可以让空bit的位数与0有一个a倍的偏差。即:
其中,
因此可得:
化简之:
综上,m应该满足:
满桶控制
由概率论与数理统计中可知,当n非常大,p非常小时,可以用泊松分布(Poisson distribution.)近似逼近二项分布。
如果
则认为
即:
因此满桶的概率为:
当
又因为泊松分布中,数学期望E(x)和方差Var(x)均等于
所以
代入得:
所以:
意味着当
根据
利用二分法(bisection method),给出当a=
其中,
当
当
当
从表中也可以看出精度要求越高(
并且随着m和n的增大,m大约为n的十分之一。
所以Linear Counting的空间复杂度仍为
合并
Linear Counting非常方便于合并,直接通过按位或的方式即可。
参考资料
- WHANG, K.-Y., VANDER-ZANDEN, B., AND TAYLOR, H. A linear-time probabilistic counting algorithm for database applications. ACM Transactions on Database Systems 15, 2 (1990), 208–229.
- http://blog.codinglabs.org/articles/algorithms-for-cardinality-estimation-part-ii.html