2013-11-03 72 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); 
}