首先,感谢您制作了一个非常整洁的pythonic工具,它可以用作RooFit的替代品。
我已经成功地定义了一个自定义的2D PDF,但我不完全确定如何注册我的函数的解析积分:
Analytic integral from WolframAlpha
PDF的定义如下:
class PdfForDeltaW(zfit.pdf.ZPDF):
"""Pdf to calculate epsilon, w, and delta w, as a function of sig-flav and tag-flav"""
_N_OBS = 2
_PARAMS = "epsilon w delta_w mix_prob".split()
def _unnormalized_pdf(self, x):
"""Calculation of PDF value"""
sigflav, tagflav = zfit.ztf.unstack_x(x)
epsilon = self.params["epsilon"]
w = self.params["w"]
delta_w = self.params["delta_w"]
mix_prob = self.params["mix_prob"]
dilution = 1 - 2 * w
mixing = 1 - 2 * mix_prob
return (
0.5
* epsilon
* (1 - sigflav * tagflav * (sigflav * delta_w + dilution * mixing))
)从github上的示例来看,除了可以通过params属性访问的fit变量之外,我不确定如何访问用于计算的fit观察值(即,对于2D情况,x,sigflav和y,tagflav )。
此外,我不确定应该如何定义我的限制。我知道x和y都必须在- 1,1的范围内。我认为如果能更清楚地了解应该如何使用zfit.Space.from_axes函数,以及它与解析积分的关系,那会很好。
干杯,科尔姆
发布于 2019-12-03 15:14:33
谢谢你,让我来解释一下不同的东西:
拟合变量
如果你想在整个PDF上注册一个整数,你不需要访问sigflav和tagflav,因为你是在它们上面集成的。如果你有一个偏积分,你可以通过x来访问它们,在_unnormalized_pdf的情况下,它充当参数。
距轴的空间
Space定义了您的坐标和限制/范围。通常,作为PDF的用户,这涉及到可观察对象(如DataFrame的列)。但是如果我们创建一个PDF,它将要使用的观察点当然是未知的,PDF的工作“基于位置”,或“基于轴”。例如,在您的示例中,sigflav位于轴0上,无论将与其一起使用的可观察对象的名称是什么。这就是为什么在注册积分时,我们需要使用根据axes定义的Space。
积分极限
对PDF的限制可以有不同的控制。如果需要,可以实现更细粒度的控制,但目前可用的是,您可以定义从某个点/或任何地方到某个点/任何地方的积分。
这是很有用的,因为你可以注册几个积分。也许你知道一般积分,它有一个复杂的形式。但是你也知道,例如,从-1到1的整数正好是1,所以你也可以注册它,并给它更高的优先级。这意味着,如果你对1和1进行积分,则使用更简单的形式,否则使用更一般的形式。
在您的示例中,您希望从ANY注册到ANY,或者使用as限制ANY_LOWER、ANY_UPPER,如下所示
lower_full = ((zfit.Space.ANY_LOWER, zfit.Space.ANY_LOWER),)
upper_full = ((zfit.Space.ANY_UPPER, zfit.Space.ANY_UPPER),)
integral_full_limits = zfit.Space.from_axes(axes=(0, 1),
limits=(lower_full, upper_full))https://stackoverflow.com/questions/59149209
复制相似问题