标准差是对一组数值中的差异量的衡量。高值表示平均值周围的数值分布很广,而低值则表示数值的紧密聚类。
该计算为一系列数据的平均值周围的数值范围提供了额外的背景。维基百科有一些真实世界应用的好例子。
Ruby没有提供一个本地方法来生成一个整数数组的标准差。它的内置 Math
库侧重于三角学和对数计算。鉴于Ruby中甚至没有计算数组平均值的方法,这并不令人惊讶。
确保你使用...
...Array#sum
当计算一个整数数组的平均值和标准差时。
a = [1, 2, 3, 4, 5, 6, 7, 8]
mean = a.sum(0.0) / a.size
#=> 4.5
sum = a.sum(0.0) { |element| (element - mean) ** 2 }
#=> 42.0
variance = sum / (a.size - 1)
#=> 6.0
standard_deviation = Math.sqrt(variance)
#=> 2.449489742783178
为什么?
使用 Array
中的#sum
方法要比使用替代方法inject
快很多很多倍。
#sum
方法只是在Ruby 2.4中被添加到Array
,这就是为什么你可能会在互联网上的其他地方看到替代的实现。
在我写计算平均值的时候,我比较了Ruby-native和自己实现算法的性能,同样的原则也适用:本地实现(C语言)要快得多。
还有什么问题吗?
说实话,如果你正在做大量的统计数字计算工作,你可能希望能更接近 "金属"。
用Ruby做的标准差计算比用C语言做的要慢得多。
如果你正在做大量的这种计算,或者在性能很关键的情况下,你可能想看看 enumerable-statistics
gem。它有几个统计汇总方法的原生实现版本,直接混入Ruby的Array
和Enumerable
类。