Группировка чисел для гистограммы - PullRequest
2 голосов
/ 04 апреля 2009

У меня есть набор чисел, которые я хочу использовать для создания гистограммы для стандартного результата.

Поэтому я вычисляю среднее и стандартное отклонение чисел и нормализую каждый x по этой формуле

x '= (x-mean) / std_dev

Результат - число от -4 до 4. Я хочу наметить этот результат. Я ищу способ сгруппировать числа, чтобы избежать маленьких баров.

Мой план состоит в том, чтобы ячейки в интервале [-4,4] центрировались на единицах последовательных четвертей, т.е. [-4, -3,75, ..., 3,75,4]

Пример: 0.1 => корзина "0.0", 0.3 => корзина "0.25", -1.3 => корзина "-1.5"

Каков наилучший способ достичь этого?

Ответы [ 2 ]

3 голосов
/ 04 апреля 2009

Вот решение, которое не использует сторонние библиотеки. Числа должны быть в массиве 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) }

и распределение стало немного искаженным, но это, вероятно, ошибка генератора случайных чисел.

2 голосов
/ 04 апреля 2009

Rails предоставляет Enumerable # group_by - смотрите исходный код здесь, если вы не используете Rails: 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 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...