-->

如何找到在Ruby的标准偏差?(How do I find the standard deviati

2019-10-18 19:48发布

我写了一个程序,查找数据在一个单独的txt文件,然后给出了平均值和标准偏差。 它发现我的平均水平,但我得到标准差一个错误。 想知道有人可以帮助我解决我的代码。 就是这个:

data = File.open("avg_temp.txt", "r+")

contents = data.read

contents = contents.split("\r\n")
#split up array
contents.collect! do |x|
    x.split(',') 
end


sum = 0

contents.each do |x|
#make loop to find average
        sum = sum  + x[1].to_f
end
avg = sum / contents.length
puts "The average temperature of Laguardia Airport from 11/97 - 05/11 is:
#{ avg.round(3)}C (Answer is rounded to nearest thousandth place)"
#puts average


variance = 0
contents.each do |x|
        variance = variance + (x-avg)**2
end

variance = variance / contents
variance = Math.sqrt(variance)
puts variance

我得到一个错误的地方在线路27:方差=方差+(X-AVG)** 2

avg_temp.rb:27:in `-': can't convert Float into Array (TypeError)
    from avg_temp.rb:27:in `block in <main>'
    from avg_temp.rb:26:in `each'
    from avg_temp.rb:26:in `<main>'

Answer 1:

采用

variance = variance / contents.size # or contents.length



Answer 2:

至于你的问题已经回答了,也许我可以建议一个会使用Ruby来计算样本均值和标准差的典型方式:

contents = [1,2,3,4,5,6,7,8,9]
n = contents.size             # => 9
contents.map!(&:to_f)         # => [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
mean = contents.reduce(&:+)/n # => 5.0
sum_sqr = contents.map {|x| x * x}.reduce(&:+) # => 285.0
std_dev = Math.sqrt((sum_sqr - n * mean * mean)/(n-1)) # => 2.7386127875258306
  • “内容”包含从文件中获得的样本值
  • 我们不妨将所有样品值浮动第一件事情,像你一样; 否则我们将不得不做类似平均=(X1 + X2 + ...)/ n.to_f,这是一个有点乱,我们可能会忘记到处去做。 contents.map(&:to_f)是一样的contents.map {| X | x.to_f}。 (“收集”是“地图”的另一个名称。)
  • contents.reduce(&:+)是一样的contents.reduce {| TOT中,x | TOT + X},所以它只是增加了价值。 (“注入”是“降低”的另一个名称。)我们把这个用n得到的平均值。
  • contents.map {| X | X * X}产生的阵列[1,4,9,16,...,81]。
  • 我们然后连锁到[1,4,9,16,...,81]。降低(&:+),这增加了的平方值。
  • 在由n-1个计算所述样本标准偏差一个分歧。 (除以n来计算总体标准差)。如果你想四舍五入掉,比方说,2位小数,坚持.round(2)上的最后一条语句的结束(最后一个右括号之后)。


文章来源: How do I find the standard deviation in Ruby?