具有O(1)更新效率的稳健均值估计


9

我正在寻找对具有特定属性的均值的可靠估计。我有一组要为其计算此统计信息的元素。然后,我一次添加一个新元素,对于每个其他元素,我想重新计算统计信息(也称为在线算法)。我希望此更新计算速度很快,最好是O(1),即不依赖于列表的大小。

通常的平均值具有此属性,可以有效地对其进行更新,但对异常值不具有鲁棒性。均值的典型鲁棒估计量(如四分位数间均值和修剪均值)无法有效更新(因为它们需要维护排序列表)。

对于可以有效计算/更新的可靠统计信息的任何建议,我将不胜感激。


为什么不仅仅使用数据的初始段(例如前100个或前1000个或其他)来建立“围栏”以筛选异常值?您无需再次更新它们,因此无需维护其他数据结构。
whuber

@whuber我无法保证初始样本将代表其余数据。例如,给我数据的顺序不是随机的(想象一个场景,我先给我更高的值,然后是更低的值)。
2013年

1
这是至关重要的观察。这意味着您需要比平时更加​​小心,因为一开始您将获得对平均较高离群值的“可靠”估计。通过继续更新该估计,您可能会抛出所有较低的值。因此,您将需要一个数据结构,其中记录并定期更新整个数据分布的关键部分。在我们的主题中使用关键字“在线”和“分位数”查看想法。stats.stackexchange.com/questions/3372stats.stackexchange.com/q/3377中有两个这样的有前途的。
whuber

我会提供赏金,但我没有足够的声誉
Jason S

1
要在@whuber的第一个评论中继续提出该想法,您可以从到目前为止看到的所有数据中维护大小为或的统一抽样随机子集。该集合和关联的“围栏”可以在O(1)时间中更新。1001000
诺2014年

Answers:


4

该解决方案实现了@Innuo在对该问题的评论中提出的建议:

您可以从到目前为止看到的所有数据中维护大小为100或1000的统一采样的随机子集。该集合和关联的“围栏”可以在时间中更新。O(1)

一旦知道了如何维护该子集,我们就可以选择任何一种我们想要从这样的样本中估计总体平均值的方法。这是一种通用方法,不做任何假设,它将与任何输入流一起使用,且精确度可以使用标准统计采样公式预测。(准确性与样本大小的平方根成反比。)


该算法接受数据样本大小的流作为输入,并输出样本的流,每个样本流表示总体。具体地说,对于,是来自的大小为的简单随机样本(无替换)。x(t), t=1,2,,ms(t)X(t)=(x(1),x(2),,x(t))1its(i)mX(t)

为了做到这一点,就足够了每 -元素的子集有被的索引平等的机会在。这意味着在等于前提是。m{1,2,,t}XsŤX一世 1i<t,s(t)m/ttm

在开始时,我们只是收集流,直到存储了元素。那时只有一个可能的样本,因此概率条件很容易满足。m

当时,该算法接管。电感假设是一个简单的随机样本对。临时设置。令为统一随机变量(独立于用于构造的任何先前变量)。 如果然后替换的随机选择的元件 这就是整个过程!t=m+1s(t)X(t)t>ms(t+1)=s(t)U(t+1)s(t)U(t+1)m/(t+1)sx(t+1)

显然概率在。此外,根据归纳假设,当时,概率在。概率为 =,它将被从移除,因此其保持概率等于x(t+1)m/(t+1)s(t+1)x(i)m/ts(t)itm/(t+1)×1/m1/(t+1)s(t+1)

mt(11t+1)=mt+1,

完全根据需要。通过归纳,届时,中所有包含概率在是正确的,很明显有那些夹杂物之间没有特别的关系。证明算法是正确的。x(i)s(t)

该算法的效率为因为在每个阶段最多计算两个随机数,并且替换值的数组中的一个元素。存储要求为。O(1)mO(m)

该算法的数据结构由样本及其样本的索引组成。最初,我们取并进行 这是用值更新以产生。(参数充当的角色,并且是。索引将由调用方维护。)stX(t)s=X(m)t=m+1,m+2,.R(s,t)x(s,t+1)ntsample.sizemt

update <- function(s, x, n, sample.size) {
  if (length(s) < sample.size) {
    s <- c(s, x)
  } else if (runif(1) <= sample.size / n) {
    i <- sample.int(length(s), 1)
    s[i] <- x
  }
  return (s)
}

为了说明和测试这一点,我将使用平均值的通常(非稳健)估计量,并将从估计平均值与的实际平均值进行比较每一步看到的累积数据集)。我选择了一个比较困难的输入流,该输入流的变化非常平稳,但会定期发生剧烈的跳跃。的样本量非常小,使我们能够看到这些图中的样本波动。s(t)X(t)m=50

n <- 10^3
x <- sapply(1:(7*n), function(t) cos(pi*t/n) + 2*floor((1+t)/n))
n.sample <- 50
s <- x[1:(n.sample-1)]
online <- sapply(n.sample:length(x), function(i) {
  s <<- update(s, x[i], i, n.sample)
  summary(s)})
actual <- sapply(n.sample:length(x), function(i) summary(x[1:i]))

在这一点上,online是通过保持此运行样本的值而产生的均值估计序列,而在每个时刻都是从所有可用数据产生的均值估计序列。该图显示了数据(灰色),(黑色)和该采样过程的两个独立应用程序(彩色)。该协议在预期的采样误差之内:50actualactual

plot(x, pch=".", col="Gray")
lines(1:dim(actual)[2], actual["Mean", ])
lines(1:dim(online)[2], online["Mean", ], col="Red")

数字


有关均值的可靠估算器,请在我们的网站上搜索 及相关条款。值得考虑的可能性包括Winsorized均值和M估计量。


对我来说,尚不清楚这种方法的拒绝阈值是什么样子(例如,超出阈值的观察被拒绝为异常值)。您可以将它们添加到地块吗?
user603 2014年

@ user603“拒绝阈值”或用于估计平均值的任何鲁棒方法无关紧要:选择您希望估计平均值的任何方法。(并不是所有健壮的方法都可以通过设置阈值和拒绝数据来工作,顺便说一句。)这可以在我的答案代码中通过替换summary为健壮的变体来完成。
whuber

在此示例中,我不清楚。灰色数据是“好”还是“离群值”。如果是先验的,则拟合度似乎会偏低(它应该更适合它们,因为情况将类似于我们希望遵循的@Bitwise的下降趋势)。如果较高索引值处的灰色数据离群值,则似乎拟合向上偏。您想在这里适合什么目标?这两种情况之间的当前契合似乎破裂了。
Deathkill14年

@Death如附图前面的文字所述,灰色数据是原始数据流。它的运行平均值是黑色曲线。彩色曲线基于算法。彩色曲线相对于黑色曲线的垂直偏差归因于采样中的随机性。任何指数的预期偏差量与该指数之前的灰度值的标准偏差成正比,与样本量的平方根成反比(在本示例中为50)。
whuber

3

您可能会考虑将您的问题与递归控制图相关联。这样的控制图将评估是否有新观测值在控制中。如果是这样,则此观察值将包括在平均值和方差的新估计中(确定控制极限所必需)。

可以在此处找到有关健壮,递归,单变量控制图的一些背景知识。有关质量控制和控制图的经典文字之一似乎可以在此处在线获得。

凭直觉, μt1 和方差 σt12 作为输入,您可以确定当时是否有新观测 t通过多种方法是一个异常值。一种是宣布xt 离群值,如果超出一定数量的标准差 μt1 (给定 σt12),但是如果数据不符合某些分布假设,则可能会出现问题。如果您想走这条路,那么假设您已确定新点是否不是异常值,并希望将其包括在您的平均估计中,而没有特殊的遗忘率。然后,您做不到:

μt=t1tμt1+1txt

同样,您将需要递归更新方差:

σt2=t1tσt12+1t1(xtμt)2

但是,您可能想尝试一些更常规的控制图。其他控制图对数据的分配更稳定,并且仍然可以处理非平稳性(例如μ建议您将EWMA或CUSUM逐步提高(有关图表及其控制限制的更多详细信息,请参见上面链接的教科书)。这些方法通常将不如鲁棒性强的计算密集型,因为它们具有只需将单个新观测值与从非异常观测值获得的信息进行比较的优势。您可以完善对长期过程的估计μσ2 如果需要,可以使用上面给出的更新公式在这些方法的控制极限计算中使用。

对于像EWMA这样的图表,它会遗忘旧的观察结果,而对新的观察结果给予更多的权重,如果您认为自己的数据是固定的(意味着生成分布的参数不变),则无需成倍地忘记旧的观察结果。您可以相应地设置遗忘因子。但是,如果您认为这不是平稳性,则需要为遗忘因素选择一个合适的值(有关方法,请再次参见教科书)。

我还应该提到,在开始在线监视和添加新观测值之前,您需要获取以下信息的估算值: μ0σ02(基于训练数据集的初始参数值)不受异常值的影响。如果您怀疑训练数据中存在异常值,则可以支付使用可靠方法估算它们的一次性费用。

我认为遵循这些思路的方法将导致针对您的问题的最快更新。


1
使用控制图是一个有趣的想法。但是,似乎很难克服对该问题的评论中概述的挑战。在非平稳情况下,如果您“忘记”了旧的值,则估计值可能会出现高度偏差。例如,您的建议如何处理由给出的数据流xt=cos(πt/106)+2t/106?(这下降得非常
缓慢

@Bitwise说初始样本可能不代表将来的数据。如果没有有关其余数据会有多大差异的信息,那么您将根本无法执行任何操作。但是,如果初始数据具有有关过程非平稳性的信息(例如下降趋势),则可以允许使用新观察值来说明我们期望它们较低的事实。但是,需要有关非平稳性的一些信息。您提出了一种非平稳性的病理类型。某些方法(例如EWMA)对于特定过程而言是最佳的,但通常都不错。您的过程将需要更自定义的工作。
Deathkill14年

(我发现您中有一个数学家,因为将您无法处理的某些事情视为“病理学”是非常数学的举动:)。但是,我要与您的预后有所不同:@Innuo建议的方法确实可以防止此类“病理”以及现实世界可能向您带来的其他一切威胁,特别是在将随机化纳入采样的情况下。
whuber

实际上,我同意一个人不应忽视一个人所面临的问题。您能否将我链接到@Innuo讨论的方法(我在这篇文章中找不到它们-它们是否在您上面提供的链接中,我错过了吗?)。谢谢。
Deathkill14年

@Innuo张贴在简短注释stats.stackexchange.com/questions/56494/...暗示所有先前观察到的数据的统一随机样本可在保持O(1)时间。尽管尚不清楚确切的处理方法,但将其与均值的可靠估计器结合起来将构成一个通用解决方案,适用于任何数据流。
whuber
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.