如果一个数据流,其中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.选取一个任意元素a,,a为j的概率为。
2.然后选取a出现的某个位置,并统计此位置后a的出现次数。
假设A和R分别是算法中a和r的取值,X为算法的输出结果。
故有:
所以得证X就是的无偏估计。
我们还可以证明X的方差满足下面公式:
四、改进方法
这里我们无法像之前几篇博客里直接使用median trick。因为直接估计的方差比较大,无法保证最终结果偏离真实值的概率低于1/2。我们先运行1组结果,一组内运行多次结果,取均值,这样可以将方差降下来。然后重复多次,再取均值的中位数,这样就可以把偶然因素的影响降低到几乎没有的地步。
该方法有个定理做理论保证。
假设X是Q的一个无偏估计,之间相互独立,且和X的分布相同。另外,,。令,则。
原文地址:http://blog.csdn.net/dm_ustc/article/details/46011557