【问题标题】:Generate random numbers for a non-standard beta distribution为非标准 beta 分布生成随机数
【发布时间】:2021-06-03 23:07:18
【问题描述】:

我需要使用以下参数生成遵循 beta 分布的随机数。 X 在 [0.2,2] 之间,平均值 = 0.60 和标准 = 0.15。

我已经有了这段代码,但是当我总结生成向量的平均值和标准时,它们与输入参数不一致。恐怕有些东西不能正常工作,有人可以帮忙吗?

这是代码:

ac,bc=0.2,2.0
mc,sc=0.6,0.15
mc = (mc-ac)/(bc-ac)
sc = (sc**2/(bc-ac)**2)**0.5
alpha_C_Crit = mc*(mc*(1-mc)/sc**2-1)
beta_C_Crit = (1-mc)*(mc*(1-mc)/sc**2-1)
C_crit= beta.rvs(alpha_C_Crit,beta_C_Crit,loc=0.2,scale=2.0,size=100000)

生成向量 C_crit.mean()=0.6445875200893583(不接近 0.60)和 C_crit.std()=0.16723411402825206 不接近 0.15 的汇总。

【问题讨论】:

  • edit标记正在使用的语言/库
  • 你生成的向量 C 有多大?

标签: python random probability distribution


【解决方案1】:

我没有发现您的错误(尽管您似乎在平方然后不必要地平方根)。我继续使用numpy 独立完成了我自己的实现,以下产生了目标均值和标准差的结果:

import numpy

my_min = 0.2
my_max = 2.0
mu = 0.6
sigma = 0.15

# Rescale distribution to range of std beta: (0,1)
scale_factor = my_max - my_min
std_mu = (mu - my_min) / scale_factor
std_sigma = sigma / scale_factor

# Convert mu/sigma to alpha/beta as used by numpy.random.beta()
nu = std_mu * (1.0 - std_mu) / (std_sigma * std_sigma) - 1.0
alpha_param = std_mu * nu
beta_param = (1.0 - std_mu) * nu

# Generate std betas, scale and translate back to original parameterization
ary = scale_factor * numpy.random.beta(alpha_param, beta_param, 100000) + my_min

使用 JMP 统计软件分析结果产生以下直方图和汇总统计数据:

这不会逼近该范围的上限,因为接近 2.0 的值将超过平均值的 9 个标准差。

【讨论】:

  • 您好,感谢您的宝贵帮助。我不确定如何使用 numpy 方法重新缩放 alpha 和 beta 参数。你的提议比我的提议更好地描述了数据。非常感谢您的帮助!
  • @DanielCassiani 请注意SO's guidance for responding to answers。纯粹是可选的,但这就是这里的工作方式。
猜你喜欢
  • 1970-01-01
  • 2011-05-10
  • 2019-06-04
  • 2017-12-28
  • 1970-01-01
  • 2017-07-16
  • 2011-03-31
  • 1970-01-01
  • 2016-05-09
相关资源
最近更新 更多