statsmodels.sandbox.distributions.transformed.TransfTwo_gen.fit¶
- TransfTwo_gen.fit(data, *args, **kwds)¶
返回从数据中估计的形状(如适用)、位置和尺度参数。默认的估计方法是最大似然估计(MLE),但也可以使用矩法(MM)。
拟合的起始估计值由输入参数给出;对于未提供起始估计值的任何参数,将调用
self._fitstart(data)来生成这些估计值。可以通过传递关键字参数
f0,f1, …,fn(用于形状参数) 和floc和fscale(分别用于位置和尺度参数)来将一些参数固定为特定值。- Parameters:¶
- dataarray_like or CensoredData
instance 用于估计分布参数的数据。
- arg1, arg2, arg3,…
floats,optional 任何形状特征参数的初始值(未提供的参数将通过调用
_fitstart(data)来确定)。 无默认值。- **kwds
floats,optional loc: 分布位置参数的初始猜测。
scale: 分布的尺度参数的初始猜测。
特殊的关键字参数被识别为固定某些参数:
f0…fn : 保持各自的形状参数固定。 或者,可以通过名称指定要固定的形状参数。 例如,如果
self.shapes == "a, b",fa和fix_a等同于f0,而fb和fix_b等同于f1。floc : 将位置参数固定为指定值。
fscale : 固定比例参数为指定值。
优化器:要使用的优化器。优化器必须将
func和起始位置作为前两个参数, 加上args(用于传递给要优化的函数的额外参数)和disp。fit方法调用优化器时使用disp=0来抑制输出。 优化器必须返回估计的参数。方法 : 使用的方法。默认是“MLE”(最大似然估计);“MM”(矩法)也是可用的。
- dataarray_like or CensoredData
- Returns:¶
- parameter_tuple
tupleoffloats 任何形状参数(如适用)的估计值,随后是位置和尺度的估计值。对于大多数随机变量,将返回形状统计量,但也有例外(例如
norm)。
- parameter_tuple
- Raises:¶
TypeError,ValueError如果输入无效
- ~scipy.stats.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\) 分别是拟合函数的概率密度函数和累积分布函数,\(\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(172786373191770012695001057628748821561) >>> 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)