【问题标题】:Calculation of variance given mean给定均值的方差计算
【发布时间】:2013-05-27 06:35:33
【问题描述】:

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

当前的在线方差计算是单遍算法,在主循环中包含除法和乘法(这是影响速度的因素)。来自维基百科:

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

【问题讨论】:

  • 我们不能说一个算法比另一个更快,而不知道另一个......

标签: algorithm statistics variance


【解决方案1】:

导致天真的方差计算变得不稳定的原因是您分别对 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,除了你不需要第一次通过来计算平均值,因为你说它是已知的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 2016-03-17
    • 1970-01-01
    • 2022-01-14
    • 2020-02-14
    • 2021-12-19
    • 1970-01-01
    相关资源
    最近更新 更多