猿问
回到首页
个人中心
反馈问题
注册登录
下载APP
首页
课程
实战
体系课
手记
专栏
慕课教程
如何确定一组值的标准偏差(stddev)?
我需要知道一个与一组数字相比的数字是否在均值之外的1个stddev之外。
肥皂起泡泡
浏览 1503
回答 3
3回答
哆啦的时光机
虽然平方和算法在大多数情况下都可以正常工作,但是如果您要处理非常大的数字,可能会造成很大的麻烦。您基本上可能最终会得到负方差...另外,永远不要永远将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));。编辑:我已经根据杰森的言论更新了代码...编辑:我还根据亚历克斯的言论更新了代码...
0
0
0
开心每一天1111
解决方案比Jaime的解决方案快10倍,但是请注意,正如Jaime指出的那样:“虽然平方和算法在大多数情况下都可以正常工作,但是如果要处理非常大的数字,可能会造成很大的麻烦。基本上,您最终可能会得到负方差”如果您认为要处理的是非常大的数字或数量非常大的数字,则应使用两种方法进行计算,如果结果相等,则可以确定可以使用“我的”方法。 public static double StandardDeviation(double[] data) { double stdDev = 0; double sumAll = 0; double sumAllQ = 0; //Sum of x and sum of x² 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; }
0
0
0
慕森王
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));}
0
0
0
打开App,查看更多内容
随时随地看视频
慕课网APP
相关分类
C#
typedef入门问题
1 回答
数学
数学建模 什么意思?
2 回答
怎样学习数学建模?
1 回答
继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续