首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多项式拟合(zfit)中的排除/忽略数据区域

多项式拟合(zfit)中的排除/忽略数据区域
EN

Stack Overflow用户
提问于 2022-01-13 09:43:22
回答 1查看 74关注 0票数 1

我想知道是否有一种方法在多项式拟合中排除一个或多个数据区域。目前,这似乎不像我所期望的那样起作用。这里有一个小例子:

代码语言:javascript
复制
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)

TestSample.png

在这里,我创建了一个包含3个均匀分布数据的小型测试示例。我只想使用x<3或x>6中的数据,而忽略中间的“峰值”。由于它们的形状和高度相等,我预计coeff1和coeff2将(几乎)为零,拟合的曲线将是一条直线,水平线。显然,这种情况不会发生,因为zfit假设在3到6之间没有条目。

我还尝试使用MultiSpaces来忽略该区域

代码语言:javascript
复制
limit1 = zfit.Space("x", limits=(0, 3))
limit2 = zfit.Space("x", limits=(6, 9))
obs_data = limit1 + limit2

但这会导致

代码语言:javascript
复制
ValueError: obs need to be a Space with exactly one limit if rescaling is requested.

有人知道怎么解决这个问题吗?

预先感谢^^

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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内缩放数据(因为多项式不是在外部定义的),而且不应该有任何错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70694366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档