scipy.stats.rv_histogram.

fit#

rv_histogram.fit(data, *args, **kwds)[source]#

从数据中返回形状(如果适用)、位置和尺度参数的估计值。默认估计方法是最大似然估计(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)