Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算Ruby中的第95百分位?_Ruby_Ruby On Rails 3_Algorithm_Math - Fatal编程技术网

计算Ruby中的第95百分位?

计算Ruby中的第95百分位?,ruby,ruby-on-rails-3,algorithm,math,Ruby,Ruby On Rails 3,Algorithm,Math,这个问题似乎没有帮助: 我想从一组数字中计算第95个百分位(或者,实际上,任何其他期望的百分位)。最终,这将应用于Rails,以根据大量记录计算分布 但是,如果我能确定如何从一系列数字中准确地确定一个给定的百分位数,我就可以从那里得到它 坦率地说,我很惊讶,我还没有找到一种具有这种功能的宝石——我还没有找到 非常感谢您的帮助。基于项目计数的百分比 基于值范围的百分位数 有趣的是,Excel函数返回60作为第80百分位的第一个值。如果希望得到此结果,如果希望包含落在限制尖端的项目,则将上面的.f

这个问题似乎没有帮助:

我想从一组数字中计算第95个百分位(或者,实际上,任何其他期望的百分位)。最终,这将应用于Rails,以根据大量记录计算分布

但是,如果我能确定如何从一系列数字中准确地确定一个给定的百分位数,我就可以从那里得到它

坦率地说,我很惊讶,我还没有找到一种具有这种功能的宝石——我还没有找到

非常感谢您的帮助。

基于项目计数的百分比 基于值范围的百分位数

有趣的是,Excel函数返回
60
作为第80百分位的第一个值。如果希望得到此结果,如果希望包含落在限制尖端的项目,则将上面的
.floor
更改为
.ceil

如果希望复制Excel的百分位函数,请尝试以下操作:

def percentile(values, percentile)
    values_sorted = values.sort
    k = (percentile*(values_sorted.length-1)+1).floor - 1
    f = (percentile*(values_sorted.length-1)+1).modulo(1)

    return values_sorted[k] + (f * (values_sorted[k+1] - values_sorted[k]))
end

values = [1, 2, 3, 4]
p = 0.95
puts percentile(values, p)
#=> 3.85

该公式基于四分位数法,这实际上只是一个特定的百分位数-。

如果您对现有的gem感兴趣,那么gem是迄今为止我发现的最好的
百分位数
函数

IRB会议

> require 'descriptive_statistics'
=> true
irb(main):009:0> data = [1, 2, 3, 4]
=> [1, 2, 3, 4]
irb(main):010:0> data.percentile(95)
=> 3.8499999999999996
irb(main):011:0> data.percentile(95).round(2)
=> 3.85

gem的优点在于它优雅地描述了“我想要95%的数据”。

这是我在自己的统计库中开发的方法:

def quantiles(data, probs=[0.25, 0.50, 0.75])
  values = data.sort

  probs.map do |prob|
    h = 1 + (values.count - 1) * prob
    mod = h % 1
    (1 - mod) * values[h.floor - 1] + (mod) * values[h.ceil - 1]
  end
end

如果只需要一个分位数,则执行
分位数(数据,[0.95])

要清楚,是否要在数组中选择95%的值小于它们的值?或者你的意思是95%到100%的差值吗?@Phrogz,不太可能。我想知道95%的分布。与MS Excel的百分位数函数的结果类似。如何计算百分位数-@B5Fan74以供将来的问题使用,请注意,链接到精确的定义并提供示例输入和所需的输出将很有帮助。@AJcodez您指的是“百分位数没有标准定义…”的文章这包括三种以上的计算方法?谢谢分享。顺便说一句,你的
百分位数计数有一个bug。[-0..-1]返回整个数组。使用您的解决方案尝试百分位0.999,您将看到问题。如果您进行此编辑,它将修复它<代码>(rem>0)?排序[-rem..-1]:[]
它可能需要检查
值是否包含单个值,以便在这些情况下不会中断。在我的例子中,我将其添加到第一行:
returnvalues.first if values.count==1
> require 'descriptive_statistics'
=> true
irb(main):009:0> data = [1, 2, 3, 4]
=> [1, 2, 3, 4]
irb(main):010:0> data.percentile(95)
=> 3.8499999999999996
irb(main):011:0> data.percentile(95).round(2)
=> 3.85
def quantiles(data, probs=[0.25, 0.50, 0.75])
  values = data.sort

  probs.map do |prob|
    h = 1 + (values.count - 1) * prob
    mod = h % 1
    (1 - mod) * values[h.floor - 1] + (mod) * values[h.ceil - 1]
  end
end