Стандартное отклонение в LINQ

Делает модель LINQ совокупная функция SQL STDDEV() (стандартное отклонение)?

В противном случае, каково самое простое / лучшие практики способ вычислить его?

Пример:

  SELECT test_id, AVERAGE(result) avg, STDDEV(result) std 
    FROM tests
GROUP BY test_id
76
задан Steven 30 November 2016 в 17:38
поделиться

2 ответа

Вы можете сделать собственное расширение, вычисляющее это

public static class Extensions
{
    public static double StdDev(this IEnumerable<double> values)
    {
       double ret = 0;
       int count = values.Count();
       if (count  > 1)
       {
          //Compute the Average
          double avg = values.Average();

          //Perform the Sum of (value-avg)^2
          double sum = values.Sum(d => (d - avg) * (d - avg));

          //Put it all together
          ret = Math.Sqrt(sum / count);
       }
       return ret;
    }
}

Если у вас есть выборка из популяции, а не вся популяция, то вам следует использовать ret = Math.Sqrt(sum / (count - 1));.

Преобразовано в расширение из Adding Standard Deviation to LINQ by Chris Bennett.

94
ответ дан 24 November 2019 в 11:11
поделиться

Ответ Dynami работает, но для получения результата выполняет несколько проходов по данным. Это однопроходный метод, который вычисляет стандартное отклонение выборки :

public static double StdDev(this IEnumerable<double> values)
{
    // ref: http://warrenseen.com/blog/2006/03/13/how-to-calculate-standard-deviation/
    double mean = 0.0;
    double sum = 0.0;
    double stdDev = 0.0;
    int n = 0;
    foreach (double val in values)
    {
        n++;
        double delta = val - mean;
        mean += delta / n;
        sum += delta * (val - mean);
    }
    if (1 < n)
        stdDev = Math.Sqrt(sum / (n - 1));

    return stdDev;
}

Это стандартное отклонение выборки , поскольку оно делится на n - 1 . Для нормального стандартного отклонения вам нужно вместо этого разделить на n .

Здесь используется метод Велфорда , который имеет более высокую числовую точность по сравнению с методом Среднее (x ^ 2) -Среднее (x) ^ 2 .

58
ответ дан 24 November 2019 в 11:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: