如何在Ruby中找到标准差?

我写了一个程序,它在一个单独的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 ' from avg_temp.rb:26:in `each' from avg_temp.rb:26:in `' 

使用

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

正如您的问题已得到解答,或许我可以建议一种使用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’包含从文件中获取的样本值
  • 我们也可以将所有样本值转换为浮点数,就像你所做的那样; 否则我们将不得不做类似于=(x1 + x2 + …)/ n.to_f的事情,这有点混乱,我们可能会忘记在任何地方都这样做。 contents.map(&:to_f)与contents.map {| x |相同 x.to_f}。 (’collect’是’map’的另一个名字。)
  • contents.reduce(&:+)与contents.reduce {| tot,x |相同 tot + x},所以它只是将值相加。 (’inject’是’reduce’的另一个名字。)我们把它除以n来得到均值。
  • contents.map {| x | x * x}生成一个数组[1,4,9,16,…,81]。
  • 然后我们将其链接到[1,4,9,16,…,81] .reduce(&:+),它将平方值相加。
  • 在计算样本标准差时,除以n-1。 (除以n来计算总体标准差。)如果你想将其四舍五入到比如2位小数,则在最后一个语句的末尾(最后一个右边的paren之后)粘贴’.round(2)’。