添加新方法、函数和类#
虽然在大多数情况下向 SciPy 添加代码非常简单,但在某些情况下并非如此。本文档包含有关某些特定情况的详细信息,在这些情况下,从一开始可能不清楚任务中涉及的内容。
添加新的统计分布#
几百年来,统计学家、数学家和科学家一直需要理解、分析和建模数据。这导致了大量的统计分布,其中许多分布彼此相关。对新型数据的建模继续催生新的分布,理论考虑被应用于新的学科也是如此。SciPy 对大约十几个离散分布进行建模 离散统计分布 和 100 个连续分布 连续统计分布.
要添加新的分布,需要一个好的参考。Scipy 通常使用 [JKB] 作为其黄金标准,WikipediaDistributions 文章通常会提供一些额外的细节和/或图形。
如何创建新的连续分布#
在 SciPy 中添加连续分布需要几个步骤。(添加离散分布类似)。在下面的说明中,我们将使用虚构的“Squirrel”分布。
实施前#
查看
Squirrel
是否已经实现 - 这可以节省很多工作!它可能已经使用不同的名称实现。
它可能已经使用不同的参数化(形状参数)实现。
它可能是更一般分布族的一个特例。
多个学科发现/重新发现一个分布(或一个特例或不同的参数化)是很常见的。SciPy 中有一些现有的分布是其他分布的特例。例如,
scipy.stats.arcsine
分布是scipy.stats.beta
分布的特例。这些重复存在于(非常!)历史和广泛使用的原因。目前,不支持将现有分布的新特例/重新参数化添加到 SciPy,主要原因是此类添加会导致用户混淆增加。在 github 上创建一个 SciPy Issue,列出分布、参考文献和包含它的原因。
实施#
找到一个与
Squirrel
类似的现有分布。使用它的代码作为Squirrel
的模板。阅读
rv_continuous
类在 scipy/stats/_distn_infrastructure.py 中的文档字符串。编写
squirrel_gen
类的代码并将其插入到 scipy/stats/_continuous_distns.py 中,该文件按分布名称(大部分)按字母顺序排列。该分布是否具有无限支撑?如果不是,则需要在调用
squirrel_gen(name='squirrel', a=?, b=?)
时指定左右端点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 中示例代码中的
number of continuous distributions
。成功构建文档。
提交 PR。
参考文献#
Johnson, Kotz 和 Balakrishnan,“连续单变量分布,卷 1”,第二版,John Wiley and Sons,第 173 页(1994 年)。