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()for を 1 回だけ計算した方がよいでしょう。variance()あなたのコードはより速くなります。

于 2013-11-03T16:26:08.577 に答える