fit#
- rv_histogram.fit(data, *args, **kwds)[源代码]#
- 从数据返回形状(如果适用)、位置和比例参数的估计值。 默认估计方法是最大似然估计 (MLE),但矩量法 (MM) 也可用。 - 拟合的起始估计值由输入参数给出; 对于任何未提供起始估计值的参数,将调用 - self._fitstart(data)来生成此类参数。- 可以通过传入关键字参数 - f0、- f1、…、- fn(对于形状参数)和- floc和- fscale(分别用于位置和比例参数)将某些参数固定为特定值。- 参数:
- data类数组或 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”(矩量法)也可用。 
 
 
- data类数组或 
- 返回:
- 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)