标准偏差计算在 C# 中不起作用?
Posted
技术标签:
【中文标题】标准偏差计算在 C# 中不起作用?【英文标题】:Standard Deviation calculation not working in C#? 【发布时间】:2013-11-03 16:19:52 【问题描述】:所以我使用这种方法来计算我的数组的标准偏差,但它似乎没有给我正确的值。
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。这段代码有什么问题吗?
【问题讨论】:
你能把mean()
的代码贴出来吗?
可能是因为BODMAS?您是否尝试过先从numbers[i]
中减去mean
,然后再平方?
完成编辑。 @RogerRowland
问题出在total()
中,它没有初始化为零并且被多次调用
在total()
中初始化sumofAllItems
,或者做得更好,让它本地化。
【参考方案1】:
问题出在这里:
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);
【讨论】:
【参考方案2】:好的,你已经得到答案了。我建议使用 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
【讨论】:
【参考方案3】:您需要取差异平方的平方根,然后对其进行平均。所以在那里添加一个平方根。并且当您进行除法时,不要使用 -1,因为您不是在处理索引,而是在处理项目的实际计数。
【讨论】:
【参考方案4】:您在没有先将其归零的情况下多次重新计算 total()。所以你的总数会得到很大的错误值。为了快速修复,您应该在 total()
方法中将 sumOfAllItems
变量归零。但是,如果您在进入 for 循环之前也仅在 variance()
中计算了一次 mean()
,您会做得更好。您的代码会变得更快。
【讨论】:
所以我想我的平均方法必须这样做?我返回后 sumOfAllIems = 0? 像 Roger Rowlands 回答一样放在开头 我试过了,它奏效了。我在返回之前重置了 sumOfAllItems = 0。以上是关于标准偏差计算在 C# 中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章