我正在尝试使用由直方图制作的 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 Minimum
和ABOVE EDM threshold (goal x 10)
/或非常接近起始数字的值。然而,收敛并不难,我的愚蠢循环检查最小化 NLL 的数字,我很快就得到了正确的值(4.458,离 4.3 不远)。
我不明白我做错了什么,理论上migrad
应该给我与我的愚蠢循环相同的结果......我是否以错误的方式使用它?我也尝试了UnbinnedNLL
和LeastSquares
成本函数(使用 PDF 而不是 CDF),但同样的问题。
谢谢!