在玩 zfit tutorial时,我只是尝试删除参数的floating
选项alpha_sig
。换句话说,我改变了
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'))