我想要使用一堆数字来生成标准分数的直方图。
因此,我计算数字的均值和标准差,并使用此公式对每个x进行标准化
x'=(x-mean)/ std_dev
结果是-4到4之间的数字。我想绘制结果。我正在寻找一种方法来对数字进行分组,以避免出现小条。
我的计划是在区间[-4,4]中设置以连续四分之一单位为中心的箱子,即[-4,-3.75,......,3.75,4]
示例:0.1 => bin“0.0”,0.3 => bin“0.25”, - 1.3 => Bin“-1.5”
实现这一目标的最佳方法是什么?
答案 0 :(得分:3)
这是一个不使用任何第三方库的解决方案。数字应该在数组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) }
并且分布有点偏斜,但这可能是随机数生成器的错误。
答案 1 :(得分: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 }