如何确定一组值的标准差 (stddev)?
我需要知道一个数字与一组数字相比是否超出平均值 1 个 stddev,等等。
I need to know if a number compared to a set of numbers is outside of 1 stddev from the mean, etc..
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(13)
虽然平方和算法在大多数情况下工作正常,但如果您处理非常大的数字,它可能会造成很大的麻烦。 你基本上可能会得到负方差...
另外,不要永远、永远、永远将 a^2 计算为 pow(a,2),a * a 几乎肯定会更快。
到目前为止,计算标准差的最佳方法是韦尔福德方法。 我的 C 非常生疏,但它可能看起来像这样:
如果您拥有整个总体(而不是样本总体),则使用
return Math. Sqrt(S / (k-1));
.编辑:我已经根据 Jason 的评论更新了代码...
编辑:我还根据 Alex 的评论更新了代码...
While the sum of squares algorithm works fine most of the time, it can cause big trouble if you are dealing with very large numbers. You basically may end up with a negative variance...
Plus, don't never, ever, ever, compute a^2 as pow(a,2), a * a is almost certainly faster.
By far the best way of computing a standard deviation is Welford's method. My C is very rusty, but it could look something like:
If you have the whole population (as opposed to a sample population), then use
return Math.Sqrt(S / (k-1));
.EDIT: I've updated the code according to Jason's remarks...
EDIT: I've also updated the code according to Alex's remarks...
比 Jaime 的解决方案快 10 倍,但请注意,
正如海梅指出的:
如果你认为你正在处理非常大的数字或非常大量的数字,你应该使用两种方法进行计算,如果结果相等,你肯定知道你可以使用“我的“适合您案例的方法。
10 times faster solution than Jaime's, but be aware that,
as Jaime pointed out:
If you think you are dealing with very large numbers or a very large quantity of numbers, you should calculate using both methods, if the results are equal, you know for sure that you can use "my" method for your case.
Jaime 接受的答案很好,除了你需要在最后一行除以 k-2 (你需要除以“number_of_elements-1”)。
更好的是,k 从 0 开始:
The accepted answer by Jaime is great, except you need to divide by k-2 in the last line (you need to divide by "number_of_elements-1").
Better yet, start k at 0:
Math.NET 库为您提供了开箱即用的功能。
请参阅 PopulationStandardDeviation 了解更多信息信息。
The Math.NET library provides this for you to of the box.
See PopulationStandardDeviation for more information.
代码片段:
Code snippet:
您可以通过累加均值和均方
并形成
因子
cnt/(cnt-1)
来避免对数据进行两次传递,这通常也是合适的。顺便说一句 - 第一次传递 黛米和McWafflestix 答案隐藏在对
Average
的调用中。 对于一个小列表来说,这种事情当然是微不足道的,但是如果列表超过了缓存的大小,甚至超过了工作集,这就会成为一个投标交易。You can avoid making two passes over the data by accumulating the mean and mean-square
and forming
A factor of
cnt/(cnt-1)
is often appropriate as well.BTW-- The first pass over the data in Demi and McWafflestix answers are hidden in the calls to
Average
. That kind of thing is certainly trivial on a small list, but if the list exceed the size of the cache, or even the working set, this gets to be a bid deal.我发现 Rob 的有用答案与我使用 Excel 看到的内容不太相符。 为了匹配 Excel,我将 valueList 的平均值传递到标准偏差计算中。
这是我的两分钱......显然你可以从函数内的 valueList 计算移动平均值(ma) - 但我碰巧在需要 standardDeviation 之前就已经计算了。
I found that Rob's helpful answer didn't quite match what I was seeing using excel. To match excel, I passed the Average for valueList in to the StandardDeviation calculation.
Here is my two cents... and clearly you could calculate the moving average (ma) from valueList inside the function - but I happen to have already before needing the standardDeviation.
使用扩展方法。
With Extension methods.
所有其他答案的问题在于他们假设你有你的
数据在一个大数组中。 如果您的数据是动态传入的,这将是
更好的方法。 无论您如何或是否存储数据,该类都会起作用。 它还可以让您选择华尔道夫法或平方和法。 两种方法均使用单遍工作。
The trouble with all the other answers is that they assume you have your
data in a big array. If your data is coming in on the fly, this would be
a better approach. This class works regardless of how or if you store your data. It also gives you the choice of the Waldorf method or the sum-of-squares method. Both methods work using a single pass.
我们也许可以使用Python中的统计模块。 它有 stedev() 和 pstdev() 命令分别计算样本和总体的标准差。
详细信息请参见:https://www.geeksforgeeks.org/python-statistics-stdev/
将统计数据导入为 st
print(st.ptdev(dataframe['列名']))
We may be able to use statistics module in Python. It has stedev() and pstdev() commands to calculate standard deviation of sample and population respectively.
details here: https://www.geeksforgeeks.org/python-statistics-stdev/
import statistics as st
print(st.ptdev(dataframe['column name']))
这是总体标准差
对于样本标准差,只需将上面代码中的 [values.Count] 更改为 [values.Count -1] 即可。
确保您的数据集中不只有 1 个数据点。
This is Population standard deviation
For Sample standard deviation, just change [values.Count] to [values.Count -1] in above code.
Make sure you don't have only 1 data point in your set.
现有的答案都没有考虑到您可能需要包含增量自由度,例如,从 NumPy 或类似的 Python / R 库移植代码时。 在这种情况下:
None of the existing answers considers you might need to include delta degrees of freedom, for example, when porting code from NumPy or similar Python / R libraries. In that case: