【问题标题】:How can I calculate the mode of a floating point array in Ruby?如何计算 Ruby 中浮点数组的模式?
【发布时间】:2014-08-16 18:01:04
【问题描述】:

我有一个浮点数据数组,我想选出最可能的值。它在描述性统计中称为“模式”。如何在 Ruby 中或在 gem 的帮助下计算它。

【问题讨论】:

  • 谢谢,但我认为这些算法对浮点数据毫无用处。
  • @Konstantin,你为什么这么认为?这个答案非常适合浮动。在Ruby中使用float作为Hash的key并没有错。
  • @theTRON 是正确的,第一个答案中的方法对你有用。

标签: ruby arrays floating-point statistics mode


【解决方案1】:
[0.0, 0.1, 0.2, 0.1, 0.3, 0.3, 0.1]
.group_by{|e| e}.max_by{|k, v| v.length}.first
# => 0.1

【讨论】:

    【解决方案2】:

    DescriptiveStatistics 将方法添加到 Enumerable 模块,以便轻松计算包含 Enumerable(如 Array、Hash、Set 和 Range)的集合中的 Numeric 样本数据的基本描述性统计信息。

    > require 'descriptive_statistics'
    > [0.0, 0.1, 0.2, 0.1, 0.3, 0.3, 0.1].mode
    => 0.1
    

    【讨论】:

      【解决方案3】:

      以下内容适用于双峰和多峰数据集,但仅返回单个值。对于双峰/多峰数据集,它总是返回数组中第一个出现的值。

      # returns 1.0
      a = [1.0, 1.0, 2.0, 2.0, 3.0]
      a.max_by { |x| a.count(x) }
      

      您也可以试试easystats gem。它向 Arrays 添加了一个 .mode 方法(以及其他方法),但对于双峰或多峰数据集它返回 nil。

      require 'easystats'
      
      # returns 1.0
      a = [1.0, 1.0, 2.0, 3.0]
      a.mode 
      
      # returns nil
      a = [1.0, 1.0, 2.0, 2.0, 3.0]
      a.mode
      

      【讨论】:

      • 你的第一段代码可以工作,但效率低。
      • 这是真的。最快的方法似乎是a.group_by {|e| e}.values.max_by{|e| e.size}.first,这是@Brandon 在上面提到的重复帖子中发布的。
      • 谢谢,我明白了,但我的浮点数显示出一点波动,因为它们来自不同的计算。例如 1.00001 和 1.00000 都应该被视为 1.0
      • 最重要的是,我的浮点数是成对的,因为它们是坐标系中直线的参数(y=a*x+b)。事实上我的数据是二维的,所以应该应用一些先进的方法。我不这么认为,我可以计算“a”值和“b”值的模式,因为它们是“附加的”。
      • 在这种情况下,使用Float#round 将每个值四舍五入到特定精度:rounded = a.map {|n| n.round(1)}
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      • 2011-01-10
      • 2013-01-08
      • 1970-01-01
      相关资源
      最近更新 更多