0

我想使用 zfit 通过直线 (a*x+b) 拟合二维图,如下图所示。2_dim_plot 示例

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

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

4

1 回答 1

0

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

但是,SimpleLoss(zfit.loss.SimpleLoss)允许您构建您能想到的任何损失(请查看文档字符串中的示例)。在你的情况下,这看起来像这样:

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对象,在这种情况下模型是 a Func

那样有用吗?就这样。

于 2020-11-24T18:17:49.267 回答