目前 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
。
那样有用吗?就这样。