1

我编写了一个程序,它在单独的 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 行得到一个错误:variance = variance + (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>'
4

2 回答 2

6

由于您的问题已得到解答,也许我可以建议一种使用 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
  • 'contents' 包含从文件中获取的样本值
  • 我们也可以像您一样首先将所有样本值转换为浮点数;否则我们将不得不做类似 mean = (x1+x2+...)/n.to_f 的事情,这有点混乱,我们可能会忘记在任何地方都这样做。contents.map(&:to_f) 与 contents.map {|x| 相同 x.to_f}。(“收集”是“地图”的另一个名称。)
  • contents.reduce(&:+) 与 contents.reduce {|tot, x| 相同 tot + x},所以它只是将值相加。('inject' 是 'reduce' 的另一个名称。)我们将其除以 n 以获得平均值。
  • 内容.map {|x| x * x} 产生一个数组 [1,4,9,16,...,81]。
  • 然后我们将其链接到 [1,4,9,16,...,81].reduce(&:+),它将平方值相加。
  • 在计算样本标准偏差时,一除以 n-1。(除以 n 以计算总体标准差。)如果要将其四舍五入到小数点后两位,请坚持.round(2)最后一条语句的末尾(就在最后一个右括号之后)。
于 2013-10-21T02:32:49.320 回答
1

利用

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

于 2013-10-21T01:52:54.457 回答