2016-09-21 2 views
1

내 코드는 표본 편차를 계산할 때 모집단 편차를 계산합니다. 두 수식을 비교하고 계산을 변경했지만 아무 것도 작동하지 않는 것 같습니다. 모든 사람의 도움을 받거나 사전에 의견을 보내 주셔서 감사합니다.샘플을 계산하기 위해 내 코드에서 변경해야 할 항목 표준 표준 편차 대신 표준 편차?

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); 

} 
} 
+0

내 표준 편차 클래스가 바닥에 있습니다 – swaguire

+0

그냥 레코드 용입니다. 이름 지정에 대한 정확한 설명 : 클래스가 아닌 정적 ** 메소드 **가 두 개 있습니다. – GhostCat

+0

죄송합니다. – swaguire

답변

2

심각하게도 코드는 여러 단계에서 "잘못되었습니다". 따라서 모든 것을 디버깅하는 대신 을 수정하고 코드를 단순화하는 방법을 알려 드리겠습니다. 실제 수학 문제를 수정/해결하는 것은 매우 쉽습니다. 모든

먼저, 코드는 그래서 그냥 많은 어려워 이해하기 위해 (때문에 디버그)가 필요한 이상이 될 수 있습니다 혼란 스타일로 작성되었습니다.

예 : 루프 아무것도하지 않습니다

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

있다. 그리고 조건이 다른 것일 때조차, i < someNumber 같이; 당신은 여전히 ​​단지 count = someNumber을 넣어야 할 것입니다; 루핑 대신에!

여기와 같음 : 계산 방법에 대한 인수로 수가 인 점은 무엇입니까? 그리고 그걸 늘리시겠습니까? 그래서, 재 작성 할 수 있습니다 :

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 

코드에서 정말 이상하다 다른 것은 얼마나 당신을 설정하여 분산 변수; 그리고 당신의 계산 방법 내에서 그것이 어떻게 사용되는지.

짧은 이야기 : 필요하지 않은 코드에서 모두 뒤로 물러나십시오.

+0

조언 해 주셔서 감사 드리며 유감스럽게 생각해서 죄송합니다. ( – swaguire

+0

환영합니다. 내 의견이 올바른 방향으로 전달되기를 바랍니다. 문제를 해결하기에 충분합니다. – GhostCat

+0

그래, 다시 한 번 고마워. 미안해. 아직도 배운다. – swaguire

0

여러분이하는 것처럼 분산을 계산하는 것은 나쁜 생각입니다. 평균이 1 천만 원과 같이 커지고 노이즈가 작 으면 (예 : 약 1) 복식의 제한된 정밀도는 계산 된 분산이 음수이고 sd가 nan 일 수 있음을 의미합니다.

당신은 두 개의 패스를 계산해야 하나 예를 들어

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); 
    } 

은 (는 하나 개의 패스 방법을 제공합니다 것을 보여주기 위해 지루한 대수 약간의 소요 예를 들어

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; 

또는 한 번에, 2 패스 메서드와 같은 대답).