0

我正在尝试使用由直方图制作的 PDF 将 iminuit 用于 UnbinnedNLL(对于说 ROOT 的人,我正在尝试做与 RooHistPDF 等效的事情)。到目前为止,我想出了这个:

import numpy as np
import scipy.stats

from iminuit import cost, Minuit

# ... part of code where I load dq_data, dx_data, dq, dx

n_bins = 50
xrange = (0,20)

def cdf(x, gain):
    hist = np.histogram(dq_data/dx_data/gain, range=xrange,bins=n_bins)
    return scipy.stats.rv_histogram(hist).cdf(x)

n, xe = np.histogram(dq/dx/4, bins=n_bins, range=x_range)
c = cost.BinnedNLL(n, xe, cdf)
m = Minuit(c, gain=4.3)
m.limits['gain'] = (3, 5)
m.migrad()

但是,我得到了糟糕的结果。根据我得到的起始值INVALID MinimumABOVE EDM threshold (goal x 10)/或非常接近起始数字的值。然而,收敛并不难,我的愚蠢循环检查最小化 NLL 的数字,我很快就得到了正确的值(4.458,离 4.3 不远)。

我不明白我做错了什么,理论上migrad应该给我与我的愚蠢循环相同的结果......我是否以错误的方式使用它?我也尝试了UnbinnedNLLLeastSquares成本函数(使用 PDF 而不是 CDF),但同样的问题。

谢谢!

4

0 回答 0