scipy.stats.rv_continuous.

fit#

rv_continuous.fit(data, *args, **kwds)[原始碼]#

從資料傳回形狀(如果適用)、位置和尺度參數的估計值。預設的估計方法是最大概似估計 (MLE),但也提供動差法 (MM)。

擬合的起始估計值由輸入引數給定;對於任何未提供起始估計值的引數,將呼叫 self._fitstart(data) 以產生此類估計值。

可以透過傳入關鍵字引數 f0f1、…、fn(用於形狀參數)和 flocfscale(分別用於位置和尺度參數)將某些參數固定為特定值。

參數:
dataarray_like 或 CensoredData 實例

用於估計分布參數的資料。

arg1, arg2, arg3,…浮點數,選用

任何形狀特徵引數的起始值(未提供的引數將透過呼叫 _fitstart(data) 來決定)。無預設值。

**kwds浮點數,選用
  • loc:分布位置參數的初始猜測值。

  • scale:分布尺度參數的初始猜測值。

特殊關鍵字引數被識別為將某些參數固定

  • f0…fn:將各自的形狀參數固定。或者,可以依名稱指定要固定的形狀參數。例如,如果 self.shapes == "a, b",則 fafix_a 等效於 f0,而 fbfix_b 等效於 f1

  • floc:將位置參數固定為指定值。

  • fscale:將尺度參數固定為指定值。

  • optimizer:要使用的最佳化器。最佳化器必須將 func 和起始位置作為前兩個引數,加上 args(用於傳遞給要最佳化的函數的額外引數)和 dispfit 方法使用 disp=0 呼叫最佳化器以抑制輸出。最佳化器必須傳回估計的參數。

  • method:要使用的方法。預設值為「MLE」(最大概似估計);也提供「MM」(動差法)。

傳回值:
parameter_tuple浮點數元組

任何形狀參數(如果適用)的估計值,後跟位置和尺度的估計值。對於大多數隨機變數,將傳回形狀統計量,但也有例外(例如 norm)。

引發:
TypeError, ValueError

如果輸入無效

FitError

如果擬合失敗或產生的擬合無效

註解

使用 method="MLE"(預設值),擬合是透過最小化負對數概似函數來計算的。對於超出分布支援範圍的觀測值,會套用較大的有限懲罰(而不是無限負對數概似)。

使用 method="MM",擬合是透過最小化前 k 個原始(約為零)資料動差與相應分布動差之間相對誤差的 L2 範數來計算的,其中 k 是非固定參數的數量。更精確地說,目標函數為

(((data_moments - dist_moments)
  / np.maximum(np.abs(data_moments), 1e-8))**2).sum()

其中常數 1e-8 避免在資料動差消失的情況下除以零。通常,此誤差範數可以縮減為零。請注意,標準動差法可能會產生某些資料超出擬合分布支援範圍的參數;此實作不會執行任何操作來防止這種情況發生。

對於任一種方法,不保證傳回的答案是全域最佳的;它可能只是局部最佳的,或者最佳化可能完全失敗。如果資料包含任何 np.nannp.inf-np.inf,則 fit 方法將引發 RuntimeError

CensoredData 實例傳遞至 data 時,對數概似函數定義為

\[\begin{split}l(\pmb{\theta}; k) & = \sum \log(f(k_u; \pmb{\theta})) + \sum \log(F(k_l; \pmb{\theta})) \\ & + \sum \log(1 - F(k_r; \pmb{\theta})) \\ & + \sum \log(F(k_{\text{high}, i}; \pmb{\theta}) - F(k_{\text{low}, i}; \pmb{\theta}))\end{split}\]

其中 \(f\)\(F\) 分別是要擬合函數的 pdf 和 cdf,\(\pmb{\theta}\) 是參數向量,\(u\) 是未刪檢觀測值的索引,\(l\) 是左刪檢觀測值的索引,\(r\) 是右刪檢觀測值的索引,下標「low」/「high」表示區間刪檢觀測值的端點,而 \(i\) 是區間刪檢觀測值的索引。

範例

產生一些要擬合的資料:從 beta 分布中繪製隨機變數

>>> import numpy as np
>>> from scipy.stats import beta
>>> a, b = 1., 2.
>>> rng = np.random.default_rng()
>>> x = beta.rvs(a, b, size=1000, random_state=rng)

現在我們可以擬合所有四個參數(ablocscale

>>> a1, b1, loc1, scale1 = beta.fit(x)
>>> a1, b1, loc1, scale1
(1.0198945204435628, 1.9484708982737828, 4.372241314917588e-05, 0.9979078845964814)

也可以使用自訂最佳化器完成擬合

>>> from scipy.optimize import minimize
>>> def custom_optimizer(func, x0, args=(), disp=0):
...     res = minimize(func, x0, args, method="slsqp", options={"disp": disp})
...     if res.success:
...         return res.x
...     raise RuntimeError('optimization routine failed')
>>> a1, b1, loc1, scale1 = beta.fit(x, method="MLE", optimizer=custom_optimizer)
>>> a1, b1, loc1, scale1
(1.0198821087258905, 1.948484145914738, 4.3705304486881485e-05, 0.9979104663953395)

我們也可以使用一些關於資料集的先驗知識:讓我們保持 locscale 固定

>>> a1, b1, loc1, scale1 = beta.fit(x, floc=0, fscale=1)
>>> loc1, scale1
(0, 1)

我們也可以透過使用 f-關鍵字來保持形狀參數固定。為了保持第零個形狀參數 a 等於 1,請使用 f0=1 或等效地使用 fa=1

>>> a1, b1, loc1, scale1 = beta.fit(x, fa=1, floc=0, fscale=1)
>>> a1
1

並非所有分布都會傳回形狀參數的估計值。norm 例如只傳回位置和尺度的估計值

>>> from scipy.stats import norm
>>> x = norm.rvs(a, b, size=1000, random_state=123)
>>> loc1, scale1 = norm.fit(x)
>>> loc1, scale1
(0.92087172783841631, 2.0015750750324668)