首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何利用指数分布模拟泊松分布

如何利用指数分布模拟泊松分布
EN

Stack Overflow用户
提问于 2017-10-23 07:13:30
回答 2查看 3.7K关注 0票数 1

我被要求实现一个算法来模拟从泊松分布(lambda)分布使用模拟从指数分布。

给出如下密度: P(X = k) = P(X1 +···+ Xk≤1< X1 +···+ Xk+1),k= 1,2。。。。P(X = k)是lambda的泊松,Xi是指数分布。

我编写了模拟指数分布的代码,但不知道如何模拟泊松。有人能帮我吗?多谢百万。

我的代码:

代码语言:javascript
运行
AI代码解释
复制
n<-c(1:k)
  u<-runif(k)
  x<--log(1-u)/lambda
EN

回答 2

Stack Overflow用户

发布于 2017-10-23 12:45:49

我的工作假设你(或者你的导师)想要从基本原则上来做这件事,而不仅仅是调用内置的Poisson生成器。算法非常简单。您可以用指定的速率计算生成多少指数,直到它们的总和超过1为止。

我的R是生疏的,这听起来像个家庭作业,所以我会用伪代码来表示:

代码语言:javascript
运行
AI代码解释
复制
count <- 0
sum <- 0
repeat {
  generate x ~ exp(lambda)
  sum <- sum + x
  if sum > 1
    break
  else
    count <- count + 1
}

循环中的count后的break值是本次试验的泊松结果。如果将其包装为函数,则从循环中返回count而不是breaking。

您可以通过几种方法对此进行计算改进。首先要注意的是,用于生成指数的1-U项有一个统一的分布,可以用U代替。更重要的改进是将评估写成最大化i s.t。SUM(-log(Ui) / rate) <= 1,所以SUM(log(Ui)) >= -rate

现在将双方进行指数化,并简化为

代码语言:javascript
运行
AI代码解释
复制
PRODUCT(Ui) >= Exp(-rate).

它的右边是常量,可以预先计算,将从k+1日志计算和添加到一个幂和k+1乘数的工作量减少:

代码语言:javascript
运行
AI代码解释
复制
count <- 0
product <- 1
threshold = Exp(-lambda)
repeat {
  generate u ~ Uniform(0,1)
  product <- product * u
  if product < threshold
    break
  else
    count <- count + 1
}

假设对两个实现进行U替换1-U,它们在代数上是相等的,并将在给定的U的浮点算法的精度范围内得到相同的答案。

票数 5
EN

Stack Overflow用户

发布于 2017-10-23 07:56:21

按照上述建议,您可以使用rpois生成泊松变量。但是,我对这个问题的理解是,您希望从基本原则出发,而不是使用内置函数。要做到这一点,您需要使用泊松到达的属性,说明到达时间是指数分布的。因此,我们的工作如下:

步骤1:从指数分布生成一个(大)样本,并创建累积和向量。这个向量的第k个入口是第k个泊松到达的等待时间。

步骤2:测量我们在单位时间间隔内看到的到达量

Step3:重复步骤1和2多次,并将结果收集到一个向量中。

这将是你的样本从泊松分布与正确的速率参数。

守则:

代码语言:javascript
运行
AI代码解释
复制
lambda=20 # for example
out=sapply(1:100000, function(i){
   u<-runif(100)
   x<--log(1-u)/lambda
   y=cumsum(x)
   length(which(y<=1))
})

然后,您可以通过Kolmogorov测试测试内建函数的有效性:

代码语言:javascript
运行
AI代码解释
复制
ks.test(out, rpois(100000, lambda))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46892813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档