尽管我读了很多关于python拟合分布的文章,但我仍然对用法floc
和fscale
参数感到困惑。对于一般信息,我主要使用this,this和this来源。
我知道,给定分布可以说当使用loc
和scale
参数时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()
#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()
如您所见,
floc = 0
在lognorm情况下大大提高了拟合度,在gamma情况下,它根本没有改变拟合度。对不起,请您长时间取消预订,这又是我的问题:何时指定
floc = 0
和fscale = 1
以及何时使用自定义loc = 0
和scale = 1
有任何一般性建议吗? 最佳答案
简短答案
只要有可能,就提供loc
和scale
的一些猜测估计。仅在以后需要使用模型时才提供floc
和fscale
;也就是说,如果您的答案不满意,例如分布平均值不为0的答案。
例如,如果您根据胡克定律F = k*x
对弹力进行建模,并希望从实验力F和变形x中找到k
,那么在拟合一般线性模型k*x+b
时就没有用了。我们知道零力会产生零变形。 b
的任何非零值都可以达到更好的拟合度,但这仅是因为它更好地遵循了实验误差,这不是目标。因此,在这种情况下,我们要强制某个参数为零。
如果您只是想提高拟合度,请不要使用floc
或fscale
。使用loc
和scale
代替。
说明
使分布适合数据是一个多变量优化问题。这样的问题很难解决,而当起点远非最佳时,求解器经常会失败。如果floc
给出的结果比无约束拟合更好,则仅表示无约束拟合失败。
为了改善结果,只要能够提出合理的建议,就应该提供loc和scale参数。
在您的对数正态示例中,您没有对施加限制floc=0
给出任何暗示。但是最好的策略就是使用loc=0
给出提示:
pars1 = lognorm.fit(xp, loc=0)
生成的蓝色曲线比带有
floc=0
的绿色曲线好。当然更好。
loc=0
将优化器指向一个不错的起点,并使其从那里开始工作。 floc=0
将优化器指向一个不错的起点,然后告诉它留在那里。关于python - 何时在scipy中使用floc和fscale参数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49510078/