【问题标题】:Calculating Variance with Constant memory/Without using arrays使用常量内存/不使用数组计算方差
【发布时间】:2020-10-27 10:31:53
【问题描述】:

我想知道是否有任何方法可以计算方差而不将值存储在数组中或其他东西。 我能够为均值做到这一点,并且也能够近似计算方差,但不是很准确。 这是我使用的代码:

#include <stdio.h>
#include <math.h>
int main()
{
    int n, temp;
    float sum = 0, crm = 0, var = 0;

    printf("Enter number of elements : ");
    scanf("%d", &n);

    for (int i = 0; i < n; i++)
    {
        printf("Enter number %d :", i + 1);
        scanf("%d", &temp);
        sum = sum + temp;
        crm = sum / ((float)i + 1);
        var = (var*i + (temp - crm) * (temp - crm) )/ ((float)i + 1);
    }
    printf("\naverage : %f,appprox variance :  %f\n", sum / (float)n, var);
}

【问题讨论】:

  • “不太准确”是什么意思?你使用了什么输入,你得到了什么,你期望什么?
  • 好的,我在这个程序中得到了大约 10% 的错误
  • 用于“在线”方差计算的浮点算法通常不稳定,因为浮点精度有限。最好使用Welford's algorithm,它会给出正确的结果。

标签: c variance


【解决方案1】:

值的方差xi定义为E((xi - E(xi))2),其中 E是其参数1(“预期值”)的平均值。

然后:

  • E((xi - E(xi))2) = E(xi2 − 2•xi•E(xi sub>) + E(xi)2)
  • = E(xi2) − 2•E(xi)•E(xi) + E( xi)2
  • = E(xi2) - E(xi)2.

因此,要计算方差,您需要知道值的平方的均值和值的均值的平方。反过来,这些可以根据值的数量、值的总和以及值的平方和来计算。让它们分别为 nsS

然后 E(xi2) - E(xi)2 = S/n - (s/n)2.

nsS在初始化为零后很容易递增累加。看到每个值x

n += 1;
s += x;
S += x*x;

脚注

1 E(yi) = y之和i除以yi的个数。

【讨论】:

    【解决方案2】:

    在循环中,您只需要计算总和和平方值的总和。然后计算方差。

    喜欢:

    for (int i = 0; i < n; i++)
    {
        printf("Enter number %d :", i + 1);
        scanf("%d", &temp);
        sum = sum + temp;
        ssum = ssum + temp * temp;
    }
    crm = sum / n;
    var = ssum/n - crm * crm;
    

    注意:以上代码不处理可能的溢出

    【讨论】:

      猜你喜欢
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      • 2020-12-07
      • 1970-01-01
      • 2013-11-05
      • 1970-01-01
      相关资源
      最近更新 更多