fit#
- rv_histogram.fit(data, *args, **kwds)[source]#
從資料傳回形狀(如果適用)、位置和尺度參數的估計值。預設估計方法是最大概似估計 (MLE),但也提供動差法 (MM)。
擬合的起始估計值由輸入引數給定;對於任何未提供起始估計值的引數,將呼叫
self._fitstart(data)
以產生此類估計值。可以透過傳入關鍵字引數
f0
、f1
、…、fn
(用於形狀參數)和floc
和fscale
(分別用於位置和尺度參數),將某些參數固定為特定值。- 參數:
- dataarray_like 或
CensoredData
實例 用於估計分布參數的資料。
- arg1, arg2, arg3,…浮點數,選用
任何形狀特徵引數的起始值(未提供的引數將透過呼叫
_fitstart(data)
來決定)。無預設值。- **kwds浮點數,選用
loc:分布位置參數的初始猜測。
scale:分布尺度參數的初始猜測。
特殊關鍵字引數被識別為固定某些參數
f0…fn:固定各自的形狀參數。或者,可以依名稱指定要固定的形狀參數。例如,如果
self.shapes == "a, b"
,fa
和fix_a
等效於f0
,而fb
和fix_b
等效於f1
。floc:將位置參數固定為指定值。
fscale:將尺度參數固定為指定值。
optimizer:要使用的最佳化器。最佳化器必須將
func
和起始位置作為前兩個引數,加上args
(用於傳遞給要最佳化的函式的額外引數)和disp
。fit
方法呼叫最佳化器時使用disp=0
以抑制輸出。最佳化器必須傳回估計的參數。method:要使用的方法。預設值為「MLE」(最大概似估計);「MM」(動差法)也可用。
- dataarray_like 或
- 傳回:
- 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.nan
、np.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)
現在我們可以擬合所有四個參數(
a
、b
、loc
和scale
)>>> 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)
我們也可以使用有關資料集的一些先驗知識:讓我們保持
loc
和scale
固定>>> 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)