我试图得出每个成员与平均值的差异(例如,给定平均值= 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>'
任何帮助都会很棒。谢谢。
答案 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
一个负数作为参数。
要计算num
和average
的差异,请使用其绝对值:
Math::sqrt((num - average).abs)