标准偏差计算在 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# 中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C++ CLI 索引属性在 C# 中不起作用?

拖放在 C# 中不起作用

Type.GetType(“namespace.classnameassemblyname”) 在 C# 中不起作用

访问更新语句在 C# 中不起作用

必需属性在 ASP.NET 中不起作用

我的正则表达式在 C# 中不起作用