簡體   English   中英

在多項式擬合 (zfit) 中排除/忽略數據區域

[英]Exclude/Ignore data region in polynomial fit (zfit)

我想知道是否有一種方法可以在多項式擬合中排除一個或多個數據區域。 目前這似乎不像我預期的那樣工作。 這里有一個小例子:

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)

測試樣例.png

在這里,我創建了一個包含 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.

任何人都知道如何解決這個問題?

提前謝謝^^

確實,這是一個棘手的問題,但這可能只需要在 zfit 中進行一個小的更新。

您所做的是正確的:僅使用所需區域中的數據。 然而,這還不是全部,因為有一個“標准化范圍”:從概率上講,這就像對某個區域的條件化,因為我們知道數據只能在特定區域中。 因此,PDF 的歸一化應該只在包含的(低和高)區域上集成。

這通常可以通過兩種方式完成:

使用多空間

像你一樣使用多空間屬性。 這應該可以工作(盡管將來很可能不是 go 的方法),除了多項式 function 中的一個怪癖:多項式定義為 -1 到 1。目前,數據只是重新調整為 - 1 和 1(為此它應該使用 PDF 的“空格”屬性)。 目前,這需要一個簡單的空間(原則上也可以允許,使用限制的最小值和最大值)。

同時配合

正如@jtlz2 的評論中提到的,您可以同時進行擬合。 這沒什么好擔心的,它只是將可能性分成兩部分。 由於它是概率的乘積,我們可以在概念上將其拆分為兩個乘積並相乘(或相加它們的對數)。

因此,您可以讓 pdf 同時適合下部區域和上部。 但是,這並不能解決歸一化的問題:應該將 PDF 歸一化為什么? 我們會遇到同樣的問題。

解決方案一:不同的空間和范數

然而,空間和歸一化范圍並不相同。 默認情況下,空格(通常稱為“obs”)也用作默認歸一化范圍,但不是必需的。 因此,您可以使用從最低點到最大點的一個空間作為 obs,然后使用您的多空間設置標准范圍set_norm應該這樣做,如果您使用的不是最新版本,則應該使用set_norm_range )。 我認為,這應該可以解決問題。

解決方案 2:手動重新縮放

實際問題是它抱怨無法重新縮放到 -1 和 1。 通過使用apply_scaling=False參數,也可以告訴每個執行此操作的多項式不要執行此操作。 這樣,您有責任在 -1 和 1 內縮放數據(因為多項式未在外部定義)並且不應該有任何錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM