scipy.stats.rv_continuous.

拟合#

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

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

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

可以通过传递关键字参数 f0, f1, …, fn``(用于形状参数)和 ``floc``fscale``(分别用于位置和尺度参数)来固定某些参数为特定值。

参数:
数据 : array_like 或 CensoredData 实例类数组对象或

用于估计分布参数的数据。

参数1, 参数2, 参数3,…浮动,可选

任何形状特征化参数的起始值(未提供的参数将通过调用 _fitstart(data) 来确定)。无默认值。

**kwds浮动,可选
  • loc: 分布位置参数的初始猜测。

  • scale: 分布尺度参数的初始猜测值。

特殊的键值参数被识别为固定某些参数:

  • f0…fn : 固定各自的形状参数。或者,可以通过名称指定要固定的形状参数。例如,如果 self.shapes == "a, b",则 fafix_a 等同于 f0,而 fbfix_b 等同于 f1

  • floc : 将位置参数固定为指定值。

  • fscale : 将比例参数固定为指定值。

  • 优化器 : 要使用的优化器。优化器必须以 func 和起始位置作为前两个参数,加上 args``(用于传递给要优化的函数的额外参数)和 ``dispfit 方法调用优化器时使用 disp=0 来抑制输出。优化器必须返回估计的参数。

  • method : 要使用的方法。默认是“MLE”(最大似然估计);也可以使用“MM”(矩方法)。

返回:
parameter_tuple浮点数元组

任何形状参数(如果适用)的估计值,接着是位置和尺度的估计值。对于大多数随机变量,将返回形状统计量,但也有例外(例如 norm)。

Raises:
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.inffit 方法将引发 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\) 分别是拟合函数的概率密度函数和累积分布函数,\(\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)