0

我需要用似然法拟合一些实验数据,并生成一些随机数据来检查该技术。我对(v 2.7.0)有一些经验,iminuit看起来scipy.stats有许多应该有用的现有发行版,提供 pdf/cds 和随机变量(我使用 scipy 1.5.2)。通常,我需要现有分布的组合,例如平坦分布、指数分布和三个高斯分布,全部截断。到目前为止,我正在做的是:

  • 创建truncFEGGG_gen,一个子类scipy.stats.rv_continuous(有 13 个参数,包括边缘,因为我觉得locscale混乱),覆盖_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 存在问题),所以我想知道其他人将如何解决这个问题。有什么建议么?

  • 之后,我运行最小化器,使用开始参数,迭代直到事情收敛
4

0 回答 0