2013-10-21 3 views
0

별도의 txt 파일에서 데이터를 조회 한 다음 평균과 표준 편차를 제공하는 프로그램을 작성했습니다. 내 평균을 찾았지만 표준 편차에 대한 오류가 발생합니다. 아무도 내 코드를 수정하는 데 도움이 될지 궁금합니다. 이것은이다 :Ruby에서 표준 편차를 찾으려면 어떻게합니까?

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-평균) ** 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>' 
+0

분산 = 분산/내용이 문제와 유사합니다. 아마도 내용을 의미했을거야. 길이 야? –

+0

27 번째 줄에 오류가 있습니다 : variance = variance + (x-avg) ** 2 avg_temp.rb : 27 :'- ': float을 Array (TypeError)\t avg_temp에서 변환 할 수 없습니다. RB : 27 : 블록'에서

에서 'avg_temp.rb에서 \t : 26 : 각각'에서 'avg_temp.rb에서 \t : 26 :에서는'
' – user2759592

+0

위의 코멘트뿐만 아니라 답변에 질문에 적용 . 당신은 대답에서 그것을 제거해야합니다. –

답변

0

사용

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

3

당신의 질문에 답을 얻었을 때, 저는 아마도 샘플 평균과 표준 편차를 계산하기 위해 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 
  • 당신이했던 것처럼 우리가뿐만 아니라, 제일 먼저 떠오르는 모든 샘플 값을 변환 할 수 있습니다 파일
  • 에서 얻은 샘플 값을 포함; 그렇지 않으면 우리는 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으로 나눕니다.
  • contents.map {| x | x * x}는 배열 [1,4,9,16, ..., 81]을 생성합니다.
  • 그러면이를 [1,4,9,16, ..., 81] .reduce (& : +)로 연결하여 제곱 값을 합산합니다.
  • 샘플 표준 편차를 계산할 때 하나는 n-1로 나눕니다. (인구 표준 편차를 계산하려면 n으로 나눕니다.) 예를 들어 소수점 이하 2 자리로 반올림하고 싶다면 마지막 문장의 마지막 (마지막 오른쪽 괄호 바로 뒤)에 '.round (2)'를 붙이십시오.
관련 문제