从均匀随机变量生成 Beta 分布

机器算法验证 r 自习 随机变量 均匀分布 贝塔分布
2022-03-23 10:42:20

我需要使用均匀分布中的随机变量从 Beta 分布中生成随机数。
如果我有两个随机变量 如果那么来自 Beta 分布带有参数Y1=U11/αY2=U11/β
Y1+Y2<=1X=Y1/(Y1+Y2)α and β

这就是我到目前为止所做的:
我从均匀分布中生成了 10,000 个随机变量。然后我使用这些 rv使用
生成 然后我使用公式Y1and Y2Y1=U11/αY2=U11/β
XX=Y1/(Y1+Y2)

这是我使用的 R 代码:

library(dplyr)
# my plot
alpha <- 2
beta <- 4

set.seed(10)
u <- runif(10000,0,1)

y1 <- u^(1/alpha)
y2 <- u^(1/beta)


x <- data.frame(y1,y2 ) %>% 
  filter(y1+y2<=1) %>% # check that y1+y1 <=1
  mutate(x = y1/(y1+y2)) %>% # generate x random variable
  select(x) 

# plot x
hist(x$x)

# plot from beta distribution
hist(rbeta(10000,shape = 2,shape2 =4)) 

但是当我绘制这个时,直方图似乎与我刚刚从 Beta 分布生成 rv 时相反。这是我的情节: 在此处输入图像描述

如果我从实际的 beta 分布生成 rv,这里是情节:
在此处输入图像描述

为什么我的曲线看起来与 Beta 分布中的曲线不同?
这个问题看起来很相似,但解决方案使用qbeta()函数。我想我需要使用我的X=Y1/(Y1+Y2)

1个回答

我刚刚在发行版创建时遇到了同样的问题,感谢您对原帖的最新回复。请在下面找到在 Python 中创建一个 RV 的可行解决方案:

def beta(a,b):
    rv1 = np.random.rand()**(1/a)
    rv2 = np.random.rand()**(1/b)

    while (rv1+rv2) > 1:
        rv1 = np.random.rand()**(1/a)
        rv2 = np.random.rand()**(1/b)

    return = rv1 / (rv1+rv2)