2

我有一堆数字,我想用它来生成标准分数的直方图。

因此,我计算数字的平均值和标准差,并用这个公式对每个 x 进行归一化

x' = (x-mean)/std_dev

结果是一个介于 -4 和 4 之间的数字。我想绘制该结果的图表。我正在寻找一种对数字进行分组的方法,以避免出现小条。

我的计划是让区间 [-4,4] 中的 bin 以连续四分之一单位为中心,即 [-4,-3.75,...,3.75,4]

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

实现这一目标的最佳方法是什么?

4

2 回答 2

3

这是一个不使用任何第三方库的解决方案。数字应该在 Array 中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) }

并且分布有点倾斜,但这可能是随机数生成器的错。

于 2009-04-04T14:01:14.540 回答
2

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 }
于 2009-04-04T00:10:30.683 回答