使用张量和自动微分纯Python HistFactory实现
项目描述
纯Python拟合/极限设定/区间估计 HistFactory风格的
HistFactory p.d.f. 模板 [CERN-OPEN-2012-016] 本身独立于其在ROOT中的实现,有时,能够在ROOT、RooFit、RooStats框架之外运行统计分析是有用的。
此仓库是针对基于多箱直方图分析的统计模型的纯Python实现,其区间估计基于“基于似然的新物理测试的渐近公式”的渐近公式 [arXiv:1007.1727]。目标还包括支持现代计算图库,如PyTorch和TensorFlow,以利用自动微分和GPU加速等功能。
用户指南
要深入了解使用最新版本的pyhf,请访问pyhf教程。
Hello World
这是如何使用pyhf Python API构建统计模型并运行基本推理的示例。
>>> import pyhf
>>> pyhf.set_backend("numpy")
>>> model = pyhf.simplemodels.uncorrelated_background(
... signal=[12.0, 11.0], bkg=[50.0, 52.0], bkg_uncertainty=[3.0, 7.0]
... )
>>> data = [51, 48] + model.config.auxdata
>>> test_mu = 1.0
>>> CLs_obs, CLs_exp = pyhf.infer.hypotest(
... test_mu, data, model, test_stat="qtilde", return_expected=True
... )
>>> print(f"Observed: {CLs_obs:.8f}, Expected: {CLs_exp:.8f}")
Observed: 0.05251497, Expected: 0.06445321
或者,可以从其序列化的JSON表示形式(参见下一节)读取统计模型和观测数据。
>>> import pyhf
>>> import requests
>>> pyhf.set_backend("numpy")
>>> url = "https://raw.githubusercontent.com/scikit-hep/pyhf/main/docs/examples/json/2-bin_1-channel.json"
>>> wspace = pyhf.Workspace(requests.get(url).json())
>>> model = wspace.model()
>>> data = wspace.data(model)
>>> test_mu = 1.0
>>> CLs_obs, CLs_exp = pyhf.infer.hypotest(
... test_mu, data, model, test_stat="qtilde", return_expected=True
... )
>>> print(f"Observed: {CLs_obs:.8f}, Expected: {CLs_exp:.8f}")
Observed: 0.35998409, Expected: 0.35998409
最后,您还可以使用pyhf提供的命令行界面
$ cat << EOF | tee likelihood.json | pyhf cls
{
"channels": [
{ "name": "singlechannel",
"samples": [
{ "name": "signal",
"data": [12.0, 11.0],
"modifiers": [ { "name": "mu", "type": "normfactor", "data": null} ]
},
{ "name": "background",
"data": [50.0, 52.0],
"modifiers": [ {"name": "uncorr_bkguncrt", "type": "shapesys", "data": [3.0, 7.0]} ]
}
]
}
],
"observations": [
{ "name": "singlechannel", "data": [51.0, 48.0] }
],
"measurements": [
{ "name": "Measurement", "config": {"poi": "mu", "parameters": []} }
],
"version": "1.0.0"
}
EOF
它应该生成以下JSON输出
{
"CLs_exp": [
0.0026062609501074576,
0.01382005356161206,
0.06445320535890459,
0.23525643861460702,
0.573036205919389
],
"CLs_obs": 0.05251497423736956
}
支持的功能
- 实现的变化
☑ HistoSys
☑ 总体Sys
☑ 形状Sys
☑ 归一化因子
☑ 多通道
☑ 通过uproot从XML + ROOT导入
☑ 形状因子
☑ 统计误差
☑ 亮度不确定性
☑ 非渐近计算器
- 计算后端
☑ NumPy
☑ PyTorch
☑ TensorFlow
☑ JAX
- 优化器
☑ SciPy (scipy.optimize)
☑ MINUIT (iminuit)
所有后端都可以与所有优化器一起使用。也可以使用自定义用户后端和优化器。
待办事项
☐ StatConfig
此包生成的结果已与从HistFactory工作空间计算得出的输出进行了验证
一个单箱示例
import pyhf
import numpy as np
import matplotlib.pyplot as plt
from pyhf.contrib.viz import brazil
pyhf.set_backend("numpy")
model = pyhf.simplemodels.uncorrelated_background(
signal=[10.0], bkg=[50.0], bkg_uncertainty=[7.0]
)
data = [55.0] + model.config.auxdata
poi_vals = np.linspace(0, 5, 41)
results = [
pyhf.infer.hypotest(
test_poi, data, model, test_stat="qtilde", return_expected_set=True
)
for test_poi in poi_vals
]
fig, ax = plt.subplots()
fig.set_size_inches(7, 5)
brazil.plot_results(poi_vals, results, ax=ax)
fig.show()
pyhf
ROOT
一个双箱示例
import pyhf
import numpy as np
import matplotlib.pyplot as plt
from pyhf.contrib.viz import brazil
pyhf.set_backend("numpy")
model = pyhf.simplemodels.uncorrelated_background(
signal=[30.0, 45.0], bkg=[100.0, 150.0], bkg_uncertainty=[15.0, 20.0]
)
data = [100.0, 145.0] + model.config.auxdata
poi_vals = np.linspace(0, 5, 41)
results = [
pyhf.infer.hypotest(
test_poi, data, model, test_stat="qtilde", return_expected_set=True
)
for test_poi in poi_vals
]
fig, ax = plt.subplots()
fig.set_size_inches(7, 5)
brazil.plot_results(poi_vals, results, ax=ax)
fig.show()
pyhf
ROOT
安装
要从PyPI使用NumPy后端安装pyhf,请运行
python -m pip install pyhf
要安装带有所有附加后端的pyhf,请运行
python -m pip install pyhf[backends]
或选项的子集。
要卸载,请运行
python -m pip uninstall pyhf
文档
要了解模型规范、API参考、示例和常见问题解答,请访问pyhf文档。
问题
如果您在文档中没有找到关于使用pyhf的问题,请在GitHub讨论中提出问题。
如果您认为您在pyhf中发现了错误,请通过GitHub问题报告。如果您想从pyhf开发团队获取更新和发布公告,您可以加入pyhf-announcements邮件列表。
引用
如使用和引用中所述,引用pyhf的首选BibTeX条目包括Zenodo存档和JOSS论文。
@software{pyhf,
author = {Lukas Heinrich and Matthew Feickert and Giordon Stark},
title = "{pyhf: v0.7.6}",
version = {0.7.6},
doi = {10.5281/zenodo.1169739},
url = {https://doi.org/10.5281/zenodo.1169739},
note = {https://github.com/scikit-hep/pyhf/releases/tag/v0.7.6}
}
@article{pyhf_joss,
doi = {10.21105/joss.02823},
url = {https://doi.org/10.21105/joss.02823},
year = {2021},
publisher = {The Open Journal},
volume = {6},
number = {58},
pages = {2823},
author = {Lukas Heinrich and Matthew Feickert and Giordon Stark and Kyle Cranmer},
title = {pyhf: pure-Python implementation of HistFactory statistical models},
journal = {Journal of Open Source Software}
}
里程碑
致谢
Matthew Feickert 收到了由 NSF 合作协议 OAC-1836650 和 PHY-2323298(IRIS-HEP)以及赠款 OAC-1450377(DIANA/HEP)提供的支持,用于在 pyhf 上工作。
pyhf 是 NumFOCUS Affiliated Project。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。
源代码发行版
构建发行版
pyhf-0.7.6.tar.gz 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d41d9cdce5555863a77a37efd0784ad81d84b817295aa07ebc1cfa5ec50cc78c |
|
MD5 | ee8f16499251c1f1d5a9927103823d55 |
|
BLAKE2b-256 | c821a8367a614de74037338dca328a1ce4ee7f2557983899db6e7eed6afc8c99 |