方差的计算方法

时间:2013-05-27 06:35:34

标签: algorithm statistics variance

我目前正在使用在线方差算法来计算给定序列的方差。这很好地工作,并且以一定的速度为代价提供良好的数值稳定性和溢出阻力,这很好。我的问题是,如果样本均值已知,则存在比这更快的算法,同时具有相似的稳定性和抗溢出性(因此不像天真的方差计算)。

当前在线方差计算是单通道算法,在主循环中具有分割和乘法(这是影响速度的因素)。来自维基百科:

def online_variance(data):
    n = 0
    mean = 0
    M2 = 0

    for x in data:
        n = n + 1
        delta = x - mean
        mean = mean + delta/n
        M2 = M2 + delta*(x - mean)

    variance = M2/(n - 1)
    return variance

1 个答案:

答案 0 :(得分:3)

导致幼稚方差计算变得不稳定的事实是你分别对X(得到均值(x))和X ^ 2值求和然后取差值

var = mean(x^2) - (mean(x))^2

但是因为方差的定义是

var = mean((x - mean(x))^2)

你可以评估它,它会尽可能快。当你不知道平均值时,你必须首先计算它的稳定性,或者使用仅仅以数值稳定性为代价通过数据的“天真”公式。

修改 现在你已经给出了“原始”代码,它很容易变得更好(更快)。正如你正确指出的那样,内循环中的划分正在减慢你的速度。试试这个进行比较:

def newVariance(data, mean):
  n = 0
  M2 = 0

  for x in data:
    n = n + 1
    delta = x - mean
    M2 = M2 + delta * delta

  variance = M2 / (n - 1)
  return variance

注意 - 这看起来很像two_pass_variance algorithm from Wikipedia,除了你不需要第一遍来计算均值,因为你说它已经知道了。