scipy.stats.rv_continuous.

fit#

rv_continuous.fit(data, *args, **kwds)[源代码]#

返回根据数据估算的形状(如果适用)、位置和尺度参数。默认的估计方法是最大似然估计 (MLE),但也提供矩量法 (MM)。

拟合的起始估计由输入参数给出;对于任何未提供起始估计的参数,将调用 self._fitstart(data) 来生成此类估计。

可以通过传入关键字参数 f0f1、...、fn (用于形状参数) 和 flocfscale (分别用于位置和尺度参数) 来将某些参数固定为特定值。

参数:
data类数组或 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)