【问题标题】:Grouping numbers for a histogram为直方图分组数字
【发布时间】:2009-04-03 23:54:18
【问题描述】:

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

因此我计算了数字的均值和标准差,并用这个公式对每个 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"

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

【问题讨论】:

    标签: ruby grouping histogram


    【解决方案1】:

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

      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 }
      

      【讨论】:

      • 我相信这是假设 xs 可以在内存中保存两次。
      猜你喜欢
      • 2018-11-26
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      • 2016-06-14
      • 2018-02-03
      • 2021-11-02
      • 2015-10-28
      相关资源
      最近更新 更多