亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何確定一組值的標準偏差(stddev)?

如何確定一組值的標準偏差(stddev)?

肥皂起泡泡 2019-12-20 11:03:10
我需要知道一個與一組數字相比的數字是否在均值之外的1個stddev之外。
查看完整描述

3 回答

?
哆啦的時光機

TA貢獻1779條經驗 獲得超6個贊

雖然平方和算法在大多數情況下都可以正常工作,但是如果您要處理非常大的數字,可能會造成很大的麻煩。您基本上可能最終會得到負方差...


另外,永遠不要永遠將a ^ 2計算為pow(a,2),幾乎可以肯定a * a更快。


到目前為止,計算標準差的最佳方法是韋爾福德方法。我的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));。


編輯:我已經根據杰森的言論更新了代碼...


編輯:我還根據亞歷克斯的言論更新了代碼...


查看完整回答
反對 回復 2019-12-20
?
開心每一天1111

TA貢獻1836條經驗 獲得超13個贊

解決方案比Jaime的解決方案快10倍,但是請注意,正如Jaime指出的那樣:


“雖然平方和算法在大多數情況下都可以正常工作,但是如果要處理非常大的數字,可能會造成很大的麻煩?;旧?,您最終可能會得到負方差”


如果您認為要處理的是非常大的數字或數量非常大的數字,則應使用兩種方法進行計算,如果結果相等,則可以確定可以使用“我的”方法。


    public static double StandardDeviation(double[] data)

    {

        double stdDev = 0;

        double sumAll = 0;

        double sumAllQ = 0;


        //Sum of x and sum of x2

        for (int i = 0; i < data.Length; i++)

        {

            double x = data[i];

            sumAll += x;

            sumAllQ += x * x;

        }


        //Mean (not used here)

        //double mean = 0;

        //mean = sumAll / (double)data.Length;


        //Standard deviation

        stdDev = System.Math.Sqrt(

            (sumAllQ -

            (sumAll * sumAll) / data.Length) *

            (1.0d / (data.Length - 1))

            );


        return stdDev;

    }


查看完整回答
反對 回復 2019-12-20
?
慕森王

TA貢獻1777條經驗 獲得超3個贊

Jaime接受的答案很好,除了您需要在最后一行除以k-2(您需要除以“ number_of_elements-1”)。更好的是,將k從0開始:


public static double StandardDeviation(List<double> valueList)

{

    double M = 0.0;

    double S = 0.0;

    int k = 0;

    foreach (double value in valueList) 

    {

        k++;

        double tmpM = M;

        M += (value - tmpM) / k;

        S += (value - tmpM) * (value - M);

    }

    return Math.Sqrt(S / (k-1));

}


查看完整回答
反對 回復 2019-12-20
  • 3 回答
  • 0 關注
  • 1556 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號