在我的代码中要更改什么来计算样本标准偏差而不是人口标准偏差?

时间:2016-09-21 08:01:16

标签: java math standard-deviation

我的代码计算人口偏差,当我需要它来计算样本偏差我已经比较了两个公式并尝试改变我的计算但似乎没有任何效果。感谢大家的帮助或提前输入。

var a = $('meta[prop="bar"]').attr('name');
console.log(a);
// 'randomname2'

2 个答案:

答案 0 :(得分:2)

说真的,你的代码在很多层面都是“错误的”。所以不是为你调试所有这些,我会给你一些提示如何修复并简化你的代码 - 那么你应该很容易修复/解决你的实际数学问题。

首先,您的代码是以一种令人困惑的方式编写的,这使得 更难以理解(因此 debug ),而不是它需要的。< / p>

示例:

int count = 0;
//For Loop for count
for(int i = 0; i < count; i++){
    count++;
}

for循环不会任何。即使条件是其他条件,例如i < someNumber;你仍然需要把count = someNumber放在那里;而不是循环!

在这里:提供计数作为calc方法的参数有什么意义?!然后才增加它?所以,让我们重写:

public static double calcStdDev (List<Double> numbers, double variance) {
  double sumOfNumbers = 0;
  double sumOfSquares = 0;
  for(double number : numbers) {
    sumOfNumbers += number;
    sumOfSquares += number * number;
}
... and instead of calculating count, you simply have
int numberOfNumbers = numbers.size();
... and now, do your math

您的代码中另一件非常奇怪的事情是如何设置 variance 变量;以及如何在calc方法中使用它。

长话短说:退一步,删除代码中不需要的所有内容。

答案 1 :(得分:0)

像你一样计算方差是个坏主意。如果平均值很大,例如1000万,并且噪声很小,例如大约1那么双精度的有限精度可能意味着你的计算方差是负的并且sd将是nan。

你应该在两遍中计算它,例如

double mean = 0.0;
   for( i=0; i<n; ++i)
   {  mean += x[i];
   }
   mean /= n;
double var = 0.0;
   for( i=0; i<n; ++i)
   {   
   double d = x[i] - mean;
       var += d*d;
   }
   var /= n;

或一次通过,例如

double mean = 0.0;
double var = 0.0;
  for( i=0; i<n; ++i)
  {  
  double f = 1.0/(i+1);
  double d = x[i]-mean;
      mean += d*f;
      var = (1.0-f)*(var + f*d*d);
  }

(需要一些乏味的代数来表明一次通过方法给出与两次传递方法相同的答案)。