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在这个问题上有点瘦。
我在拟合我的真实世界数据时遇到类似的问题。
答案 0 :(得分:1)
看起来您已经正确设置了问题; rv_continuous
的超类levy_stable
的{{3}}具有其所有功能的链接(例如documentation)。我的直觉是运行时真的很慢是SciPy错误。
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)
希望有帮助。