如何在numpy.random.beta(alpha,beta)和scipy.stats.beta(alpha,beta,loc,scale)之间关联beta分布的alpha和beta参数?

wfsdck30  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(175)

我使用numpy分布来生成蒙特卡洛模拟的随机数,使用Fitter库来拟合分布的结果。问题是拟合的参数作为4个参数(a,b,loc,scale)返回到scipy库,我需要找到numpy(a,b)的等效参数。
如果我拟合一个scipy.stats.beta(a,b,loc=0,scale=1)(蓝线),它等于一个numpy.random.beta(a,b)(条形)x1c 0d1x
我试着用scify.stats.beta.fit(x,floc=0,fscale=1)来拟合它们,但我得到了以下错误:
数据错误:data中的值无效。带“beta”的最大似然估计要求data中的每个x都满足0〈(x - loc)/scale〈1。
如果我不将floc设置为0,fscale设置为1,则返回如下结果:[147.1,147.06,-23.56,137.13],它们是a,B,位置,比例。
如何将它们转换为a,a,B,loc=0,scale=1?
我的问题是,我正在创建一个软件,其中用户创建输入变量遵循概率分布,执行蒙特卡罗模拟并获得输出变量的结果。我正在对这些变量的分布执行拟合,需要以最初输入的相同格式将拟合参数返回给用户。如果用户使用alpha和beta参数来创建beta分布的变量,我无法返回4个参数来模拟Beta分布。我已经能够用我需要的其他分布来完成它,但我与Beta的堆栈

6xfqseft

6xfqseft1#

如果您有beta分布的参数ablocscale,并且希望使用NumPy从该分布生成n随机样本,则可以编写

sample = loc + scale*np.random.beta(a, b, size=n)  # Legacy random API

或者,使用较新的(推荐的)API

rng = np.random.default_rng()
sample = loc + scale*rng.beta(a, b, size=n)

您也可以使用scipy.stats.betarvs()方法:

sample = scipy.stats.beta.rvs(a, b, loc=loc, scale=scale, size=n)
56lgkhnf

56lgkhnf2#

我遇到了一个概念上的问题。要强制loc和scale为0和1,如numpy中所示,可以执行以下操作:
(scipy.stats.beta.fit数值,floc=0,fscale=1)
这里的问题是,如果一系列的数字中有大于1或小于0的值,就不能用这种方法来调整,因为我用loc和scale的值精确地设置了这些限制,代码将返回一个错误。如果我需要调整一系列不在0到1范围内的数字,loc和scale的值就不能是0和1。

相关问题