我使用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的堆栈
2条答案
按热度按时间6xfqseft1#
如果您有beta分布的参数
a
、b
、loc
和scale
,并且希望使用NumPy从该分布生成n
随机样本,则可以编写或者,使用较新的(推荐的)API
您也可以使用
scipy.stats.beta
的rvs()
方法:56lgkhnf2#
我遇到了一个概念上的问题。要强制loc和scale为0和1,如numpy中所示,可以执行以下操作:
(scipy.stats.beta.fit数值,floc=0,fscale=1)
这里的问题是,如果一系列的数字中有大于1或小于0的值,就不能用这种方法来调整,因为我用loc和scale的值精确地设置了这些限制,代码将返回一个错误。如果我需要调整一系列不在0到1范围内的数字,loc和scale的值就不能是0和1。