Ruby中的平方根和循环标准差

时间:2015-04-05 05:02:57

标签: ruby loops math

我试图得出每个成员与平均值的差异(例如,给定平均值= 4.5)和使用每个循环的这两个成员的平方根。按照link的步骤,我做了什么。 total = square root of (array[0] - average) + square root of (array[1] - average) + ...

array = [some values here]
average = 4.5           #as example to make the code shorter
squaredifference = 0
#Loop through the array, accumulate the total of the 
#difference of num and average and of the square root of that result
array.each { |num| squaredifference += Math::sqrt(num - average) } 
puts squaredifference

我的错误是

Math::DomainError: NumericalNumerical argument is out of domain - "sqrt"
from (irb):5:in `sqrt'
from (irb):5:in `block in irb_binding'
from (irb):5:in `each'
from (irb):5
from /Users/username/.rvm/rubies/ruby-1.9.3-p551/bin/irb:12:in `<main>'

任何帮助都会很棒。谢谢。

2 个答案:

答案 0 :(得分:2)

问题不在于您是在尝试计算负数的平方根,而是您应该计算该数字的平方。你想要:

squared_difference += (num - average)**2

一旦得到平均值的所有平方偏差之和,就可以计算总体方差:

variance = squared_difference/n

其中n是人口的大小。标准差只是方差的平方根:

standard_deviation = Math::sqrt(variance)

如果要计算大小为n样本(而非人口)的方差,请使用以下公式:

variance = squared_difference/(n-1)

获得方差的无偏估计。同样,标准差是方差的平方根。

答案 1 :(得分:0)

错误是因为你给Math::sqrt一个负数作为参数。

要计算numaverage的差异,请使用其绝对值:

Math::sqrt((num - average).abs)