1

几天前我一直在做一个应用程序,但它是错误的,我不知道为什么。

我以各种方式完成了相同的操作。我在博客上搜索过这里,但我仍然得到不正确的结果。

我希望你能帮帮我:

我正在计算**平均值和标准偏差**。平均值还可以。标准差是错误的。这是我的代码:

    LinkedList<Double> lista = new LinkedList<Double>();
    int contador = 0;

    private void btnAgregar_Click(object sender, EventArgs e)
    {
        lista.AddLast(Convert.ToDouble(txtNum.Text));
        MessageBox.Show("Se agregó el número: " + txtNum.Text);
        contador++;
        txtNum.Text = "";
        txtNum.Focus();
    }

    Double media;
    Double desviacionE = 0;
    Double suma = 0;

    private void btnCalcular_Click(object sender, EventArgs e)
    {
        media = 0;
        calculaMedia();
        calculaDesviacionE();
    }

    public void calculaMedia()
    {
        foreach (var item in lista)
        {
            String valorItem = item.ToString();
            suma = suma + Convert.ToDouble(valorItem);
        }
        media = suma / contador;
        txtMedia.Text = "" + media;
    }

    public void calculaDesviacionE()
    {
        Double average = lista.Average();
        Double sum = 0;
        foreach (var item in lista)
        {
            sum += ((Convert.ToDouble(item.ToString()))*(Convert.ToDouble(item.ToString())));
        }
        Double sumProm = sum / lista.Count();
        Double desvE = Math.Sqrt(sumProm-(average*average));
        txtDesv.Text = "" + desvE;
    }

我希望你能帮帮我!谢谢你

4

3 回答 3

1

该公式取决于您拥有的数据集。

  1. 是全体人口吗?然后你应该使用人口标准偏差(除数:n)。

  2. 数据是一组样本吗?然后你应该使用样本标准偏差(除数:n - 1)

您可以在此处找到更易于理解的指南:Laerd Statistics - Standard Deviation,它还为这两种解决方案提供了方便的计算器

因此,正如@Greg 所回答的那样,尽管我会首先检查列表是否包含任何值以避免被零除。

double stdDeviation = 0;
if (lista.Any())
{
    var avg = lista.Average();
    var sumOfSquares = lista.Sum(item => Math.Pow(item - avg, 2));

    stdDeviation = Math.Sqrt(sumOfSquares / [divisor goes here]);
}
return stdDeviation;

除数lista.Count()用于总体或(lista.Count() - 1)样本的位置。

于 2013-09-17T23:00:21.983 回答
1

遵循http://en.wikipedia.org/wiki/Standard_deviation上的标准偏差规则

        LinkedList<Double> list = new LinkedList<Double>();
        double sumOfSquares = 0;
        double deviation;
        double delta;
        list.AddLast(2);
        list.AddLast(4);
        list.AddLast(4);
        list.AddLast(4);
        list.AddLast(5);
        list.AddLast(5);
        list.AddLast(7);
        list.AddLast(9);


        double average = list.Average();
        Console.WriteLine("Average: " + average);

        foreach (double item in list)
        {
            delta = Math.Abs(item - average);
            sumOfSquares += (delta * delta);
        }
        Console.WriteLine("Sum of Squares: " + sumOfSquares);

        deviation = Math.Sqrt(sumOfSquares / list.Count());
        Console.WriteLine("Standard Deviation: " + deviation); //Final result is 2.0
于 2013-09-17T22:20:32.883 回答
1

您需要在平方之前减去平均值。

// Population Standard Deviation
public void populationStandardDev()
{
    Double average = lista.Average();
    Double sum = 0;
    foreach (var item in lista)
    {
        Double difference = item - average;
        sum += difference*difference;
    }
    Double sumProd = sum / lista.Count(); // divide by n
    Double desvE = Math.Sqrt(sumProd);
}

// Standard deviation
public void standardDev()
{
    Double average = lista.Average();
    Double sum = 0;
    foreach (var item in lista)
    {
        Double difference = item - average;
        sum += difference*difference;
    }
    Double sumProd = sum / (lista.Count()-1); // divide by n-1 
    Double desvE = Math.Sqrt(sumProd);
}
于 2013-09-17T21:31:12.637 回答