添加新方法、函数和类#

虽然在大多数情况下向SciPy添加代码非常直截了当,但有些地方并非如此。本文档详细介绍了一些特定情况下,从一开始可能并不清楚任务所涉及的内容。

添加新的统计分布#

几个世纪以来,统计学家、数学家和科学家一直需要理解、分析和建模数据。这导致了大量统计分布,其中许多分布彼此相关。对新型数据的建模不断催生新的分布,理论考虑应用于新学科也同样如此。SciPy大约模拟了十几个离散分布 离散统计分布 和 100 个连续分布 连续统计分布

要添加新的分布,需要一个良好的参考。SciPy 通常使用 [JKB] 作为其黄金标准,WikipediaDistributions 文章通常提供一些额外的细节和/或图形绘制。

如何创建新的连续分布#

向SciPy添加连续分布需要完成几个步骤。(添加离散分布类似)。在下面的说明中,我们将使用虚构的“Squirrel”分布。

实施前#

  1. 查看是否已经实现了 Squirrel - 这可以节省很多工作!

    • 它可能已经使用不同的名称实现了。

    • 它可能已经使用不同的参数化(形状参数)实现了。

    • 它可能是更一般的分布族的一种特例。

    多个学科发现/重新发现一个分布(或其特例或不同的参数化)是很常见的。SciPy 中有几个现有的分布是其他分布的特例。例如,scipy.stats.arcsine 分布是 scipy.stats.beta 分布的特例。这些重复存在于(非常!)历史和广泛使用的原因。目前,不支持向 SciPy 添加现有分布的新特例/重新参数化,主要原因是此类添加会导致用户混淆增加。

  2. 在 GitHub 上创建 SciPy Issue,列出分布、参考和包含原因。

实施#

  1. 找到一个与 Squirrel 类似的现有分布。使用它的代码作为 Squirrel 的模板。

  2. 阅读 scipy/stats/_distn_infrastructure.py 中类 rv_continuous 的文档字符串。

  3. 编写类 squirrel_gen 的新代码,并将其插入 scipy/stats/_continuous_distns.py 中,该文件按分布名称(大多)按字母顺序排列。

  4. 该分布是否具有无限支持?如果不是,则需要在调用 squirrel_gen(name='squirrel', a=?, b=?) 时指定左端点和/或右端点 ab

  5. 如果支持取决于形状参数,则需要实现 squirrel_gen._get_support()

  6. 默认继承的 _argcheck() 实现检查形状参数是否为正。创建一个更合适的实现。

  7. 如果 squirrel_gen.ppf() 的计算成本相对于 squirrel_gen.pdf() 较高,请考虑在调用 squirrel_gen() 时设置 momtype

  8. 如果 squirrel_gen.rvs() 的计算成本较高,请考虑实现特定的 squirrel_gen._rvs()

  9. 将名称添加到 scipy/stats/__init__.py 的文档字符串中的列表中。

  10. 将名称和一组合适的示例形状参数添加到 scipy/stats/_distr_params.py 中的 distcont 列表中。这些形状参数用于测试和自动文档生成。

  11. 将名称和一组_无效_的示例形状参数添加到 invdistcont 中的列表中,同样在 _distr_params.py 中。这些形状参数也用于测试。

  12. scipy/stats/tests/test_distributions.py 中添加一个 TestSquirrel 类以及任何特定的测试。

  13. 运行并通过(!)测试。

实施后#

  1. 添加一个教程 doc/source/tutorial/stats/continuous_squirrel.rst

  2. 将其添加到 doc/source/tutorial/stats/continuous.rst 中的连续分布列表中。

  3. 更新 doc/source/tutorial/stats.rst 中示例代码中的 number of continuous distributions

  4. 成功构建文档。

  5. 提交 PR。

参考#

[JKB]

Johnson、Kotz 和 Balakrishnan,“连续单变量分布,卷 1”,第二版,John Wiley and Sons,第 173 页(1994 年)。