我目前正在使用在线方差算法来计算给定序列的方差。这很好地工作,并且以一定的速度为代价提供良好的数值稳定性和溢出阻力,这很好。我的问题是,如果样本均值已知,则存在比这更快的算法,同时具有相似的稳定性和抗溢出性(因此不像天真的方差计算)。
当前在线方差计算是单通道算法,在主循环中具有分割和乘法(这是影响速度的因素)。来自维基百科:
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 :(得分: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,除了你不需要第一遍来计算均值,因为你说它已经知道了。