1

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

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

4 回答 4

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);
}
于 2013-11-03T16:27:42.087 回答
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
于 2013-11-03T16:47:44.997 回答
0

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

于 2013-11-03T16:25:10.320 回答
0

您正在重新计算 total() 多次而没有先将其归零。所以你的总数会得到很大的错误值。sumOfAllItems为了快速修复,您应该将方法中的变量归零total()。但是,如果您在进入 for 循环之前也计算了mean()一次,您会做得更好。variance()你的代码会变得更快。

于 2013-11-03T16:26:08.577 回答