我需要用似然法拟合一些实验数据,并生成一些随机数据来检查该技术。我对(v 2.7.0)有一些经验,iminuit
看起来scipy.stats
有许多应该有用的现有发行版,提供 pdf/cds 和随机变量(我使用 scipy 1.5.2)。通常,我需要现有分布的组合,例如平坦分布、指数分布和三个高斯分布,全部截断。到目前为止,我正在做的是:
创建
truncFEGGG_gen
,一个子类scipy.stats.rv_continuous
(有 13 个参数,包括边缘,因为我觉得loc
很scale
混乱),覆盖_argcheck
,_get_support
,_pdf
,_cdf
和_rvs
, 和truncFEGGG = truncFEGGG_gen
然后我定义我的开始参数:数据
pars = {'nu': 6758, 'a': 0.1, 'b': 3.6, 'c': -87.5, ...}
中的总计数在哪里nu
,其他参数是 cdf 的那些我定义了
iminuit
扩展分箱似然拟合的实例,并将分布的累积计数传递给它:
m = Minuit(ExtendedBinnedNLL(binnedData, binEdges,
lambda x, nu, a, b, c, ...: nu * td.truncFEGGG.cdf(x, a, b, c, ...)),
**pars)
这最后一步是目前给我带来麻烦的一步;因为我需要使用几种不同的模型,所以我lambda
每次都需要编写一个不同的函数(一个容易出错的过程),如果我可以scipy.stats
一劳永逸地将累积计数添加到所有分布中,那就容易多了通过该功能:truncFEGGG.cntsCumul(x, nu, a, b, c, d...)
. 这似乎不可行(向 scipy.stats.rv_continuous 添加方法,rv_frozen 存在问题),所以我想知道其他人将如何解决这个问题。有什么建议么?
- 之后,我运行最小化器,使用开始参数,迭代直到事情收敛