使用SciPy拟合LevyStable分布

2024-09-25 00:29:09 发布

您现在位置:Python中文网/ 问答频道 /正文

在1.2中,SciPy添加了ability to fit a Levy-Stable distribution。我有一些发行版我想安装,但我在运行fit时遇到了一些问题。在

这是我的测试用例:

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))

如果我觉得我可以很容易地从中得出一个稳定的分配。但是,我收到了很多像下面这样的警告,问题是在1000分上花了很长时间。在

^{pr2}$

我把问题设置错了吗?关于这个问题,SciPy Docs有点单薄。在

我也遇到了类似的问题。在


Tags: toalphascipypointsbetadistributionfitstable
2条回答

Scipy对levy稳定分布的实现主要使用了Nolan的方法,该方法将参数空间(alpha,beta)分成几个部分,其中一些部分需要计算复杂的积分。在

Scipy使用MLE估计参数,由于这些相同的积分,这可能非常慢。有实验性的FFT支持来评估levy稳定的pdf,这个特性有望在1.3里程碑中得到显著改进。但是,即使使用FFT,fit()方法似乎仍然非常慢。在

有一种更快的分位数估计器(McCulloch),用作分布参数的第一个猜测(当使用fit()进行估计时)。这可以直接使用\u fitstart()调用。在

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

在此之前(正如@Ulrich在他们的回答中所建议的那样),您可以使用pylevy,也可以使用\u 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)

希望有帮助。在

看起来您已经正确地设置了问题;rv_continuousdocumentationlevy_stable的超类,它有所有函数的链接(例如,^{})。我的预感是,运行时非常慢是一个不稳定的bug。在

使用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()相当快):

^{pr2}$

相关问题 更多 >