添加新方法、函数和类#
虽然向 SciPy 添加代码在大多数情况下相当直接,但在某些地方并非如此。本文档包含了一些特定情况下的详细信息,这些情况可能一开始并不清楚任务涉及的内容。
添加一个新的统计分布#
几百年来,统计学家、数学家和科学家需要理解、分析和建模数据。这导致了大量的统计分布,其中许多是相互关联的。新类型数据的建模继续催生新的分布,理论考虑应用于新学科也是如此。SciPy 模拟了大约十几个离散分布 离散随机变量 和 100 个连续分布 连续随机变量。
要添加一个新的分布,需要一个好的参考。Scipy 通常使用 [JKB] 作为其黄金标准,而 WikipediaDistributions 文章通常提供一些额外的细节和/或图形图表。
如何创建一个新的连续分布#
要向 SciPy 添加连续分布,需要完成几个步骤。(添加离散分布的过程类似)。在下面的说明中,我们将使用虚构的“松鼠”分布。
实施之前#
检查
Squirrel
是否已经实现——这样可以节省很多精力!它可能以不同的名称实现。
它可能是用不同的参数化(形状参数)实现的。
它可能是更广泛分布家族的一个特化。
多个学科发现/重新发现一个分布(或其特化或不同参数化)是非常常见的。SciPy 中存在一些作为其他分布特化的分布。例如,
scipy.stats.arcsine
分布是scipy.stats.beta
分布的特化。这些重复存在的原因主要是(非常!)历史性和广泛使用。目前,SciPy 不支持添加现有分布的新特化/重新参数化,主要是由于这种添加导致的用户混淆增加。在 SciPy 的 GitHub 上创建一个 Issue,列出该发行版、参考文献及其包含的原因。
实现#
找到一个与
Squirrel
相似的现有发行版。将其代码作为Squirrel
的模板。阅读 scipy/stats/_distn_infrastructure.py 中类
rv_continuous
的文档字符串。为类
squirrel_gen
编写新代码,并将其插入到 scipy/stats/_continuous_distns.py 中,该文件按分布名称(大致)按字母顺序排列。分布是否有无限的支持?如果没有,左端点和/或右端点
a
,b
需要在调用squirrel_gen(name='squirrel', a=?, b=?)
时指定。如果支持依赖于形状参数,则需要实现
squirrel_gen._get_support()
。默认继承的
_argcheck()
实现检查形状参数是否为正。创建一个更合适的实现。如果
squirrel_gen.ppf()
相对于squirrel_gen.pdf()
计算成本较高,考虑在调用squirrel_gen()
时设置momtype
。如果
squirrel_gen.rvs()
计算成本高,考虑实现一个特定的squirrel_gen._rvs()
。将名称添加到 scipy/stats/__init__.py 的文档字符串中的列表中。
在 scipy/stats/_distr_params.py 文件中,将名称和一组良好的示例形状参数添加到
distcont
列表中。这些形状参数用于测试和自动文档生成。在
invdistcont
列表中添加名称和一个 _无效_ 的示例形状参数集,同样在 _distr_params.py 中。这些形状参数也用于测试。添加一个
TestSquirrel
类和任何特定测试到 scipy/stats/tests/test_distributions.py。运行并通过(!)测试。
实现之后#
添加一个教程
doc/source/tutorial/stats/continuous_squirrel.rst
将其添加到 doc/source/tutorial/stats/continuous.rst 中的连续分布列表中。
更新 doc/source/tutorial/stats.rst 示例代码中的
连续分布的数量
。成功构建文档。
提交一个 PR。
参考文献#
Johnson, Kotz, 和 Balakrishnan, “连续单变量分布, 第一卷”, 第二版, John Wiley 和 Sons, 第 173 页 (1994).