我想知道是否有一种方法在多项式拟合中排除一个或多个数据区域。目前,这似乎不像我所期望的那样起作用。这里有一个小例子:
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或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.有人知道怎么解决这个问题吗?
预先感谢^^
发布于 2022-01-13 11:06:59
事实上,这是一个有点棘手的问题,但这可能只是需要一个小的zfit更新。
您所做的是正确的:只使用所需区域中的数据。然而,这并不是整个故事的全部,因为有一个“归一化范围”:从概率上讲,它就像一个特定区域上的条件,因为我们知道数据只能在一个特定的区域。因此,PDF的正常化应该只在包括的(低和高)区域进行整合。
这通常可以通过两种方式进行:
使用多空间
和您一样使用多空间属性。这应该是可行的(虽然它很可能不是将来的路),除了多项式函数中的一个怪癖:多项式被定义为-1到1。目前,数据被简单地重新标度为-1和1(为此,它应该使用PDF的"space“属性)。目前,这需要一个简单的空间(原则上也可以允许,使用限制的最小和最大)。
同时拟合
正如@jtlz2 2的注释中所提到的,您可以同时执行fit操作。这没什么好担心的,它只是把可能性分成两部分。由于它是概率的乘积,我们可以在概念上将其分解为两个乘积,然后乘以(或添加它们的日志)。
因此,您可以让pdf适合较低的区域和上层在同一时间。然而,这并不能解决规范化问题: PDF应该标准化到什么程度?我们会遇到同样的问题。
解1:不同的空间和范数
然而,空间和归一化范围并不相同。默认情况下,空格(通常称为“obs”)也用作默认的规范化范围,但不是必需的。因此,您可以使用从最低到最大的一个空格作为obs,然后使用您的多空间设置规范范围(如果使用的不是最新版本,set_norm应该这样做或set_norm_range )。这个,我想,应该能行。
解决方案2:手动调整
实际的问题是,它抱怨重新调整到-1和1,这是无法做到的。这样做的每个多项式也可以通过使用apply_scaling=False参数被告知不要这样做。这样,您就有责任在-1和1内缩放数据(因为多项式不是在外部定义的),而且不应该有任何错误。
https://stackoverflow.com/questions/70694366
复制相似问题