我想知道是否有一种方法可以在多项式拟合中排除一个或多个数据区域。目前这似乎不像我预期的那样工作。这里有一个小例子:
import numpy as np
import pandas as pd
import zfit
# Create test data
left_data = np.random.uniform(0, 3, size=1000).tolist()
mid_data = np.random.uniform(3, 6, size=5000).tolist()
right_data = np.random.uniform(6, 9, size=1000).tolist()
testsample = pd.DataFrame(left_data + mid_data + right_data, columns=["x"])
# Define fit parameter
coeff1 = zfit.Parameter('coeff1', 0.1, -3, 3)
coeff2 = zfit.Parameter('coeff2', 0.1, -3, 3)
# Define Space for the fit
obs_all = zfit.Space("x", limits=(0, 9))
# Perform the fit
bkg_fit = zfit.pdf.Chebyshev(obs=obs_all, coeffs=[coeff1, coeff2], coeff0=1)
new_testsample = zfit.Data.from_pandas(obs=obs_all, df=testsample.query("x<3 or x>6"), weights=None)
nll = zfit.loss.UnbinnedNLL(model=bkg_fit, data=new_testsample)
minimizer = zfit.minimize.Minuit()
result = minimizer.minimize(nll)
在这里,我创建了一个包含 3 个均匀分布数据的小型测试样本。我只想使用 x < 3 OR x > 6 中的数据并忽略其间的“峰值”。由于它们的形状和高度相同,我希望 coeff1 和 coeff2 将(几乎)为零,并且拟合曲线将是一条直线,水平线。显然这不会发生,因为 zfit 假设 3 到 6 之间没有条目。
我还尝试使用 MultiSpaces 通过忽略该区域
limit1 = zfit.Space("x", limits=(0, 3))
limit2 = zfit.Space("x", limits=(6, 9))
obs_data = limit1 + limit2
但这会导致
ValueError: obs need to be a Space with exactly one limit if rescaling is requested.
任何人都知道如何解决这个问题?
提前谢谢^^