2013-11-03 71 views
1

所以我使用這種方法來計算我的數組的標準偏差,但它似乎沒有給我正確的值。標準偏差計算在C#中不起作用?

double numbers[] = new double[10]; 
double sumOfAllItems = 0; 

private double total() 
{ 
    for (int i = 0; i < numbers.Length; i++) 
    { 
     sumOfAllItems += numbers[i]; 
    } 

    return sumOfAllItems; 
} 

public double mean() 
{ 
    // working 
    **sumOfAllItems = 0;** 
    return total()/numbers.Length; 
} 

// numbers are from (1-10) (too lazy to type up all of them. 

public double variance() 
{ 
    // each (value - mean) squared 
    double summationsTotal = 0; // (numbers[i] - mean() squared 

    for (int i = 0; i < numbers.Length; i++) 
    { 
     summationsTotal += Math.Pow(numbers[i] - mean(), 2); 
    } 

    return summationsTotal/(numbers.Length - 1); 
} 

我手動計算了差異,它給了我一個9.166666的答案。這是針對樣本公式的。

但是,當我在我的GUI上計算它時,它給了我866.25。這段代碼有什麼問題嗎?

+0

你能張貼'平均()'的代碼? –

+0

可能是因爲BODMAS?你有沒有試過先從'numbers [i]'中減去'mean',然後將其平方? – user959631

+0

完成編輯。 @RogerRowland – puretppc

回答

3

好的,你已經得到了你的答案。我會建議一個替代方法與Linq的好東西和擴展方法。

public static double StandardDeviation(this ICollection<double> values) 
{ 
    return Math.Sqrt(values.Variance()); 
} 

public static double Variance(this ICollection<double> values) 
{ 
    if (values.Count == 0) 
     return 0; 

    var avg = values.Average(); 
    return values.Select(x => Math.Pow(x - avg, 2)).Sum()/values.Count; 
} 

這樣稱呼它:

var variance = numbers.Variance(); //or so 
0

你需要取差異的平方的平方根,然後取平均值。所以在那裏添加一個平方根。而當你做分區不使用-1,因爲你沒有處理索引,但實際的項目數。

0

您正在重新計算total()多次而沒有將其歸零。所以你的總價值很大。爲了快速修復,您應該在total()方法中將sumOfAllItems變量歸零。但是如果你在輸入for循環之前也計算mean()一次variance(),那麼你會做得更好。你的代碼會變得更快。

+0

所以我想我的意思是我必須這樣做?我返回後sumOfAllIems = 0? – puretppc

+2

把它放在開始像羅傑羅蘭茲答案 – nio

+0

我試過這個,它的工作。我返回前重置sumOfAllItems = 0。 – puretppc

4

的問題是在這裏:

double sumOfAllItems = 0; 

private double total() 
{ 
    for (int i = 0; i < numbers.Length; i++) 
    { 
     sumOfAllItems += numbers[i]; 
    } 

    return sumOfAllItems; 
} 

它應該是:

double sumOfAllItems = 0; 

private double total() 
{ 
    sumOfAllItems = 0; 
    for (int i = 0; i < numbers.Length; i++) 
    { 
     sumOfAllItems += numbers[i]; 
    } 

    return sumOfAllItems; 
} 

這將是更有效的太緩存的平均,而不是重新計算其方差函數裏面 - 它不會更改。例如:

public double variance() 
{ 
    // each (value - mean) squared 
    double dMean - mean(); 
    double summationsTotal = 0; // (numbers[i] - mean() squared 

    for (int i = 0; i < numbers.Length; i++) 
    { 
     summationsTotal += Math.Pow(numbers[i] - dMmean, 2); 
    } 

    return summationsTotal/(numbers.Length - 1); 
}