2013-05-27 55 views
2

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

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

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 
+0

我们不能说算法比其他算法快,而不知道其他算法。 – Floris

回答

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,但你并不需要第一遍计算平均值,因为你说这是已知的。