在处理zfit 教程时,我只是尝试删除alpha_sig参数的floating选项。换句话说,我改变了
alpha_sig = zfit.Parameter('alpha_sig', 200, 100, 400, floating=False)至
alpha_sig = zfit.Parameter('alpha_sig', 200, 100, 400)在本例中,result.hesse函数失败。(结果为空。)
[a path]/.venv/lib/python3.9/site-packages/zfit/minimizers/fitresult.py:153: UserWarning: minuit failed to calculate the covariance matrix or similar when calling `hesse`.Try to use `hesse_np` as the method instead and try again.This is unexpected and may has to do with iminuitV2. Either way, please fill an issue if this is not expected to fail for you.
warnings.warn('minuit failed to calculate the covariance matrix or similar when calling `hesse`.'然后,我将hesse函数从
result.hesse(method='minuit_hesse', name='hesse')至
result.hesse(method='hesse_np', name='hesse')而且它也失败了。
[a path]/zfit/.venv/lib/python3.9/site-packages/zfit/minimizers/fitresult.py:943: RuntimeWarning: Exception occurred, parameter values are not reset and in an arbitrary, last used state. If this happens during normal operation, make sure you reset the values.
warnings.warn("Exception occurred, parameter values are not reset and in an arbitrary, last"
Traceback (most recent call last):
File "[a path]/zfit/Introduction2_DSCB.py", line 102, in <module>
print(result.hesse(method='hesse_np', name='hesse'))
File "[a path]/zfit/.venv/lib/python3.9/site-packages/tensorflow/python/util/deprecation.py", line 549, in new_func
return func(*args, **kwargs)
File "[a path]/zfit/.venv/lib/python3.9/site-packages/zfit/minimizers/fitresult.py", line 1010, in hesse
error_dict = self._hesse(params=uncached_params, method=method, cl=cl)
File "[a path]/zfit/.venv/lib/python3.9/site-packages/zfit/minimizers/fitresult.py", line 1030, in _hesse
covariance_dict = self.covariance(params, method, as_dict=True)
File "[a path]/zfit/.venv/lib/python3.9/site-packages/zfit/minimizers/fitresult.py", line 1189, in covariance
self._covariance_dict[method] = self._covariance(method=method)
File "[a path]/zfit/.venv/lib/python3.9/site-packages/zfit/minimizers/fitresult.py", line 1211, in _covariance
return method(result=self, params=params)
File "[a path]/zfit/.venv/lib/python3.9/site-packages/zfit/minimizers/fitresult.py", line 177, in _covariance_np
covariance = np.linalg.inv(hessian)
File "<__array_function__ internals>", line 5, in inv
File "[a path]/zfit/.venv/lib/python3.9/site-packages/numpy/linalg/linalg.py", line 546, in inv
ainv = _umath_linalg.inv(a, signature=signature, extobj=extobj)
File "[a path]/zfit/.venv/lib/python3.9/site-packages/numpy/linalg/linalg.py", line 88, in _raise_linalgerror_singular
raise LinAlgError("Singular matrix")
numpy.linalg.LinAlgError: Singular matrix在zfit的其他用法(参数和函数(如DoubleCB))中,我也经常看到这种错误。请告诉我这些错误(特别是后者)意味着什么,以及我能做些什么。谢谢!
以下是确切的脚本。
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
import zfit
from zfit import z
import sys
size_normal = 10000
mass_obs = zfit.Space('mass', (0, 1000))
mu_sig = zfit.Parameter('mu_sig', 400, 100, 600)
sigma_sig = zfit.Parameter('sigma_sig', 50, 1, 100)
alpha_sig = zfit.Parameter('alpha_sig', 200, 100, 400)#, floating=False)
n_sig = zfit.Parameter('n sig', 4, 0.1, 30, floating=False)
signal = zfit.pdf.CrystalBall(obs=mass_obs, mu=mu_sig, sigma=sigma_sig, alpha=alpha_sig, n=n_sig)
lam = zfit.Parameter('lambda', -0.01, -0.05, -0.001)
comb_bkg = zfit.pdf.Exponential(lam, obs=mass_obs)
part_reco_data = np.random.normal(loc=200, scale=150, size=700)
part_reco_data = zfit.Data.from_numpy(obs=mass_obs, array=part_reco_data) # we don't need to do this but now we're sure it's inside the limits
part_reco = zfit.pdf.KDE1DimExact(obs=mass_obs, data=part_reco_data, bandwidth='adaptive_zfit')
sig_frac = zfit.Parameter('sig_frac', 0.3, 0, 1)
comb_bkg_frac = zfit.Parameter('comb_bkg_frac', 0.25, 0, 1)
model = zfit.pdf.SumPDF([signal, comb_bkg, part_reco], [sig_frac, comb_bkg_frac])
with zfit.param.set_values([mu_sig, sigma_sig, sig_frac, comb_bkg_frac, lam], [370, 34, 0.18, 0.15, -0.006]):
data = model.sample(n=10000)
sig_yield = zfit.Parameter('sig_yield', 2000, 0, 10000, step_size=1)
sig_ext = signal.create_extended(sig_yield)
comb_bkg_yield = zfit.Parameter('comb_bkg_yield', 6000, 0, 10000, step_size=1)
comb_bkg_ext = comb_bkg.create_extended(comb_bkg_yield)
part_reco_yield = zfit.Parameter('part_reco_yield', 2000, 0, 10000, step_size=1)
part_reco.set_yield(part_reco_yield)
part_reco_ext = part_reco
model_ext_sum = zfit.pdf.SumPDF([sig_ext, comb_bkg_ext, part_reco_ext])
nll = zfit.loss.ExtendedUnbinnedNLL(model_ext_sum, data)
minimizer = zfit.minimize.Minuit(gradient=True)
values = z.unstack_x(data)
obs_right_tail = zfit.Space('mass', (700, 1000))
data_tail = zfit.Data.from_tensor(obs=obs_right_tail, tensor=values)
with comb_bkg.set_norm_range(obs_right_tail):
nll_tail = zfit.loss.UnbinnedNLL(comb_bkg, data_tail)
minimizer.minimize(nll_tail)
lam.floating = False
result = minimizer.minimize(nll)
#print(result.hesse(method='minuit_hesse', name='hesse'))
print(result.hesse(method='hesse_np', name='hesse'))发布于 2022-04-01 19:02:17
误差产生于Hessian矩阵,或者更好的是它的逆无法计算。
由于200的值在我看来很高,原因可能是它对这个参数不敏感。例如,我会尝试将其设置在一个不同的范围。
我注意到,对于alpha来说,最小值是非常不稳定的,它是一个影响很小的参数。
此外,与默认版本相比,随着数字的分散,hesse_np似乎存在一个数值问题。
下面是脚本,我只是让param浮动(可能试过几次)。如果这样做不起作用,或者你看到数字也有分歧,那么也许有必要公开一个问题。
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
import zfit
from zfit import z
import sys
size_normal = 10000
mass_obs = zfit.Space('mass', (0, 1000))
mu_sig = zfit.Parameter('mu_sig', 400, 100, 600)
sigma_sig = zfit.Parameter('sigma_sig', 50, 1, 100)
alpha_sig = zfit.Parameter('alpha_sig', 2, 1, 400)#, floating=False)
n_sig = zfit.Parameter('n sig', 4, 0.1, 30, floating=False)
signal = zfit.pdf.CrystalBall(obs=mass_obs, mu=mu_sig, sigma=sigma_sig, alpha=alpha_sig, n=n_sig)
lam = zfit.Parameter('lambda', -0.01, -0.05, -0.001)
comb_bkg = zfit.pdf.Exponential(lam, obs=mass_obs)
part_reco_data = np.random.normal(loc=200, scale=150, size=700)
part_reco_data = zfit.Data.from_numpy(obs=mass_obs, array=part_reco_data) # we don't need to do this but now we're sure it's inside the limits
part_reco = zfit.pdf.KDE1DimExact(obs=mass_obs, data=part_reco_data, bandwidth='adaptive_zfit')
sig_frac = zfit.Parameter('sig_frac', 0.3, 0, 1)
comb_bkg_frac = zfit.Parameter('comb_bkg_frac', 0.25, 0, 1)
model = zfit.pdf.SumPDF([signal, comb_bkg, part_reco], [sig_frac, comb_bkg_frac])
with zfit.param.set_values([mu_sig, sigma_sig, sig_frac, comb_bkg_frac, lam], [370, 34, 0.18, 0.15, -0.006]):
data = model.sample(n=10000)
sig_yield = zfit.Parameter('sig_yield', 2000, 0, 10000, step_size=1)
sig_ext = signal.create_extended(sig_yield)
comb_bkg_yield = zfit.Parameter('comb_bkg_yield', 6000, 0, 10000, step_size=1)
comb_bkg_ext = comb_bkg.create_extended(comb_bkg_yield)
part_reco_yield = zfit.Parameter('part_reco_yield', 2000, 0, 10000, step_size=1)
part_reco.set_yield(part_reco_yield)
part_reco_ext = part_reco
model_ext_sum = zfit.pdf.SumPDF([sig_ext, comb_bkg_ext, part_reco_ext])
nll = zfit.loss.ExtendedUnbinnedNLL(model_ext_sum, data)
minimizer = zfit.minimize.Minuit(gradient=True, verbosity=7)
values = z.unstack_x(data)
obs_right_tail = zfit.Space('mass', (700, 1000))
data_tail = zfit.Data.from_tensor(obs=obs_right_tail, tensor=values)
with comb_bkg.set_norm_range(obs_right_tail):
nll_tail = zfit.loss.UnbinnedNLL(comb_bkg, data_tail)
minimizer.minimize(nll_tail)
lam.floating = False
result = minimizer.minimize(nll)
#print(result.hesse(method='minuit_hesse', name='hesse'))
print(result)
result.hesse(name='hesse')
print(result)
result.hesse(method='hesse_np', name='hesse_np')
print(result)https://stackoverflow.com/questions/71299799
复制相似问题