2 dim 数据集的 zfit 直线拟合

zfit straight line fitting for 2 dim dataset

我想使用 zfit 按直线 (a*x+b) 拟合 2-dim 图,如下图所示。

probfit 包很容易做到这一点,但它已被 scikit-hep 弃用。 https://nbviewer.jupyter.org/github/scikit-hep/probfit/blob/master/tutorial/tutorial.ipynb

如何通过任何函数拟合这样的 2dim 图? 我已经检查了 zfit 示例,但它似乎假设了一些分布(直方图)因此 zfit 需要像 1d 数组这样的数据集,我无法达到如何将 2d 数据传递给 zfit。

目前在 zfit 中没有直接的方法来实现这个开箱即用的方法(一行),因为根本没有添加相应的损失。

然而,SimpleLoss (zfit.loss.SimpleLoss) allows you to construct 任何你能想到的损失(请查看文档字符串中的示例)。在你的情况下,这看起来像这样:

x = your_data
y = your_targets  # y-value
obs = zfit.Space('x', (lower, upper))

param1 = zfit.Parameter(...)
param2 = zfit.Parameter(...)
...
model = Func(...)  # a function is the way to go here
data = zfit.Data.from_numpy(array=x, obs=obs)

def mse():
    prediction = model.func(data)
    value = tf.reduce_mean((prediction - y) ** 2)  # or whatever you want to have
    return value

loss = zfit.loss.SimpleLoss(mse, [param1, param2])
# etc.

另一方面,添加这样的损失是个好主意。如果您有兴趣做出贡献,我建议您与作者联系,他们会很乐意为您提供帮助并指导您。

更新

损失函数本身大概由三到四样东西组成:x、y、模型以及 y 的不确定性。 chi2 损失如下所示:

def chi2():
    y_pred = model.func(x)
    return tf.reduce_sum((y_pred - y) / y_error) ** 2)
    
loss = zfit.loss.SimpleLoss(chi2, model.get_params())

仅此而已,4 行代码。 x 是一个 zfit.Data 对象,模型在本例中是一个 Func.

这有用吗? 就这些了。