#python #zfit
#python #zfit
Вопрос:
Я искал в документации, как получить PDF из гистограммы, но я ничего не смог найти, так как я могу получить PDF из гистограммы?, например, чтобы использовать его в sum_pdf = zfit.pdf.SumPDF([model1, model2], fracs=frac), чтобы выполнить подгонку или, возможно, сгенерировать какие-то игрушки.
Заранее спасибо.
PS. Я ищу что-то похожее на класс RooHistPdf из Roofit.
Ответ №1:
Обновленный ответ
zfit теперь позволяет выполнять привязку к бину (для текущей установки pip install zfit --pre
), как описано в руководстве
В принципе, начиная с несвязанных данных или модели, вы можете сделать:
# make binned
binning = zfit.binned.RegularBinning(50, -8, 10, name="x")
obs_bin = zfit.Space("x", binning=binning)
data = data_nobin.to_binned(obs_bin)
model = zfit.pdf.BinnedFromUnbinnedPDF(model_nobin, obs_bin)
Старый ответ
В настоящее время для этого нет готового решения, но ведется работа.
Однако вы можете просто создать что-то самостоятельно, например:
import zfit
from zfit import z
import numpy as np
import tensorflow as tf
zfit.settings.options['numerical_grad'] = True
class BinnedEfficiencyPDF(zfit.pdf.BasePDF):
def __init__(self, efficiency, eff_bins, obs, name='BinnedEfficiencyPDF'):
self.efficiency = efficiency
self.eff_bins = eff_bins
super().__init__(obs=obs, name=name)
def _binContent(self, x):
eff_bin = np.digitize(x, self.eff_bins)
return self.efficiency[eff_bin]
def _unnormalized_pdf(self, x): # or even try with PDF
x = z.unstack_x(x)
probs = z.py_function(func=self._binContent, inp=[x], Tout=tf.float64)
probs.set_shape(x.shape)
return prob