0

在玩 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'))
4

0 回答 0