How to draw from exponential distribution in Ruby?
在Ruby中,我需要从平均m的指数分布中得出。请告诉我如何快速有效地完成。让我们拥有:
1 2 3 4 5
| m = 4.2
def exponential_distribution
rand( m * 2 )
end |
当然,这段代码是错误的,而且它只返回整数结果。我今天已经累了,请给我一个好的解决办法。
如果你想从头开始做,你可以使用反转。
1 2 3
| def exponential(mean)
-mean * Math.log(rand) if mean > 0
end |
如果要用速率lambda参数化它,则平均值和速率是彼此的反比。除以-lambda,而不是乘以-mean。
从技术上讲,应该是log(1.0 - rand),但是由于1.0 - rand有一个统一的分布,您只需使用rand就可以节省一个算术运算。
使用distributiongem怎么样?下面是一个例子:
1 2 3 4 5 6 7 8 9 10
| 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方法可能会很有用。在Distribution::Exponential#rng的源代码中可以找到一个很好的示例,它基本上只在内部使用p_value。下面是一个如何操作的示例:
1 2 3 4 5 6 7 8 9 10 11
| 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 |
- 有多少这样的宝石?把ruby frontend和r进行比较怎么样?一旦我确定我有一个好的,我会用它。基本上这就是我想要的。
- 有什么灵魂可以给我密码吗?
- 我相信它是由Sciruby的人制造和使用的,我有很好的经验。我不知道任何有竞争力的宝石。
- 哦,真的:-我正准备成为那些人中的一员,很高兴知道:
- 请你再帮我一件事:我的lambda经常改变,你能告诉我如何在创建proc对象的情况下做吗?
- 好的,我添加了代码。基本上,指数分布RNG采用一个参数lambda。由于指数分布的平均值是m = λ^-1,所以您希望通过λ = m^-1作为参数(来源:en.wikipedia.org/wiki/exponential_distribution)。
- 谢谢,但是,最后一件事,我能在不创建过程的情况下完成它吗?当你多次从同一个发行版中抽取数据时,proc会让你大吃一惊。但如果只绘制一次,那么创建过程可能太多了?(我已经接受了答案。)
- 再次编辑;-)
- 你太棒了,谢谢。
- 不客气!顺便看看Marc Andr&;Lafuture的回答(见EDOCX1的注释(2)),看看为什么再次使用相同的RNG是个好主意。
- @你能解释一下这行代码1吗?步骤(5,0.1)是指|
- @Beast_代码是指以0.1为步数从1到5的计数。参见ruby doc.org/core-2.1.3/numeric.html method-i-step