【问题标题】:How to draw from exponential distribution in Ruby?如何从 Ruby 中的指数分布中提取?
【发布时间】:2013-08-20 14:59:13
【问题描述】:

在 Ruby 中,我需要从平均值为 m 的指数分布中提取数据。请告诉我如何快速有效地做到这一点。例如。让我们来:

m = 4.2

def exponential_distribution
  rand( m * 2 )
end

当然,这段代码是错误的,而且它只返回整数结果。我今天已经很累了,请指点我一个好的解决方案。

【问题讨论】:

    标签: ruby random statistics random-sample


    【解决方案1】:

    如果您想从头开始,可以使用inversion

    def exponential(mean)
      -mean * Math.log(rand) if mean > 0
    end
    

    如果你想用速率lambda 对其进行参数化,则平均值和速率是互为倒数的。除以-lambda 而不是乘以-mean

    从技术上讲它应该是log(1.0 - rand),但由于1.0 - rand 具有均匀分布,您只需使用rand 就可以节省一次算术运算。

    【讨论】:

    • 谢谢。今天实在是太累了。
    【解决方案2】:

    使用the distribution gem怎么样?这是一个例子:

    require 'distribution'
    
    mean = 4.2
    lambda = mean**-1
    
    # generate a rng with exponential distribution
    rng = Distribution::Exponential.rng(lambda)
    
    # sample a value
    sample = rng.call
    

    如果您需要经常更改lambda 的值,直接使用p_value 方法可能会很有用。在the source code for Distribution::Exponential#rng 中可以找到一个很好的示例,它基本上只是在内部使用p_value。这是一个如何做到这一点的例子:

    require 'distribution'
    
    # use the same rng for each call
    rng = Random
    
    1.step(5, 0.1) do |mean|
      lambda = mean**-1
    
      # sample a value
      sample = Distribution::Exponential.p_value(rng.rand, lambda)
    end
    

    【讨论】:

    • 这样的宝石有多少?使用例如之间的比较如何。 R 的 Ruby 前端?一旦我确定我有一个好的,我会很高兴地使用它。基本上这就是我想要的。
    • 我相信它是由 SciRuby 的人制作和使用的,我在这方面有很好的经验。我不知道任何竞争的宝石。
    • 哦,真的 :-) 我正在成为那些人中的一员,很高兴知道 :-)
    • 请你再帮我做一件事:我的 lambda 经常变化,你能告诉我如何在不创建 Proc 对象的情况下做到这一点吗?
    • 好的,我添加了代码。基本上,指数分布 RNG 采用一个参数 lambda。由于指数分布的平均值是m = λ^-1,因此您希望将λ = m^-1 作为参数传递(来源:en.wikipedia.org/wiki/Exponential_distribution)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 2020-03-17
    • 2021-06-23
    • 2011-04-19
    • 2021-04-16
    • 1970-01-01
    • 2011-12-08
    相关资源
    最近更新 更多