我正在尝试拟合一个beta分布,它应该在一个只有子范围内的样本的数据集上定义,介于0和1之间。我的问题是使用fit()
函数将导致只在我的最小值和最大值之间定义拟合的PDF。
例如,如果我的数据集的样本介于0.2和0.3之间,那么我得到的是一个定义在0.2和0.3之间的PDF,而不是介于0和1之间的PDF。我正在使用的代码是:
ps1 = beta.fit(selected, loc=0, scale=1)
我错过了什么吗? 提前谢谢!
答案 0 :(得分:1)
所以:
如果分布确实是Beta分布,并且alpha和beta参数是0和1附近的密度为零,则可能发生这种情况。
在这种情况下,我建议使用最大似然法,将活动参数限制为具有已知a和b参数的alpha和beta。
使用MaximumLikelihoodFactory
类的OpenTURNS setKnownParameter
类,这很容易。这种方法可以限制通过最大似然法优化的参数。
为重现这种情况,我使用以下参数创建了Beta发行版。
import openturns as ot
distribution = ot.Beta(3.0, 2.0, 0.0, 1.0)
sampleSize = 100
sample = distribution.getSample(sampleSize)
使用已知的a和b参数拟合Beta分布很简单。
factory = ot.MaximumLikelihoodFactory(distribution)
factory.setKnownParameter([0.0, 1.0], [2, 3])
inf_distribution = factory.build(sample)
列表[0.0, 1.0]
包含a和b参数的值,索引[2, 3]
是Beta分布中参数的索引。
这样会产生:
Beta(alpha = 3.02572, beta = 1.88172, a = 0, b = 1)
使用我模拟的样本。
答案 1 :(得分:0)
我提出了一个部分解决方案,为我提供了技巧:我复制我的样本(对于太小的数据集)并在0和1处添加虚拟样本。虽然这会增加拟合误差,但它足够低为了我的目的。 另外,我在谷歌小组中询问并this answer工作正常,但它偶尔会给我一些错误。我希望这有助于解决这个问题的任何人。