新增方法、函數和類別#
雖然在大多數情況下,向 SciPy 新增程式碼相當直接,但在某些情況下並非如此。本文檔包含關於某些特定情況的詳細資訊,在這些情況下,從一開始可能不清楚任務涉及的內容。
新增新的統計分佈#
數百年來,統計學家、數學家和科學家需要理解、分析和建模數據。這導致了大量的統計分佈,其中許多分佈彼此相關。新型數據的建模不斷產生新的分佈,理論考量也應用於新興學科。SciPy 建模了大約十幾個離散分佈 離散統計分佈 和 100 個連續分佈 連續統計分佈。
要新增新的分佈,需要一個好的參考文獻。SciPy 通常使用 [JKB] 作為其黃金標準,而 WikipediaDistributions 文章通常提供一些額外的細節和/或圖形繪圖。
如何建立新的連續分佈#
要將連續分佈新增到 SciPy,需要完成幾個步驟。(新增離散分佈是類似的)。我們將在以下說明中使用虛構的「Squirrel」分佈。
實作前#
查看是否已實作
Squirrel
——這可以節省大量精力!它可能已使用不同的名稱實作。
它可能已使用不同的參數化(形狀參數)實作。
它可能是更一般分佈族的特例化。
多個學科發現/重新發現分佈(或特例化或不同的參數化)非常常見。有一些現有的 SciPy 分佈是其他分佈的特例化。例如,
scipy.stats.arcsine
分佈是scipy.stats.beta
分佈的特例化。這些重複存在是出於(非常!)歷史和廣泛使用的原因。目前,不支援向 SciPy 新增現有分佈的新的特例化/重新參數化,主要是因為此類新增會導致使用者混淆增加。建立一個 GitHub 上的 SciPy Issue,列出分佈、參考文獻及其納入的原因。
實作#
尋找一個已存在的、類似於
Squirrel
的分佈。使用其程式碼作為Squirrel
的範本。閱讀 scipy/stats/_distn_infrastructure.py 中類別
rv_continuous
的文件字串。編寫類別
squirrel_gen
的新程式碼,並將其插入到 scipy/stats/_continuous_distns.py 中,該檔案(主要)按分佈名稱的字母順序排列。分佈是否具有無限支撐?如果沒有,則需要在呼叫
squirrel_gen(name='squirrel', a=?, b=?)
中指定左端點和/或右端點a
、b
。如果支撐取決於形狀參數,則需要實作
squirrel_gen._get_support()
。預設繼承的
_argcheck()
實作檢查形狀參數是否為正數。建立更適當的實作。如果相對於
squirrel_gen.pdf()
,squirrel_gen.ppf()
的計算成本很高,請考慮在呼叫squirrel_gen()
中設定momtype
。如果
squirrel_gen.rvs()
的計算成本很高,請考慮實作特定的squirrel_gen._rvs()
。將名稱新增到 scipy/stats/__init__.py 的文件字串中的清單中。
將名稱和一組好的範例形狀參數新增到 scipy/stats/_distr_params.py 中的
distcont
清單中。這些形狀參數既用於測試又用於自動文件生成。將名稱和一組_無效的_範例形狀參數新增到 _distr_params.py 中
invdistcont
的清單中。這些形狀參數也用於測試。將
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, and Balakrishnan,“Continuous Univariate Distributions, Volume 1”,第二版,John Wiley and Sons,p. 173 (1994)。