标准偏差计算不适用于C#?

时间:2013-11-03 16:19:53

标签: c# arrays variance exponent

所以我使用这个方法来计算我的数组的标准差,但它似乎没有给我正确的值。

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。这段代码有什么问题吗?

4 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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

答案 2 :(得分:0)

你需要取差异平方的平方根,然后取平均值。所以在那里添加一个平方根。当你进行除法时不要使用-1,因为你没有处理索引,而是处理项目的实际数量。

答案 3 :(得分:0)

您要多次重新计算total()而不先将其归零。所以你的总数会有很大的错误价值。要快速解决问题,您应该将sumOfAllItems方法中的total()变量归零。但如果您在进入for循环之前在mean()中仅计算variance()一次,那么您会做得更好。你的代码会变快。