代码没有找到正确的方差

时间:2013-12-16 05:03:14

标签: java variance

我正在为我的AP计算机科学课编写代码,我需要找到一组数字的方差。对于那些不知道如何找到方差的人来说,它是平均值的差值的平方和除以1而不是长度。为了使这更容易理解,这是一个例子。如果您有数据{1,5,8,7,2,7},则平均值为6.您的方差则为[(1-6)^ 2 +(5-6)^ 2 +(8 -6)^ 2 +(7-6)^ 2 +(2-6)^ 2 +(7-6)^ 2] / 5 = 8.4。所以这是方法。

public static double variance(int[] data) {
    int sum = 0;
    double average;

    for (int i=0; i < data.length; i++) {
        sum = sum + data[i];
    }
    average = (double)sum/data.length;

    for (int i=0; i < data.length; i++) {
        data[i] = data[i] - (int)average^2;
    }

    int add = 0;
    for (int d : data)
        add += d;
    add = add/data.length-1;
    return add;
    }
}

我不允许从int数组中更改数据,我不知道为什么我得到错误的方差,请帮忙!

2 个答案:

答案 0 :(得分:6)

你最明显的问题是:

average^2

^运算符不是取幂。它是bitwise XOR

使用:

Math.pow(average, 2)

average * average

另外,

  1. 你应该对偏差进行平方,而不是平均值。
  2. 不要(int)施放
  3. add/data.length-1错了
  4. 修改data数组是不必要的。
  5. 添加一些清理,

    public static double variance(int[] data) {
        int sum = 0;
        for (int datum : data) {
            sum += datum;
        } 
        double average = (double)sum / data.length;
    
        double devianceSum = 0;
        for (int datum : data) {
            devianceSum += Math.pow(datum - average, 2);
        }
        return devianceSum / data.length;
    }
    

答案 1 :(得分:0)

您的代码中有几点您的计算失去精确度,这可能导致您的答案远离您的预期。如前所述,您必须在Java中使用Math.pow进行取幂。但这需要应用于每个值和平均值的差异,而不仅仅是平均值本身。基本上,您需要括号(a-b)^2而不是a - b^2(在数学语法中)。您还应始终使用double作为数据类型,而不是int

public static double variance(int[] data) {
    double sum = 0;
    double average;
    double[] deviations = new int[data.length];

    for (int i=0; i < data.length; i++) {
        sum += data[i];
    }
    average = sum/data.length;

    for (int i=0; i < data.length; i++) {
        deviations[i] = Math.pow(data[i] - average, 2);
    }

    double result = 0;
    for (Double d : deviations)
        result += d;

    result = result/data.length-1;

    return result;
}