计算一个Ruby数组的标准偏差的方法

118 阅读2分钟

标准差是对一组数值中的差异量的衡量。高值表示平均值周围的数值分布很广,而低值则表示数值的紧密聚类。

该计算为一系列数据的平均值周围的数值范围提供了额外的背景。维基百科有一些真实世界应用的好例子

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-statisticsgem。它有几个统计汇总方法的原生实现版本,直接混入Ruby的ArrayEnumerable 类。