尽管我读了很多关于python拟合分布的文章,但我仍然对用法flocfscale参数感到困惑。对于一般信息,我主要使用thisthisthis来源。

我知道,给定分布可以说当使用locscale参数时f(x)变得更通用,可以用公式描述
f(x)= f((x-loc)/比例)。

在科学上,我们必须选择。当使用公式distr.fit(x)拟合分布时,loc参数的初始猜测为0,而fscale参数的初始猜测为1(因此,我们假设参数化分布接近于非参数化分布)。我们还可以使用distr.fit(x, floc = 0, fscale = 1)强制scipy拟合“原始”分布f(x)。

我的问题是:除了“参数化参数”之外,何时有必要强制scipy适应“原始分布”?

这是示例:

# generate some data
from scipy.stats import lognorm, fisk, gamma
from statsmodels.distributions.empirical_distribution import ECDF
import numpy as np
import matplotlib.pyplot as plt

x1 = [18. for i in range(36)]
x2 = [19. for i in range(17)]
x3 = [22. for i in range(44)]
x4 = [27. for i in range(63)]
x5 = [28.2 for i in range(8)]
x6 = [32. for i in range(104)]
x7 = [32.6 for i in range(29)]
x8 = [33. for i in range(85)]
x9 = [33.4 for i in range(27)]
x10 = [34.2 for i in range(49)]
x11 = [36. for i in range(99)]
x12 = [36.2 for i in range(35)]
x13 = [37. for i in range(98)]
x14 = [38. for i in range(25)]
x15 = [38.4 for i in range(39)]
x16 = [39. for i in range(25)]
x17 = [42. for i in range(54)]

# empirical distribution function
xp = x1 + x2+x3+x4+x5+x6+x7+x8+x9+x10+x11+x12+x13+x14+x15+x16+x17
yp = ECDF(xp)

# fit lognormal distribution with parametrization
pars1 = lognorm.fit(xp)
# fit lognormal distribution with floc = 0
pars2 = lognorm.fit(xp, floc = 0)
#plot the result
X = np.linspace(min(xp), max(xp), 10000)
plt.plot(yp.x, yp.y, 'ro')
plt.plot(X, lognorm.cdf(X, pars1[0], pars1[1], pars1[2]), 'b-')
plt.plot(X, lognorm.cdf(X, pars2[0], pars2[1], pars2[2]), 'g-')
plt.show()


python - 何时在scipy中使用floc和fscale参数?-LMLPHP

#fit the gamma distribution
pars1 = gamma.fit(xp)
pars2 = gamma.fit(xp, floc = 0)
#plot the result
X = np.linspace(min(xp), max(xp), 10000)
plt.plot(yp.x, yp.y, 'ro')
plt.plot(X, gamma.cdf(X, pars1[0], pars1[1], pars1[2]), 'b-')
plt.plot(X, gamma.cdf(X, pars2[0], pars2[1], pars2[2]), 'g-')
plt.show()


python - 何时在scipy中使用floc和fscale参数?-LMLPHP

如您所见,floc = 0在lognorm情况下大大提高了拟合度,在gamma情况下,它根本没有改变拟合度。

对不起,请您长时间取消预订,这又是我的问题:何时指定floc = 0fscale = 1以及何时使用自定义loc = 0scale = 1有任何一般性建议吗?

最佳答案

简短答案

只要有可能,就提供locscale的一些猜测估计。仅在以后需要使用模型时才提供flocfscale;也就是说,如果您的答案不满意,例如分布平均值不为0的答案。

例如,如果您根据胡克定律F = k*x对弹力进行建模,并希望从实验力F和变形x中找到k,那么在拟合一般线性模型k*x+b时就没有用了。我们知道零力会产生零变形。 b的任何非零值都可以达到更好的拟合度,但这仅是因为它更好地遵循了实验误差,这不是目标。因此,在这种情况下,我们要强制某个参数为零。

如果您只是想提高拟合度,请不要使用flocfscale。使用locscale代替。

说明

使分布适合数据是一个多变量优化问题。这样的问题很难解决,而当起点远非最佳时,求解器经常会失败。如果floc给出的结果比无约束拟合更好,则仅表示无约束拟合失败。

为了改善结果,只要能够提出合理的建议,就应该提供loc和scale参数。

在您的对数正态示例中,您没有对施加限制floc=0给出任何暗示。但是最好的策略就是使用loc=0给出提示:

pars1 = lognorm.fit(xp, loc=0)


生成的蓝色曲线比带有floc=0的绿色曲线好。

python - 何时在scipy中使用floc和fscale参数?-LMLPHP

当然更好。 loc=0将优化器指向一个不错的起点,并使其从那里开始工作。 floc=0将优化器指向一个不错的起点,然后告诉它留在那里。

关于python - 何时在scipy中使用floc和fscale参数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49510078/

10-12 20:25