跳转到主要内容

使用张量和自动微分纯Python HistFactory实现

项目描述

pyhf logo

纯Python拟合/极限设定/区间估计 HistFactory风格的

GitHub Project DOI JOSS DOI Scikit-HEP NSF Award Number IRIS-HEP v1 NSF Award Number IRIS-HEP v2 NumFOCUS Affiliated Project

Docs from latest Docs from main Jupyter Book tutorial Binder

PyPI version Conda-forge version Supported Python versions Docker Hub pyhf Docker Hub pyhf CUDA

Code Coverage CodeFactor pre-commit.ci status Code style: black

GitHub Actions Status: CI GitHub Actions Status: Docs GitHub Actions Status: Publish GitHub Actions Status: Docker

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

manual

ROOT

manual

一个双箱示例

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

manual

ROOT

manual

安装

要从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}
}

作者

pyhf由Lukas Heinrich、Matthew Feickert和Giordon Stark公开开发。

请查看贡献者统计信息,以获取贡献者列表。

里程碑

  • 2022-09-12:2000 个 GitHub 问题和拉取请求。(见 PR #2000

  • 2021-12-09:项目提交 1000 次。(见 PR #1710

  • 2020-07-28:1000 个 GitHub 问题和拉取请求。(见 PR #1000

致谢

Matthew Feickert 收到了由 NSF 合作协议 OAC-1836650 和 PHY-2323298(IRIS-HEP)以及赠款 OAC-1450377(DIANA/HEP)提供的支持,用于在 pyhf 上工作。

pyhfNumFOCUS Affiliated Project

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码发行版

pyhf-0.7.6.tar.gz (114.0 kB 查看哈希

上传时间 源代码

构建发行版

pyhf-0.7.6-py3-none-any.whl (160.2 kB 查看哈希

上传时间 Python 3

支持者