Algorithm 在一个循环中是否有一个近似值来获得平均值和标准偏差

Algorithm 在一个循环中是否有一个近似值来获得平均值和标准偏差,algorithm,time-complexity,distribution,Algorithm,Time Complexity,Distribution,我有一个n个浮点值的集合:x[n]。当我想要计算平均值和标准偏差时,我需要在所有值上迭代两个循环: 对所有值求和并计算平均值的第一个循环: sum = 0 for(i=0; i<n; i++) sum += x[i] mean = sum/n sum=0 对于(i=0;i,请查看关于标准偏差的wiki,特别是最后一个公式得出以下算法: sum = 0; sumsqrd = 0; for(i = 0; i < n; i++) sum

我有一个n个浮点值的集合:
x[n]
。当我想要计算平均值和标准偏差时,我需要在所有值上迭代两个循环:

对所有值求和并计算平均值的第一个循环:

sum = 0
for(i=0; i<n; i++)
    sum += x[i]
mean = sum/n
sum=0
对于(i=0;i,请查看关于标准偏差的wiki,特别是最后一个公式得出以下算法:

    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)
sum=0;
sumsqrd=0;
对于(i=0;i
看一下关于标准偏差的wiki,特别是最后一个公式得出了以下算法:

    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)
sum=0;
sumsqrd=0;
对于(i=0;i
这是一个一次计算的版本,计算更稳定:

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)

这是基于维基百科页面下半部分的公式。

这是一个一次计算的版本,计算更稳定:

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)

这是基于维基百科页面下半部分中的公式得出的。

你有的是O(n)。你的意思是你想一次完成吗?是的,我的意思是。我将编辑问题O(2n)是O(n).如果你想提高常数因子时使用大O表示法,你可能想错了。你的问题是O(n)。你的意思是想一次完成吗?是的,我的意思是。我将编辑问题O(2n)是O(n)。如果你想提高常数因子时使用大O表示法,你可能想错了。哦,伙计,我应该把注意力放在数学上。我不认为这会那么容易。值得注意的是,这种算法的数值稳定性比先计算平均值,然后再计算平均值差平均值的均方根偏差。例如,对于IEEE 754双倍,它给出[1e8+1,1e8-1]的标准偏差为0。如果你打算接受一个近似值,那可能没问题,但是认为这个算法没有缺点是错误的。哦,天哪,我应该更注意数学。我不认为这会那么容易。值得注意的是,这个算法的数值稳定性比计算平均值的稳定性差t,然后计算平均值的均方根偏差。例如,对于IEEE 754 Double,它给出[1e8+1,1e8-1]的标准偏差为0。如果你无论如何都要接受近似值,这可能是好的,但认为这种算法没有缺点是错误的。