3 回答

TA貢獻(xiàn)1779條經(jīng)驗(yàn) 獲得超6個(gè)贊
雖然平方和算法在大多數(shù)情況下都可以正常工作,但是如果您要處理非常大的數(shù)字,可能會(huì)造成很大的麻煩。您基本上可能最終會(huì)得到負(fù)方差...
另外,永遠(yuǎn)不要永遠(yuǎn)將a ^ 2計(jì)算為pow(a,2),幾乎可以肯定a * a更快。
到目前為止,計(jì)算標(biāo)準(zhǔn)差的最佳方法是韋爾福德方法。我的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));
}
如果您擁有全部人口(而不是樣本人口),請(qǐng)使用return Math.Sqrt(S / (k-1));。
編輯:我已經(jīng)根據(jù)杰森的言論更新了代碼...
編輯:我還根據(jù)亞歷克斯的言論更新了代碼...

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超13個(gè)贊
解決方案比Jaime的解決方案快10倍,但是請(qǐng)注意,正如Jaime指出的那樣:
“雖然平方和算法在大多數(shù)情況下都可以正常工作,但是如果要處理非常大的數(shù)字,可能會(huì)造成很大的麻煩。基本上,您最終可能會(huì)得到負(fù)方差”
如果您認(rèn)為要處理的是非常大的數(shù)字或數(shù)量非常大的數(shù)字,則應(yīng)使用兩種方法進(jìn)行計(jì)算,如果結(jié)果相等,則可以確定可以使用“我的”方法。
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;
}

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超3個(gè)贊
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));
}
- 3 回答
- 0 關(guān)注
- 1552 瀏覽
添加回答
舉報(bào)