java - 在Java中计算样本方差,但在插入相似数字时给出错误的答案

标签 java arraylist variance

import java.util.ArrayList;

public class Variance {
// Copy here sum from exercise 63 
public static int sum(ArrayList<Integer> list) {
    int sum = 0;        
    for(int i=0; i<list.size(); i++ ){
        sum = sum + list.get(i) ;
    }
    return sum;
}

// Copy here average from exercise 64 
public static double average(ArrayList<Integer> list) {  
    double average = sum(list)/list.size();
    return average;
}

public static double variance(ArrayList<Integer> list) {
    // write code here
   double sumMinusAverage = sum(list) - average(list);
   return sumMinusAverage * sumMinusAverage / (list.size()-1);
}

public static void main(String[] args) {
    ArrayList<Integer> list = new ArrayList<Integer>();
    list.add(3);
    list.add(2);
    list.add(7);
    list.add(2);

    System.out.println("The variance is: " + variance(list));

}

}

程序正在计算方差。但是当列表包含相同的数字等 1-s 时。程序说方差是 3,但答案应该是 0。

有人可以给我一些指导吗?

最佳答案

Luiggi Mendoza 已经提到的整数除法是您需要解决的问题,但此外,您计算方差的算法不正确。它不是分子中总和与平均值之差的平方。

您必须总结各个元素与平均值的差异。除以 (list.size() - 1) 对于样本方差来说是正确的。

public static double variance(ArrayList<Integer> list) {
   double sumDiffsSquared = 0.0;
   double avg = average(list);
   for (int value : list)
   {
       double diff = value - avg;
       diff *= diff;
       sumDiffsSquared += diff;
   }
   return sumDiffsSquared  / (list.size()-1);
}

当列表中只有一项时要小心。方差应为 0,但您需要检查大小以避免被零除异常。

此外,如果您想要总体方差,请除以 list.size()

关于java - 在Java中计算样本方差,但在插入相似数字时给出错误的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26532832/

相关文章:

java - 在 Java 中返回连接字符串并检查 null 或空的最佳方法是什么?

java - 在java中解析字符串以获取信息

java - 如何使用输入文件中的文本填充 ArrayList?

java - ArrayList 元素交换不是永久的

python - 如何在不导入的情况下计算方差和标准差

java - 使用泛型java进行android数据绑定(bind)

java - 启动更新检查程序线程,检查数据库中的新条目

java - 如何根据键值将 2 个 ArrayList<HashMap<String, String>> 合并为 1 个?

python - Numpy 没有产生所需的样本方差值

perl - 如何计算perl中的方差?