Использование SciPy для размещения стабильного распределения - PullRequest
0 голосов
/ 07 февраля 2019

В 1.2 SciPy добавлена ​​способность для соответствия стабильному распределению Леви .У меня есть несколько дистрибутивов, которые я хотел бы разместить, но у меня есть некоторые проблемы с запуском.

Вот мой тестовый пример:

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 баллов.

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 голосов
/ 11 апреля 2019

Реализация стабильного распределения Леви в Scipy в основном использует метод Нолана, который разбивает пространство параметров (альфа, бета) на несколько сегментов, некоторые из которых требуют хитрых интегралов для оценки.

Сципи оценивает параметры, используя MLE, и это можетбыть очень медленным из-за этих же интегралов.Существует экспериментальная поддержка FFT для оценки стабильных PDF-файлов, надеюсь, эта функция значительно улучшится с этим PR , отмеченным вехой в 1,3.Однако, кажется, что метод fit () все еще довольно медленный, даже при использовании FFT.

Существует более быстрая квантильная оценка (McCulloch), которая используется в качестве первого предположения для параметров распределения (при оценке с использованием fit ()).Это можно вызвать напрямую с помощью _fitstart ().

Тем не менее кажется, что параметризация, используемая для генерации случайных выборок Сципи (из 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)

Надеюсь, чтопомогает.

0 голосов
/ 09 февраля 2019

Похоже, вы правильно настроили свою проблему;документация для rv_continuous, суперкласс levy_stable, содержит ссылки для всех своих функций (например, fit()).Я догадываюсь, что действительно медленная среда выполнения - это ошибка SciPy.

Использование pylevy fit_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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...