Как я определяю стандартное отклонение (stddev) множества значений?

Попробуйте этот простой код

// Вызовите метод TextBoxDateFormat с датой в качестве параметра.

Способ

public void TextBoxDateFormat(string str1)

{

// Takes the current date format if MM/DD/YY or MM/DD/YYYY

DateTime dt = Convert.ToDateTime(str1);

//Converts the requested date into MM/DD/YYYY and assign it to textbox field

TextBox = String.Format("{0:MM/dd/yyyy}", dt.ToShortDateString());


//include your validation code if required

}
45
задан Bill the Lizard 15 September 2012 в 23:12
поделиться

3 ответа

Хотя алгоритм суммы квадратов работает нормально большую часть времени, он может вызвать большие проблемы, если вы имеете дело с очень большими числами. По сути, вы можете получить отрицательную дисперсию ...

Кроме того, никогда, никогда и никогда не вычисляйте ^ 2 как pow (a, 2), a * a почти наверняка быстрее.

By Наилучшим способом вычисления стандартного отклонения является метод Велфорда . Мой C очень ржавый, но мог бы выглядеть примерно так:

public static double StandardDeviation(List<double> valueList)
{
    double M = 0.0;
    double S = 0.0;
    int k = 1;
    foreach (double value in valueList) 
    {
        double tmpM = M;
        M += (value - tmpM) / k;
        S += (value - tmpM) * (value - M);
        k++;
    }
    return Math.Sqrt(S / (k-2));
}

Если у вас есть вся совокупность (в отличие от выборки совокупности), то используйте return Math .Sqrt (S / (k-1)); .

EDIT: Я обновил код в соответствии с замечаниями Джейсона ...

EDIT: Я также обновил код согласно замечанию Алекса ...

100
ответ дан 26 November 2019 в 20:58
поделиться

Фрагмент кода:

public static double StandardDeviation(List<double> valueList)
{
    if (valueList.Count < 2) return 0.0;
    double sumOfSquares = 0.0;
    double average = valueList.Average(); //.NET 3.0
    foreach (double value in valueList) 
    {
        sumOfSquares += Math.Pow((value - average), 2);
    }
    return Math.Sqrt(sumOfSquares / (valueList.Count - 1));
}
2
ответ дан 26 November 2019 в 20:58
поделиться

Вы можете избежать двух проходов по данным, накапливая среднее и среднеквадратичное

cnt = 0
mean = 0
meansqr = 0
loop over array
    cnt++
    mean += value
    meansqr += value*value
mean /= cnt
meansqr /= cnt

и формируя

sigma = sqrt(meansqr - mean^2)

коэффициент cnt / (cnt-1) также часто уместно.

Кстати - Первый проход по данным в Деми и McWafflestix ответы скрыты в вызовах Среднее . Такие вещи, безусловно, тривиальны для небольшого списка, но если список превышает размер кеша или даже рабочего набора, это становится сделкой по ставке.

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

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