문제

표준 점수에 대한 히스토그램을 생성하는 데 사용하고 싶은 숫자가 많이 있습니다.

따라서 숫자의 평균과 표준 편차를 계산 하고이 공식으로 각 x를 정규화합니다.

x '= (x-mean)/std_dev

결과는 -4와 4 사이입니다. 그 결과를 차트로 작성하고 싶습니다. 나는 작은 막대를 피하기 위해 숫자를 그룹화하는 방법을 찾고 있습니다.

나의 계획은 [-4,4]가 연속 분기 단위 (즉, -4, -3.75, ..., 3.75,4)를 중심으로 한 간격 [-4,4]을 갖는 것입니다.

예 : 0.1 => bin "0.0", 0.3 => bin "0.25", -1.3 => bin "-1.5"

그것을 달성하는 가장 좋은 방법은 무엇입니까?

도움이 되었습니까?

해결책

다음은 세 번째 부분 라이브러리를 사용하지 않는 솔루션입니다. 숫자는 배열에 있어야합니다 vals.

MULTIPLIER  = 0.25 
multipliers = []
0.step(1, MULTIPLIER) { |n| multipliers << n }

histogram = Hash.new 0

# find the appropriate "bin" and create the histogram
vals.each do |val|
  # create an array with all the residuals and select the smallest
  cmp = multipliers.map { |group| [group, (group - val%1).abs] }
  bin = cmp.min { |a, b| a.last <=> b.last }.first
  histogram[val.truncate + bin] += 1
end

나는 그것이 적절한 반올림을 수행한다고 생각합니다. 그러나 나는 그것을 시도했다 :

vals = Array.new(10000) { (rand * 10) % 4 * (rand(2) == 0 ? 1 : -1) }

그리고 분포는 일종의 비뚤어졌지만 아마도 무작위 숫자 생성기의 결함 일 것입니다.

다른 팁

Rails는 열거 가능한#group_by를 제공합니다 - 레일을 사용하지 않는다고 가정 할 때 여기서 소스를 참조하십시오. http://api.rubyonrails.org/classes/enumerable.html

목록이 XS라고 가정하면 다음 (테스트되지 않은)과 같은 작업을 수행 할 수 있습니다.

bars = xs.group_by {|x| #determine bin here}

그런 다음 다음과 같은 해시가 있습니다.

bars = { 0 => [elements,in,first,bin], 1 => [elements,in,second,bin], etc }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top