使用SciPy拟合稳定的分布

时间:2019-02-07 00:56:59

标签: python numpy scipy statistics

SciPy在1.2中添加了ability to fit a Levy-Stable distribution。我有一些适合的发行版,但在运行时出现了一些问题。

这是我的测试用例:

points = 1000
jennys_constant = 8675309
alpha, beta = 1.8, -0.5

draw = levy_stable.rvs(alpha, beta, size=points, random_state=jennys_constant)
print(levy_stable.fit(draw))

我认为,如果我从Levy-Stable发行版中提取,我应该能够很容易地适应该绘制。但是,我收到很多类似以下的警告,并且该问题在1000分上花费了很长时间。

C:\anaconda3\lib\site-packages\scipy\stats\_continuous_distns.py:3857: IntegrationWarning: The integral is probably divergent, or slowly convergent.
intg = integrate.quad(f, -xi, np.pi/2, **intg_kwargs)[0]

我是否正确设置了问题? SciPy Docs在这个问题上有点瘦。

我在拟合我的真实世界数据时遇到类似的问题。

2 个答案:

答案 0 :(得分:1)

看起来您已经正确设置了问题; rv_continuous的超类levy_stable的{​​{3}}具有其所有功能的链接(例如documentation)。我的直觉是运行时真的很慢是SciPy错误。

使用fit()pylevy似乎有效:

import scipy.stats as st, levy

points = 1000
jennys_constant = 8675309
alpha, beta = 1.8, -0.5

draw = st.levy_stable.rvs(alpha, beta, size=points, random_state=jennys_constant)
print(levy.fit_levy(draw))

结果似乎相当不错(并且fit_levy()相当快):

(par=0, alpha=1.84, beta=-0.29, mu=0.11, sigma=1.00, 1863.61502664704)

答案 1 :(得分:1)

Scipy对征费稳定分配的实现主要使用Nolan方法,该方法将参数空间(alpha,beta)划分为几个段,其中一些段需要进行棘手的积分评估。

Scipy使用MLE估计参数,由于这些相同的积分,这可能非常慢。有用于评估征费稳定PDF的实验性FFT支持,希望通过Descendant selector标记1.3里程碑可以显着改善此功能。但是,即使使用FFT,fit()方法似乎仍然非常慢。

有一个更快的分位数估计器(McCulloch),它用作分布参数的第一次猜测(使用fit()进行估计时)。可以使用_fitstart()直接调用。

也就是说,似乎用于生成Scipy随机样本(来自rvs())的参数化与用于生成pdf / cdfs的参数化不同。我希望将来能看到一些东西。

在此之前(如@Ulrich在他们的答案中所建议),您可以使用pylevy或使用_fitstart()估计参数并随后转换参数。

from scipy.stats import levy_stable
import numpy as np

points = 1000000
jennys_constant = 8675309
alpha, beta = 1.8, -0.5

draw = levy_stable.rvs(alpha, beta, size=points, random_state=jennys_constant)

# use scipy's quantile estimator to estimate the parameters and convert to S parameterization
pconv = lambda alpha, beta, mu, sigma: (alpha, beta, mu - sigma * beta * np.tan(np.pi * alpha / 2.0), sigma)
pconv(*levy_stable._fitstart(draw))

>>> (1.7990380668349146, -0.5661063359664303,
      -0.012873575589969821, 0.998276003705684)

希望有帮助。