Делает модель LINQ совокупная функция SQL STDDEV()
(стандартное отклонение)?
В противном случае, каково самое простое / лучшие практики способ вычислить его?
Пример:
SELECT test_id, AVERAGE(result) avg, STDDEV(result) std
FROM tests
GROUP BY test_id
Вы можете сделать собственное расширение, вычисляющее это
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.
Ответ 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
.