必威体育Betway必威体育官网
当前位置:首页 > IT技术

Linear Counting算法

时间:2019-08-26 18:10:00来源:IT技术作者:seo实验室小编阅读:52次「手机版」
 

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。则:

n^=−mlogumn^=−mlogum

为n的一个估计,且为最大似然估计(MLE)。

示意图如下:

推导及证明

(对数学推导不感兴趣的读者可以跳过本节)

由上文对H的定义已知n个不同元素的哈希值服从独立均匀分布。设AjAj为事件“经过n个不同元素哈希后,第j个桶值为0”,则:

P(Aj)=(1−1m)nP(Aj)=(1−1m)n

又每个桶是独立的,则u的期望为:

E(u)=∑mj=1P(Aj)=m(1−1m)n=m((1+1−m)−m)−n/mE(u)=∑j=1mP(Aj)=m(1−1m)n=m((1+1−m)−m)−n/m

当n和m趋于无穷大时,其值约为me−n/mme−n/m

令:

E(u)=me−n/mE(u)=me−n/m

得:

n=−mlogE(u)mn=−mlogE(u)m

显然每个桶的值服从参数相同0-1分布,因此u服从二项分布。由概率论知识可知,当n很大时,可以用正态分布逼近二项分布,因此可以认为当n和m趋于无穷大时u渐进服从正态分布。

因此u的概率密度函数为:

f(x)=1σ2π√e−(x−μ)22σ2f(x)=1σ2πe−(x−μ)22σ2

由于我们观察到的空桶数u是从正态分布中随机抽取的一个样本,因此它就是μμ的最大似然估计(正态分布的期望的最大似然估计是样本均值)。

又由如下定理:

f(x)f(x)是可逆函数x^x^是xx的最大似然估计,则f(x^)f(x^)是f(x)f(x)的最大似然估计。

−mlogxm−mlogxm是可逆函数,则n^=−mlogumn^=−mlogum是−mlogE(u)m=n−mlogE(u)m=n的最大似然估计。

偏差分析

下面不加证明给出如下结论:

Bias(n^n)=E(n^n)−1=et−t−12nBias(n^n)=E(n^n)−1=et−t−12n

StdERROR(n^n)=m√(et−t−1)1/2nStdError(n^n)=m(et−t−1)1/2n

其中t=n/mt=n/m

以上结论的推导在“A linear-time probabilistic counting algorithm for database applications”可以找到。

算法应用

在应用LC算法时,主要需要考虑的是bitmap长度m的选择。这个选择主要受两个因素的影响:基数n的量级以及容许的误差。这里假设估计基数n的量级大约为N,允许的误差为ϵϵ,则m的选择需要遵循如下约束。

误差控制

这里以标准差作为误差。由上面标准差公式可以推出,当基数的量级为N,容许误差为ϵϵ时,有如下限制:

m>et−t−1(ϵt)2m>et−t−1(ϵt)2

将量级和容许误差带入上式,就可以得出m的最小值。

满桶控制

由LC的描述可以看到,如果m比n小太多,则很有可能所有桶都被哈希到了,此时u的值为0,LC的估计公式就不起作用了(变成无穷大)。因此m的选择除了要满足上面误差控制的需求外,还要保证满桶的概率非常小。

上面已经说过,u满足二项分布,而当n非常大,p非常小时,可以用泊松分布近似逼近二项分布。因此这里我们可以认为u服从泊松分布(注意,上面我们说u也可以近似服从正态分布,这并不矛盾,实际上泊松分布和正态分布分别是二项分布的离散型和连续型概率逼近,且泊松分布以正态分布为极限):

当n、m趋于无穷大时:

Pr(u=k)=(λkk!)e−λPr(u=k)=(λkk!)e−λ

因此:

Pr(u=0)<e−5=0.007Pr(u=0)<e−5=0.007

由于泊松分布的方差为λλ,因此只要保证u的期望偏离0点5–√5的标准差就可以保证满桶的概率不大约0.7%。因此可得:

m>5(et−t−1)m>5(et−t−1)

综上所述,当基数量级为N,可接受误差为ϵϵ,则m的选取应该遵从

m>β(et−t−1)m>β(et−t−1)

其中β=max(5,1/(ϵt)2)β=max(5,1/(ϵt)2)

下图是论文作者预先计算出的关于不同基数量级和误差情况下,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。

相关阅读

算法导论 中文 第三版 第2-25章部分课后习题答案

由于最近在学习算法相关的东西,发现课后的习题没有答案,给我造成很大困扰,以下分享了从网上找到的答案链接: https://pan.baidu.com/

Dijkstra算法 java实现

import java.util.HashMap; import java.util.HashSet; import java.util.Map.Entry; /** * * Dijkstra算法 * 适用范围:没有

MD5的加密和解密算法

先解释下:MD5是不可逆,这里的加密解密,你可以看到是对MD5算法先加密后解密,而不是对MD5的解密package com.test; import java.secur

百度瑞丽算法bug致圈内地震后站长难以言表的痛

2015年元旦对于很多中国人来说是一个欢快的节日,但是对于一些互联网站长来说则是一个黑暗的日子,自2015年1月3日开始中国最大的互联

Non-local算法笔记

论文:Non-local Neural Networks for Video Classification 论文链接:https://arxiv.org/abs/1711.07971 代码链接:https://github.c

分享到:

栏目导航

推荐阅读

热门阅读