【问题标题】:Using SciPy to Fit a Levy-Stable Distribution使用 SciPy 拟合 Levy 稳定分布
【发布时间】:2019-07-01 01:39:03
【问题描述】:

在 1.2 SciPy 中添加了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 在这个问题上有点薄。

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

【问题讨论】:

  • 可能是您用于 jennys 常量的值,link 看起来您漏掉了一个小数点。希望对你有帮助
  • @TavoGLC,将 Jenny 的常数用于 random_state 似乎很幽默。但也许你的评论也是如此。 :)

标签: python numpy scipy statistics


【解决方案1】:

Scipy 对 levy 稳定分布的实现主要使用了 Nolan 的方法,该方法将参数空间(α、β)分成几个部分,其中一些需要复杂的积分来评估。

Scipy 使用 MLE 估计参数,由于这些相同的积分,这可能会非常慢。有用于评估 levy 稳定 PDF 的实验性 FFT 支持,此功能有望随着 this PR 与 1.3 里程碑一起显着改进。但是,即使使用 FFT,fit() 方法似乎仍然很慢。

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

也就是说,用于生成 Scipy 随机样本(来自 rvs())的参数化似乎与生成 pdfs/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)

希望对您有所帮助。

【讨论】:

  • 是的,所有其他发行版都适合相当快,但 levy_stable 需要几个小时。
  • @NoName 我认为缓慢是 scipy 的 MLE 拟合分布方法的产物。 github.com/scipy/scipy/pull/9523 中正在等待一些优化和修复,但没有人真正能够(或有时间)审查 PR。
【解决方案2】:

看起来您已经正确设置了问题; documentationrv_continuous 的超类levy_stable,它的所有函数都有链接(例如fit())。我的预感是真正缓慢的运行时是一个 SciPy 错误。

使用pylevyfit_levy() 似乎有效:

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)

【讨论】:

  • 有趣,pylevy 在 conda 中吗?
  • 我的预感是不是;我不使用康达。我按照我的答案中链接的 pylevy GitHub 页面上的安装说明进行操作。该页面有version 1.0,而PyPI 上的版本相当旧(0.3)。
猜你喜欢
  • 1970-01-01
  • 2013-07-03
  • 2021-05-13
  • 2014-03-03
  • 2016-02-19
  • 2011-03-15
  • 2011-02-23
  • 2018-11-15
  • 1970-01-01
相关资源
最近更新 更多