Answers:
P2算法是一个不错的发现。它通过对分位数进行几次估计,定期更新它们,以及使用二次(非线性,非三次)插值来估计分位数来工作。作者声称二次插值在尾部比线性插值效果更好,三次插值会变得过于繁琐和困难。
您没有确切说明这种方法对“重尾”数据如何失败,但是很容易猜测:在收集大量数据之前,对重尾分布的极端分位数的估计将是不稳定的。但是,即使您要存储所有数据,这也会(在较小程度上)成为一个问题,所以不要指望奇迹!
无论如何,为什么不设置辅助标记(我们将它们称为和,您可以肯定在其中确定分位数,并存储和之间的所有数据?当缓冲区填满时,您将必须更新这些标记,并始终保持。一个简单的算法可以通过组合(a)当前分位数的P2估计和(b)存储的小于的数据数量和大于的数据数量的。以这种方式,您可以像确定整个数据集始终可用一样,高确定性地估计分位数,但是您只需要一个相对较小的缓冲区即可。X 6 X 0 X 6 X 0 ≤ X 6 X 0 X 6
具体来说,我提议一种数据结构来维护有关数据值的序列的部分信息。在这里,是一个链表n x 1,x 2,… ,x n y
在这种表示法中,表示到目前为止读取的值中最小的。 是一个常数,是缓冲区的大小。我个 Ñ X 米ÿ
该算法首先用遇到的前数据值填充并将它们按从小到大的排序顺序放置。令为要估计的分位数;例如, = 0.99。读取,可以执行以下三种操作: m q q x n + 1
如果,则递增。 k
如果,则什么也不做。
否则,将 插入。 ÿ
无论如何,将递增。
所述插入件的过程放到以排序的顺序,然后消除在极端值中的一个: ÿ ÿ
如果,则从删除并增加;x (n )[ k + 1 ] y k
否则,从删除。 y
如果足够大,则此过程将很有可能将分布的真实分位数括起来。在任何阶段都可以按照和 ,则可能位于。(我相信只需要像最大数据量()的平方根一样缩放,但是我没有进行严格的分析来证明这一点。)无论如何,该算法将检测它是否成功(通过比较和与)。Ñ X (Ñ )[ ⌊ q Ñ ⌋ ] X (Ñ )[ ⌈ q Ñ ⌉ ] ý米ñ ķ / Ñ (ķ + 米)/ Ñ q
使用和(最困难的情况)对多达100,000个值进行测试,表明该算法在获得的正确值时成功率为99.5%。 。对于值的流,这将仅需要200万的缓冲区(但最好是3或400万)。在缓冲区中使用排序的双链表需要 =,同时标识和删除max(或min)是操作。相对昂贵的插入通常只需完成 q=0.5X(Ñ )[ ⌊ q Ñ ⌋ ] Ñ=10 12 Ö(日志( √O(log(N))O(1)O( √O(N+ √次。因此,该算法的计算成本为时间,存储时为。O( √
我认为Whuber的建议很好,我会先尝试一下。但是,如果您发现您确实不能容纳存储或由于其他原因而无法解决问题,那么这里是对P2进行另一种概括的想法。它并不像胡佛所建议的那样详细-更像是研究思路,而不是解决方案。
就像原始P2算法建议的那样,您无需跟踪,,,和分位数,而只需跟踪更多的分位数(但仍为常数)即可。看起来该算法以一种非常直接的方式允许这样做;您需要做的就是为输入点计算正确的“存储桶”,以及更新分位数的正确方法(通常使用相邻数字)。p / 2 p (1 + p )/ 2 1
假设您跟踪点。您可以尝试跟踪位于,,,,,,,的分位数,(等距地找出和之间以及和之间的点),甚至使用个形式为和。如果0 p / 12 ... p ⋅ 11 / 12 p p + (1 - p )/ 12 ... p + 11 ⋅ (1 - p )/ 12 1 0 p p 1个22 p / 2 ⋅ (1个+ COS (2 我− 1 )π 接近或,您可以尝试在质量概率较小的一侧放置较少的点,而在另一侧放置较多的点。
如果您决定进行此操作,那么我(可能还有该网站上的其他人)将有兴趣知道它是否有效...
Press等人,数值食谱 8.5.2“任意分位数的单遍估计” p。435,给出一个c ++类IQAgent,它更新分段线性近似cdf。
可以根据确定在线数据集中位数的算法进行调整。有关更多信息,请参见此stackoverflow帖子-https: //stackoverflow.com/questions/1387497/find-median-value-from-a-growing-set
我看一下分位数回归。您可以使用它来确定要查看的所有分位数的参数估计。它不对正态性做任何假设,因此可以很好地处理异方差性,并且可以滚动窗口使用。它基本上是L1-Norm的惩罚回归,因此它在数字上不太密集,并且有相当功能齐全的R,SAS和SPSS软件包以及一些matlab实现。这是主要和R包Wiki的更多信息。
编辑:
查看数学堆栈交换交叉链接:有人找到了几篇论文,这些论文实质上提出了一个非常简单的想法,即只使用滚动顺序统计窗口来估计分位数。从字面上看,您要做的就是将值从最小到最大进行排序,选择所需的分位数,然后在该分位数内选择最高值。如果您认为最新的观察结果更能代表实际情况,则显然可以将其更多地考虑在内。这可能会给出粗略的估计,但是这样做相当简单,您不必进行定量繁重的工作。只是一个想法。
可以在线估计(和跟踪)分位数(分位数回归的参数也是如此)。从本质上讲,这归结为定义分位数回归(分位数由仅包含截距的模型表示的分位数)的检查损失函数的随机梯度下降,例如,在观察值到达时更新未知参数。
请参阅Bell Labs的论文“大规模跟踪的增量分位数估计”( ftp://ftp.cse.buffalo.edu/users/azhang/disc/disc01/cd1/out/papers/kdd/p516-chen.pdf)