在我的代码中更改什么来计算样本标准偏差而不是总体标准偏差?
What to change in my code to calculate sample Standard deviation instead of population standard deviaiton?
我的代码在我需要计算样本偏差时计算总体偏差我已经比较了两个公式并尝试更改我的计算但似乎没有任何效果。感谢大家的帮助或提前输入。
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);
}
}
说真的,您的代码在很多层面上都是 "wrong"。因此,我不会为您调试所有这些,而是会给您一些提示,说明如何 修复 并简化您的代码 - 然后您应该很容易 fix/resolve 您的实际数学题。
首先,您的代码以一种令人困惑的风格编写,这使得它 非常 更难理解(因此 debug ) 比它需要的。
示例:
int count = 0;
//For Loop for count
for(int i = 0; i < count; i++){
count++;
}
for 循环不做任何事情。甚至当条件是别的东西时,比如 i < someNumber
;您仍然只需要将 count = someNumber
放在那里;而不是循环!
同样如此:提供 count 作为 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 变量;以及如何在您的计算方法中使用它。
长话短说:退后一步,删除代码中不需要的所有内容。
像你这样计算方差是个坏主意。如果均值较大,例如 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);
}
(需要一些乏味的代数来证明一次通过方法给出与两次通过方法相同的答案)。
我的代码在我需要计算样本偏差时计算总体偏差我已经比较了两个公式并尝试更改我的计算但似乎没有任何效果。感谢大家的帮助或提前输入。
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);
}
}
说真的,您的代码在很多层面上都是 "wrong"。因此,我不会为您调试所有这些,而是会给您一些提示,说明如何 修复 并简化您的代码 - 然后您应该很容易 fix/resolve 您的实际数学题。
首先,您的代码以一种令人困惑的风格编写,这使得它 非常 更难理解(因此 debug ) 比它需要的。
示例:
int count = 0;
//For Loop for count
for(int i = 0; i < count; i++){
count++;
}
for 循环不做任何事情。甚至当条件是别的东西时,比如 i < someNumber
;您仍然只需要将 count = someNumber
放在那里;而不是循环!
同样如此:提供 count 作为 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 变量;以及如何在您的计算方法中使用它。
长话短说:退后一步,删除代码中不需要的所有内容。
像你这样计算方差是个坏主意。如果均值较大,例如 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);
}
(需要一些乏味的代数来证明一次通过方法给出与两次通过方法相同的答案)。