基数估计算法(二):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,则有:
n^=mlnum,且其为n的最大似然估计。


简单的伪代码如下:
基数估计算法(二):Linear Counting算法


举个例子说明下吧,如下:

基数估计算法(二):Linear Counting算法
集合中共有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)=(11m)n,
P(AjAk)=(12m)n,jk.

又每个bit是相互独立的,即Aj服从均匀分布。
Un的数学期望为:
E(Un)=mj=1P(Aj)=m(11m)n=m(((1+1m)m)nm)menm=met,n,m

【数学上证明:limx(1+1x)x=e

所以:E(Un)=menm

即:n=mlnE(Un)m

显然,bitmap里每个bit的值服从相同的0-1分布,因此Un服从二项分布。
由概率论与数理统计知识可知,当n很大时,可以用正态分布逼近二项分布,因此可以认为当n和m趋于无穷大时Un渐进服从正态分布。
由于我们观察到的空桶数Un是从正态分布中随机抽取的一个样本,因此它就是μ的最大似然估计(正态分布的期望的最大似然估计是样本均值)。

又由如下定理:

设f(x)是可逆函数且x^是x的最大似然估计,则f(x^)是f(x)的最大似然估计。
mlnxm是可逆函数,n^=mlnUnmn=mlnE(Un)m的最大似然估计。

UnVn

先给出结论,在m,n的前提下有:
E(Un)=menm=met.

Var(Un)=met(1(1+t)et).

又有 Vn=Unm

E(Vn)=et.

Var(Vn)=1met(1(1+t)et).


详细推导过程如下:

通过上文,我们已经可以获得Un的数学期望为:
E(Un)=menm=metasm,n

U2n的数学期望为:
E(U2n)
=E((mj=1P(Aj))2)
=E(P(A1)P(A1)+P(A1)P(A2)+...+P(A1)P(Am)+P(A2)P(A1)+...+P(Am)P(Am))
=E(mj=1A2j)+2E(mj=1j1i=1P(Ai)P(Aj))
=m(11m)n+2(m(m1)2)(12m)nasm,n

因此,可以计算Un的方差(variance):
Var(Un)
=E(U2n)E(Un)2
=m((11m)n+(m1)(12m)nm(11m)2n)
=m((11m)n(12m)n+m((12m)n(11m)2n))
=m(((1+1m)m)nm((1+1m2)m2)2nm+m((12m)n(11m)2n))
m(ete2tte2t)asm,n
=met(1(1+t)et)asm,n

在上述计算过程中,我们近似了
m((12m)n(11m)2n)te2t.

具体推导过程如下:
基数估计算法(二):Linear Counting算法
基数估计算法(二):Linear Counting算法
其中用到了泰勒展开:
ln(1+x)=xx22+x33x44+...,1<xx

Vn=Unm,因此可以计算Vn的期望和方差:

E(Vn)=1mE(Un)=etasm,n

Var(Vn)=1m2Var(Un)=1met(1(1+t)et)asm,n

偏差-Bias(n^n)的计算

同样的,先给出结论:
Bias(n^n)=E(n^n)1=ett12n.

可以得到Bias,t和n之间的关系,如下图:

基数估计算法(二):Linear Counting算法


详细推导如下:
Vn=Unmn^=mlnUnm
因此可以写成:n^=mlnVn.

p=E(Vn)=etf(Vn)=ln(Vn).

由著名的泰勒展开公式有:
基数估计算法(二):Linear Counting算法
保留泰勒展开里的第一项和第三项(原因翻阅论文,有点儿复杂),得:
E(n^)=mt+m2p2E(Vnp)2.

之前已经计算过,E(Vnp)2=Var(Vn)=1met(1(1+t)et).

代入得:E(n^)=n+ett12.

因此,Bias(n^n)=E(n^n)1=ett12n.

标准误差-StdError(n^n)

StdError(n^n)=m(ett1)12n

可以得到StdError,t和n之间的关系,如下图:
基数估计算法(二):Linear Counting算法


这一次,在n^=mf(Vn)的泰勒展开式中,保留前两项,得:
n^=m(tVnpp).
可得:
基数估计算法(二):Linear Counting算法
因此,n^n的标准误差(standard error)为:
StdError(n^n)=m(ett1)12n

bit数组的长度m的选取

先给出结论,m应该满足:
m>β(ett1)β=max(a2,1(ϵt)2)

ϵ表示用户容许的标准误差(standard error);

a表示Un与0的偏差倍数。
【下文给出结论,当a>5E(Un)>5StdDev(Un)时,P(Un=0)<0.007.


详细推导如下:

1.证明 m>ett1(ϵt)2.

假设用户容许的标准误差(standard error)为ϵ,则根据上面标准差公式可以得到:
StdError(n^n)=m(ett1)12n<ϵ
转化得:

m>ett1(ϵt)2.
因此给定容许的误差ϵ 以及相应的量级t,可求出满足该情况的相应m的大小。

2.证明m>a2(ett1)

显然,如果m远小于n,则显然出现满桶的概率特别大,因此计算不出结果【因为Un=0,代入公式结果为无穷大】。

因此m的选择除了要满足上面误差控制的需求外,还要保证满桶的概率非常小。

我们可以让空bit的位数与0有一个a倍的偏差。即:
E(Un)aStdDev(Un)>0.

其中,E(Un)=metStdDev(Un)=met(1(1+t)et)

因此可得:met>amet(1(1+t)et)

化简之: m>a2(ett1)

综上,m应该满足:

m>β(ett1)β=max(a2,1(ϵt)2)

满桶控制

由概率论与数理统计中可知,当n非常大,p非常小时,可以用泊松分布(Poisson distribution.)近似逼近二项分布。

如果 menmλasn,m.
则认为Un服从泊松分布。

即:limn,mPr(Un=k)=λkk!eλ.

E(Un)=menm=λ.

因此满桶的概率为:
Pr(Un=0)=eλ.

a>5时,有E(Un)>5StdDev(Un).

又因为泊松分布中,数学期望E(x)和方差Var(x)均等于λ
所以 E(Un)=Var(Un)=λStdDev(Un)=λ

代入得:λ>5λ,即λ>5

所以:Pr(Un=0)=eλ<e5=0.007(0.7%).
意味着当a>5时,满桶的概率小于0.7%。


根据m>β(ett1)β=max(a2,1(ϵt)2)

利用二分法(bisection method),给出当a=5(满桶概率小于0.7%)时,不同基数数量级以及标准误差(0.01和0.1)时,m的选择表:

基数估计算法(二):Linear Counting算法

其中,
ϵ=0.01时,1(ϵt)2决定β

ϵ=0.1并且n1000时,1(ϵt)2决定β

ϵ=0.1并且n>1000时,a2决定β

从表中也可以看出精度要求越高(ϵ=0.01),则bitmap的长度越大。
并且随着m和n的增大,m大约为n的十分之一。

所以Linear Counting的空间复杂度仍为O(N)

合并

Linear Counting非常方便于合并,直接通过按位或的方式即可。

参考资料