新增方法、函數和類別#

雖然在大多數情況下,向 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.pdf()squirrel_gen.ppf() 的計算成本很高,請考慮在呼叫 squirrel_gen() 中設定 momtype

  8. 如果 squirrel_gen.rvs() 的計算成本很高,請考慮實作特定的 squirrel_gen._rvs()

  9. 將名稱新增到 scipy/stats/__init__.py 的文件字串中的清單中。

  10. 將名稱和一組好的範例形狀參數新增到 scipy/stats/_distr_params.py 中的 distcont 清單中。這些形狀參數既用於測試又用於自動文件生成。

  11. 將名稱和一組_無效的_範例形狀參數新增到 _distr_params.pyinvdistcont 的清單中。這些形狀參數也用於測試。

  12. TestSquirrel 類別和任何特定測試新增到 scipy/stats/tests/test_distributions.py

  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”,第二版,John Wiley and Sons,p. 173 (1994)。