更新数据集的方差

机器算法验证 方差 意思是
2022-04-05 01:59:16

在一个应用程序中,我将处理大量图像,我从中连续提取特定值以计算它们的均值和方差。因为将它们全部存储意味着存储 Gigas,所以我只想存储允许我计算全局均值和方差的东西。我必须存储什么?

2个回答

在没有相反的信息的情况下,我假设您想要单变量计算并且您想要n1-分母版本的方差。

一种有用的方法是更新与平均值的偏差平方和,我将其称为 SSE。

让我们说当时t你有x¯,SSEs2, 和观察,xt+1并且您希望同时拥有这三个计算量t+1.

以下是更新它们的方法:

t=t+1et=xtx¯ # note that the x¯ term there is the previous meanx¯=x¯+et/tSSE=SSE+et(xtx¯) # note that the term there is NOT et2s2=SSE/(t1)

这种计算比原始计算稳定得多itxi2版本(您可以在许多旧书中找到,并且在手工操作时还不错,您可以在其中看到何时失去精度)。这不是最稳定的可能计算,但足以满足几乎所有目的。如果稳定性确实成为您的问题,还有其他一些事情可以做。

正如@January 正确指出的那样,我给出了一个在线算法,你似乎只想要最后的值。在这种情况下,上述算法可以加快一点,例如,通过不计算s2每次迭代。

或者,下面@January 建议的算法可以通过在求和和平方和之前从每个观察值中减去平均值的估计值来变得更加稳定。从代数上讲,它不会改变平均值,但会使平均值更加稳定。不需要很好的估计就可以产生很大的不同;通常第一次观察就足够了(因为通常情况下,例如,第一次观察对平均值的估计非常差,但实际上并不重要)。

另见https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance

对于 CrossValidated 来说,这并不是一个真正的问题,但它来了:您只需要存储三个值:

  • 当前变量数,
  • 当前变量的平方和
  • 当前变量的总和。

这是因为方差可以表示为xi2(xi)2.

var(X)=(x¯xi)2n

(x¯xi)2=x¯22x¯xi+xi2=

=nx¯22x¯nx¯+xi2=

=xi2nx¯2

这种方法的主要缺点是平方和往往增长得非常快,存储起来可能会有问题;格伦的变体(在另一个答案中)在这方面更好,但在计算上(稍微)更密集。