添加新的方法、函数和类#

虽然在大多数情况下向 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.pyrv_continuous 类的 docstring(文档字符串)。

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

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

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

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

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

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

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

  10. scipy/stats/_distr_params.pydistcont 列表中添加名称和一组良好的示例形状参数。这些形状参数既用于测试,也用于自动生成文档。

  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, and Balakrishnan, “Continuous Univariate Distributions, Volume 1”, Second Edition, John Wiley and Sons, p. 173 (1994).