本文简要介绍 python 语言中 scipy.stats.fit
的用法。
用法:
scipy.stats.fit(dist, data, bounds=None, *, guess=None, method='mle', optimizer=<function differential_evolution>)#
将离散或连续分布拟合到数据
给定分布、数据和分布参数的界限,返回参数的最大似然估计。
- dist:
scipy.stats.rv_continuous
或scipy.stats.rv_discrete
表示要适合数据的分布的对象。
- data: 一维数组
要拟合分布的数据。如果数据包含
np.nan
、np.inf
或 -np.inf
中的任何一个,则 fit 方法将引发ValueError
。- bounds: 字典或元组序列,可选
如果是字典,则每个键是分布参数的名称,对应的值是包含该参数下限和上限的元组。如果仅针对该参数的有限值范围定义分布,则不需要该参数的条目;例如,某些分布的参数必须在区间 [0, 1] 上。参数位置(
loc
)和比例(scale
)的界限是可选的;默认情况下,它们分别固定为 0 和 1。如果是一个序列,元素 i 是一个元组,包含分布的第 i 个参数的下限和上限。在这种情况下,必须提供所有分布形状参数的界限。可选地,位置和规模的界限可以遵循分布形状参数。
如果形状要保持固定(例如,如果它是已知的),则下限和上限可能相等。如果用户提供的下限或上限超出了定义分布的域的边界,则分布域的边界将替换用户提供的值。同样,必须为整数的参数将被限制为用户提供的范围内的整数值。
- guess: dict 或 数组,可选
如果是字典,每个key是分布的一个参数的名字,对应的value是对参数值的猜测。
如果是一个序列,元素 i 是分布的第 i 个参数的猜测。在这种情况下,必须提供对所有分布形状参数的猜测。
如果未提供猜测,则决策变量的猜测将不会传递给优化器。如果提供了guess,则任何缺失参数的猜测值将设置为下限和上限的平均值。必须为整数的参数的猜测将被四舍五入为整数值,并且位于用户提供的边界和分布域的交集之外的猜测将被剪裁。
- method: {‘mle’, ‘mse’}
使用
method="mle"
(默认),通过最小化负对数似然函数来计算拟合。对于超出分布支持的观测值,应用较大的有限惩罚(而不是无限负对数似然)。对于method="mse"
,通过最小化负 log-product 间距函数来计算拟合。对于超出支持范围的观察结果也适用同样的惩罚。我们遵循[1]的方法,该方法适用于重复观察的样本。- optimizer: 可调用的,可选的
优化器是一个可调用的,它接受以下位置参数。
- 乐趣 可调用的
要优化的目标函数。乐趣接受一个论点
x
,分布的候选形状参数,并返回给定的目标函数值x
,距离,以及提供的数据.的工作优化器是找到最小化的决策变量的值乐趣.
优化器还必须接受以下关键字参数。
- 界限 元组序列
决策变量值的界限;每个元素都是一个元组,包含决策变量的下限和上限。
如果提供了guess,优化器还必须接受以下关键字参数。
- x0 array_like
每个决策变量的猜测。
如果分布具有任何必须是整数的形状参数,或者分布是离散的且位置参数不固定,则优化器还必须接受以下关键字参数。
- 完整性 数组 布尔值
对于每个决策变量,如果决策变量必须限制为整数值,则为 True;如果决策变量是连续的,则为 False。
优化器必须返回一个对象,例如
scipy.optimize.OptimizeResult
,它保存属性中决策变量的最优值x
.如果属性fun
,status
, 或者message
提供,它们将包含在返回的结果对象中fit
.
- dist:
- result:
FitResult
具有以下字段的对象。
- 参数 命名元组
包含分布的形状参数、位置和(如果适用)尺度的最大似然估计值的命名元组。
- 成功 布尔或无
优化器是否认为优化成功终止。
- 信息 str 或 None
优化器提供的任何状态消息。
该对象具有以下方法:
- nllf(参数=无,数据=无)
默认情况下,给定数据的拟合参数处的负log-likehood 函数。接受包含可选形状、位置和分布比例以及可选数据数组的元组。
- 情节(轴=无)
将拟合分布的 PDF/PMF 叠加在数据的归一化直方图上。
- result:
参数 ::
返回 ::
注意:
当用户提供包含最大似然估计的严格界限时,优化更有可能收敛到最大似然估计。例如,当对数据进行二项分布拟合时,每个样本的实验次数可能是已知的,在这种情况下,可以固定相应的形状参数
n
。参考:
[1]邵永照和马乔里·哈恩 (Marjorie G. Hahn)。 “间距法的最大乘积:具有强一致性说明的统一公式。”伊利诺伊州数学杂志 43.3 (1999): 489-499。
例子:
假设我们希望将分布拟合到以下数据。
>>> import numpy as np >>> from scipy import stats >>> rng = np.random.default_rng() >>> dist = stats.nbinom >>> shapes = (5, 0.5) >>> data = dist.rvs(*shapes, size=1000, random_state=rng)
假设我们不知道数据是如何生成的,但我们怀疑它遵循带参数的负二项分布n和p. (看scipy.stats.nbinom.) 我们认为参数n小于 30,我们知道参数p必须位于区间 [0, 1] 上。我们将这些信息记录在一个变量中界限并将此信息传递给
fit
.>>> bounds = [(0, 30), (0, 1)] >>> res = stats.fit(dist, data, bounds)
fit
在用户指定的范围内搜索界限对于与数据最匹配的值(在最大似然估计的意义上)。在这种情况下,它发现了与实际生成数据的形状值相似的形状值。>>> res.params FitParams(n=5.0, p=0.5028157644634368, loc=0.0) # may vary
我们可以通过将分布的概率质量函数(形状适合数据)叠加到数据的归一化直方图上来可视化结果。
>>> import matplotlib.pyplot as plt # matplotlib must be installed to plot >>> res.plot() >>> plt.show()
请注意,估计为n完全是整数;这是因为scipy.stats.nbinomPMF 仅包括积分n, 和scipy.stats.nbinom对象“knows”。scipy.stats.nbinom也知道形状p必须是介于 0 和 1 之间的值。在这种情况下 - 当分布的域相对于参数是有限的时 - 我们不需要指定参数的界限。
>>> bounds = {'n': (0, 30)} # omit parameter p using a `dict` >>> res2 = stats.fit(dist, data, bounds) >>> res2.params FitParams(n=5.0, p=0.5016492009232932, loc=0.0) # may vary
如果我们希望强制分布拟合 n 固定为 6,我们可以将 n 的下限和上限都设置为 6。但是请注意,被优化的目标函数的值通常更差(更高)这个案例。
>>> bounds = {'n': (6, 6)} # fix parameter `n` >>> res3 = stats.fit(dist, data, bounds) >>> res3.params FitParams(n=6.0, p=0.5486556076755706, loc=0.0) # may vary >>> res3.nllf() > res.nllf() True # may vary
请注意,前面示例的数值结果是典型的,但它们可能会有所不同,因为
fit
,scipy.optimize.differential_evolution, 是随机的。但是,我们可以自定义优化器使用的设置以确保可重复性 - 甚至完全使用不同的优化器 - 使用优化器范围。>>> from scipy.optimize import differential_evolution >>> rng = np.random.default_rng() >>> def optimizer(fun, bounds, *, integrality): ... return differential_evolution(fun, bounds, strategy='best2bin', ... seed=rng, integrality=integrality) >>> bounds = [(0, 30), (0, 1)] >>> res4 = stats.fit(dist, data, bounds, optimizer=optimizer) >>> res4.params FitParams(n=5.0, p=0.5015183149259951, loc=0.0)
相关用法
- Python SciPy stats.find_repeats用法及代码示例
- Python SciPy stats.fisk用法及代码示例
- Python SciPy stats.fisher_exact用法及代码示例
- Python SciPy stats.fatiguelife用法及代码示例
- Python SciPy stats.friedmanchisquare用法及代码示例
- Python SciPy stats.false_discovery_control用法及代码示例
- Python SciPy stats.f_oneway用法及代码示例
- Python SciPy stats.f用法及代码示例
- Python SciPy stats.fligner用法及代码示例
- Python SciPy stats.foldnorm用法及代码示例
- Python SciPy stats.foldcauchy用法及代码示例
- Python SciPy stats.anderson用法及代码示例
- Python SciPy stats.iqr用法及代码示例
- Python SciPy stats.genpareto用法及代码示例
- Python SciPy stats.skewnorm用法及代码示例
- Python SciPy stats.cosine用法及代码示例
- Python SciPy stats.norminvgauss用法及代码示例
- Python SciPy stats.directional_stats用法及代码示例
- Python SciPy stats.invwishart用法及代码示例
- Python SciPy stats.bartlett用法及代码示例
- Python SciPy stats.levy_stable用法及代码示例
- Python SciPy stats.page_trend_test用法及代码示例
- Python SciPy stats.itemfreq用法及代码示例
- Python SciPy stats.exponpow用法及代码示例
- Python SciPy stats.gumbel_l用法及代码示例
注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.stats.fit。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。