Java 在我的代码中更改什么来计算样本标准偏差而不是总体标准偏差?
我的代码计算总体偏差,当我需要它来计算样本偏差时,我比较了两个公式并尝试更改我的计算,但似乎没有任何效果。提前感谢大家的帮助或意见Java 在我的代码中更改什么来计算样本标准偏差而不是总体标准偏差?,java,math,standard-deviation,Java,Math,Standard Deviation,我的代码计算总体偏差,当我需要它来计算样本偏差时,我比较了两个公式并尝试更改我的计算,但似乎没有任何效果。提前感谢大家的帮助或意见 public class MeanAndStandardDeviation { public static void main (String argv []) throws IOException { BufferedReader stdin = new BufferedReader (new InputStreamReader (
public class MeanAndStandardDeviation {
public static void main (String argv []) throws IOException {
BufferedReader stdin =
new BufferedReader (new InputStreamReader (System.in));
NumberFormat nf = new DecimalFormat ("0.00");
nf.setMinimumFractionDigits (2);//Sets Min digits
nf.setMaximumFractionDigits (2);//Sets Max digits
String inputValue;
int count = 0;
//For Loop for count
for(int i = 0; i < count; i++){
count++;
}
double varianceFinal = 0;
List<String> input = new ArrayList<String>();//String ArrayList
List<Double> numbers = new ArrayList<Double>();//Double ArrayList
//While loop that takes in all my input and assigns it to the ArrayLists
//Parameters set for when null is entered and total numbers go over 500
while((inputValue = stdin.readLine()) != null && !inputValue.equals("") && input.size()<500){//Parameters set for when null is entered and total numbers go over 500
input.add(inputValue);
numbers.add (Double.parseDouble(inputValue));
}
System.out.println ("Standard Deviation: " +(nf.format(calcStdDev (numbers, count, varianceFinal))));//Prints the Standard Deviation
}
//StandardDeviation Class
static double calcStdDev (List<Double> numbers, int count, double variance){
variance = 0;
double sum = 0;
for(int i = 0; i < numbers.size(); i++){
sum += numbers.get(i);
variance += numbers.get(i) * numbers.get(i);
count++;
}
double varianceFinal = ((variance/count)-(sum*sum)/(count*count));
return Math.sqrt(varianceFinal);
}
}
公共类均值和标准差{
公共静态void main(字符串argv[])引发IOException{
缓冲读取器标准=
新的BufferedReader(新的InputStreamReader(System.in));
NumberFormat nf=新的十进制格式(“0.00”);
nf.setMinimumFractionDigits(2);//设置最小位数
nf.setMaximumFractionDigits(2);//设置最大位数
字符串输入值;
整数计数=0;
//循环计数
for(int i=0;i修复并简化您的代码,这样您就可以很容易地修复/解决实际的数学问题
首先,您的代码是以令人困惑的风格编写的,这只会使它比需要的更难理解(因此也更难调试)
例如:
int count = 0;
//For Loop for count
for(int i = 0; i < count; i++){
count++;
}
代码中另一件非常奇怪的事情是如何设置方差变量,以及如何在计算方法中使用它
长话短说:退一步,从代码中删除所有不需要的内容。这样计算方差是个坏主意。如果平均值较大,例如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;
双平均值=0.0;
对于(i=0;i按照我的标准偏差类位于底部的方式只是为了记录:精确命名:您有两个静态方法,而不是类。非常抱歉,通过比较代码,您可以简单地说calcstdev=sqrt(calcVariance)
--您正在实施有偏估计。当同时估计均值和方差时,无偏方差估计是方差最终=(方差-(总和*总和)/计数)/(计数-1)
。谢谢您的帮助我非常感谢您的帮助谢谢您的建议和帮助抱歉情况太糟了:(不客气。我希望我的想法能让你走上正确的方向,并足以最终解决你的问题。是的,再次感谢,再次抱歉,情况太糟了,我仍然在学习没有问题。如果你觉得你“很好去”请考虑接受我的回答,以表明你不是在寻找更多的来自其他人的输入。
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);
}