数据流基本问题--矩估计(一)

在前面我们谈到了独立元素计数的问题。在本文中,我们将独立元素计数问题推广到更一般的问题,也就是矩估计问题。我们将先介绍矩的定义,然后介绍一个无偏的估计方法,最后介绍如何改进结果。这里还是讨论内存容量不够的情况。

一、矩估计

如果一个数据流,其中m为数据流的大小,。我们可以定义每个元素

出现的次数,其中为第i个元素出现的次数。则流的k阶矩(k-th moment)是所有出现次数取k次方的和。

下面我们看看k的一些特殊取值。

1.如果k=0时,,所以0阶矩就是数据流中独立元素数目,我们可以使用前面

博客中的方法进行估计。

2.如果k=1时,就是流中所有元素出现次数之和,其实也就是流的总长度m。所以1阶矩的计算非常容易。

3.如果K=2时,的计算相对来说麻烦一些。二阶矩度量的是流中元素分布的均匀性。如果我们有个长度为100的流,

其中不同的元素个数为11个。最均匀的分布就是:其中10个元素出现9次,1个元素出现10次,这时二阶矩为910。

反,另一种极端情况是一个元素出现了90次,其余10个元素各出现1次,此时二阶矩为8110。

二、具体算法

这里给出的算法非常简单,但是计算结果仍然是的无偏估计。

算法的具体过程就是从流中随机选取一个位置,该位置元素为a。统计数据流的总长度m,还有数据流在选取位置后a的出现次数r。则最终的估计值为

这里有个问题就是,在处理数据流之前我们并不知道m的取值,此时如何从流中随机选取一个位置呢?这就涉及到我们之前讲的蓄水池抽样算法(具体可以参见之前的博客)。该随机选取位置的步骤具体体现在算法的第二步。

数据流基本问题--矩估计(一)_第1张图片

三、算法的评估

这种算法不是该问题的最优算法,但是最容易理解和分析的。我们先对算法的产生结果是的无偏估计进行证明。该算法其实相当于两步:

1.选取一个任意元素a,,a为j的概率为

2.然后选取a出现的某个位置,并统计此位置后a的出现次数。

假设A和R分别是算法中a和r的取值,X为算法的输出结果。

数据流基本问题--矩估计(一)_第2张图片

故有:


所以得证X就是的无偏估计。

我们还可以证明X的方差满足下面公式:


四、改进方法

这里我们无法像之前几篇博客里直接使用median trick。因为直接估计的方差比较大,无法保证最终结果偏离真实值的概率低于1/2。我们先运行1组结果,一组内运行多次结果,取均值,这样可以将方差降下来。然后重复多次,再取均值的中位数,这样就可以把偶然因素的影响降低到几乎没有的地步。

该方法有个定理做理论保证。

假设X是Q的一个无偏估计,之间相互独立,且和X的分布相同。另外,。令,则






你可能感兴趣的:(数据流算法)