def test_unbinned_nll(weights, sigma): gaussian1, mu1, sigma1 = create_gauss1() gaussian2, mu2, sigma2 = create_gauss2() test_values = tf.constant(test_values_np) test_values = zfit.Data.from_tensor(obs=obs1, tensor=test_values, weights=weights) nll_object = zfit.loss.UnbinnedNLL(model=gaussian1, data=test_values) minimizer = Minuit(tolerance=1e-5) status = minimizer.minimize(loss=nll_object, params=[mu1, sigma1]) params = status.params rel_error = 0.005 if weights is None else 0.1 # more fluctuating with weights assert params[mu1]['value'] == pytest.approx(np.mean(test_values_np), rel=rel_error) assert params[sigma1]['value'] == pytest.approx(np.std(test_values_np), rel=rel_error) constraints = zfit.constraint.nll_gaussian( params=[mu2, sigma2], observation=[mu_constr[0], sigma_constr[0]], uncertainty=sigma()) nll_object = UnbinnedNLL(model=gaussian2, data=test_values, constraints=constraints) minimizer = Minuit(tolerance=1e-4) status = minimizer.minimize(loss=nll_object, params=[mu2, sigma2]) params = status.params if weights is None: assert params[mu2]['value'] > np.average(test_values_np, weights=weights) assert params[sigma2]['value'] < np.std(test_values_np)
def test_unbinned_simultaneous_nll(): test_values = tf.constant(test_values_np) test_values = zfit.Data.from_tensor(obs=obs1, tensor=test_values) test_values2 = tf.constant(test_values_np2) test_values2 = zfit.Data.from_tensor(obs=obs1, tensor=test_values2) gaussian1, mu1, sigma1 = create_gauss1() gaussian2, mu2, sigma2 = create_gauss2() gaussian2 = gaussian2.create_extended(zfit.Parameter('yield_gauss2', 5)) nll = zfit.loss.UnbinnedNLL( model=[gaussian1, gaussian2], data=[test_values, test_values2], ) minimizer = Minuit(tolerance=1e-5) status = minimizer.minimize(loss=nll, params=[mu1, sigma1, mu2, sigma2]) params = status.params assert set(nll.get_params()) == {mu1, mu2, sigma1, sigma2} assert params[mu1]['value'] == pytest.approx(np.mean(test_values_np), rel=0.007) assert params[mu2]['value'] == pytest.approx(np.mean(test_values_np2), rel=0.007) assert params[sigma1]['value'] == pytest.approx(np.std(test_values_np), rel=0.007) assert params[sigma2]['value'] == pytest.approx(np.std(test_values_np2), rel=0.007)
def test_extended_unbinned_nll(): test_values = ztf.constant(test_values_np) test_values = zfit.Data.from_tensor(obs=obs1, tensor=test_values) gaussian3, mu3, sigma3, yield3 = create_gauss3ext() nll_object = zfit.loss.ExtendedUnbinnedNLL(model=gaussian3, data=test_values, fit_range=(-20, 20)) minimizer = Minuit() status = minimizer.minimize(loss=nll_object) params = status.params assert params[mu3]['value'] == pytest.approx(np.mean(test_values_np), rel=0.005) assert params[sigma3]['value'] == pytest.approx(np.std(test_values_np), rel=0.005) assert params[yield3]['value'] == pytest.approx(yield_true, rel=0.005)
def test_unbinned_simultaneous_nll(): test_values = tf.constant(test_values_np) test_values = zfit.Data.from_tensor(obs=obs1, tensor=test_values) test_values2 = tf.constant(test_values_np2) test_values2 = zfit.Data.from_tensor(obs=obs1, tensor=test_values2) gaussian1, mu1, sigma1 = create_gauss1() gaussian2, mu2, sigma2 = create_gauss2() nll_object = zfit.loss.UnbinnedNLL(model=[gaussian1, gaussian2], data=[test_values, test_values2], fit_range=[(-np.infty, np.infty), (-np.infty, np.infty)] ) minimizer = Minuit() status = minimizer.minimize(loss=nll_object, params=[mu1, sigma1, mu2, sigma2]) params = status.params assert params[mu1]['value'] == pytest.approx(np.mean(test_values_np), rel=0.005) assert params[mu2]['value'] == pytest.approx(np.mean(test_values_np2), rel=0.005) assert params[sigma1]['value'] == pytest.approx(np.std(test_values_np), rel=0.005) assert params[sigma2]['value'] == pytest.approx(np.std(test_values_np2), rel=0.005)