fit#
- rv_continuous.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)