问题描述
我正在尝试在zfit中执行未绑定的3D角度拟合,其中输入数据是具有每个事件sWeight的样本,该样本的权重是从单独的不变质量峰拟合中分配的。我想我正在角相空间的某些区域遇到负加权事件的问题,因为zfit会给出错误:
Traceback (most recent call last):
File "unbinned_angular_fit.py",line 282,in <module>
main()
File "unbinned_angular_fit.py",line 217,in main
result = minimizer.minimize(nll)
File "/home/dhill/miniconda/envs/ana_env/lib/python3.7/site-packages/zfit/minimizers/baseminimizer.py",line 265,in minimize
return self._hook_minimize(loss=loss,params=params)
File "/home/dhill/miniconda/envs/ana_env/lib/python3.7/site-packages/zfit/minimizers/baseminimizer.py",line 274,in _hook_minimize
return self._call_minimize(loss=loss,line 278,in _call_minimize
return self._minimize(loss=loss,params=params)
File "/home/dhill/miniconda/envs/ana_env/lib/python3.7/site-packages/zfit/minimizers/minimizer_minuit.py",line 179,in _minimize
result = minimizer.migrad(**minimize_options)
File "src/iminuit/_libiminuit.pyx",line 859,in iminuit._libiminuit.Minuit.migrad
RuntimeError: exception was raised in user function
User function arguments:
Hm_amp = +nan
Hm_phi = +0.000000
Hp_phi = +0.000000
Original python exception in user function:
RuntimeError: Loss starts already with NaN,cannot minimize.
File "/home/dhill/miniconda/envs/ana_env/lib/python3.7/site-packages/zfit/minimizers/minimizer_minuit.py",line 121,in func
values=info_values)
File "/home/dhill/miniconda/envs/ana_env/lib/python3.7/site-packages/zfit/minimizers/baseminimizer.py",line 47,in minimize_nan
return self._minimize_nan(loss=loss,params=params,minimizer=minimizer,values=values)
File "/home/dhill/miniconda/envs/ana_env/lib/python3.7/site-packages/zfit/minimizers/baseminimizer.py",line 107,in _minimize_nan
raise RuntimeError("Loss starts already with NaN,cannot minimize.")
我可以通过稍微限制适合的可观察范围之一来避免此错误,以避免出现少量数据事件的区域,在该区域中某些数据的权重为负(信号被权重略微减去)。但是我想知道zfit中是否还有另一种方法?
也许zfit中的UnbinnednLL方法明确需要正事件,但负加权数据点可以设置为零或较小的正值?我应该说,负权重的水平与权重的总和相比似乎较小,并且发生在仅存在少量数据事件的角度分布之一的边缘。该区域的数据率低是由于实验的接受效果。
在测试文件上运行以重现该错误的代码在这里: https://github.com/donalrinho/zfit_3D_unbinned_angular_fit_test
当costheta_X_VV_reco
变量的范围限制为(-0.9,1.0)而不是整个范围(-1.0,1.0)时,不会遇到错误。我相信这是因为它删除了加权数据为负的相空间区域。
解决方法
就NLL in zfit的定义而言,权重只是乘以对数概率,因此负权重不应该成为问题。
但是,PDF似乎为某些值返回了负概率,您可以通过简单地使用以下方法获取返回的数组来查看
custom_pdf.pdf(data)
获取日志后,此负概率将变为NaN。
由于变量h_pst
似乎未使用,因此PDF的定义中可能有错字。
只是为了关闭该线程,我认为某些情况下PDF为负,这是因为接受PDF。确实没有使用h_pst
,但删除它并没有任何改变。最后,我只在没有负PDF值的区域中拟合了数据,这似乎并没有影响结果(它只是忽略了costheta_X
中密度接近的小区域到零)。