是否有一个近似值可以在一个循环中获得平均值和标准偏差
Is there an approximation to get meanvalue and standard deviation in one loop
我有一个包含 n 个浮点值的集合:x[n]
。当我想计算平均值和标准偏差时,我需要对所有值进行两次循环迭代:
首先循环对所有值求和并计算平均值:
sum = 0
for(i=0; i<n; i++)
sum += x[i]
mean = sum/n
在第二个循环中,我计算标准偏差:
sum = 0
for(i=0; i<n; i++)
sum += pow2(x[i] - mean)
sder = sqrt(sum/n)
我知道,如果您想获得平均值和标准差的精确值,则无法降低这种复杂性。但是,如果您只是近似,是否有一种方法可以在更短的时间内计算出它们?在一个循环中受到青睐。
查看有关标准差的维基百科 this section,特别是最后一个公式导致以下算法:
sum = 0;
sumsqrd = 0;
for(i = 0; i < n; i++)
sum += x[i]
sumsqrd += x[i] * x[i]
mean = sum / n
stddev = sqrt(sumsqrd / n - mean * mean)
这是一个一次性完成计算的版本,计算更稳定:
mean = 0.0
sum_sqrs = 0.0
n = 0
loop do
x = get_x()
break if x == nil
delta = x - mean
n += 1
mean += delta / n
sum_sqrs += delta * (x - mean)
end
sample_var = sum_sqrs / (n - 1)
这是基于 Rapid calculation methods section of the Wikipedia page for Standard deviation.
下半部分的公式
我有一个包含 n 个浮点值的集合:x[n]
。当我想计算平均值和标准偏差时,我需要对所有值进行两次循环迭代:
首先循环对所有值求和并计算平均值:
sum = 0
for(i=0; i<n; i++)
sum += x[i]
mean = sum/n
在第二个循环中,我计算标准偏差:
sum = 0
for(i=0; i<n; i++)
sum += pow2(x[i] - mean)
sder = sqrt(sum/n)
我知道,如果您想获得平均值和标准差的精确值,则无法降低这种复杂性。但是,如果您只是近似,是否有一种方法可以在更短的时间内计算出它们?在一个循环中受到青睐。
查看有关标准差的维基百科 this section,特别是最后一个公式导致以下算法:
sum = 0;
sumsqrd = 0;
for(i = 0; i < n; i++)
sum += x[i]
sumsqrd += x[i] * x[i]
mean = sum / n
stddev = sqrt(sumsqrd / n - mean * mean)
这是一个一次性完成计算的版本,计算更稳定:
mean = 0.0
sum_sqrs = 0.0
n = 0
loop do
x = get_x()
break if x == nil
delta = x - mean
n += 1
mean += delta / n
sum_sqrs += delta * (x - mean)
end
sample_var = sum_sqrs / (n - 1)
这是基于 Rapid calculation methods section of the Wikipedia page for Standard deviation.
下半部分的公式