тайна решена (править 3)
- μ соответствует
ln(scale)
(!)
- σ соответствует форма (
s
)
loc
не требуется для установки любого из σ и ц
Я думаю, что это серьезная проблема, что это явно не документировано. Наверное, многие из них пришли к этому, когда делали простые тесты с логнормальным распределением в SciPy.
Почему?
Модуль статистики обрабатывает loc
и scale
одинаково для всех распределений (это явно не записывается, но может быть выведено при чтении между строками). Мое подозрение заключалось в том, что loc
вычитается из x
, а результат делится на scale
(и результат обрабатывается как новый x
). Я тестировал это, и это оказалось так.
Что это означает для логарифмического распределения? В каноническом определении логнормального распределения появляется выражение ln(x)
. Очевидно, что тот же термин появляется в реализации SciPy. С выше соображения, это как loc
и scale
в конечном итоге в логарифм:
ln((x-loc)/scale)
По общему логарифм исчислении, это то же самое, как
ln(x-loc) - ln(scale)
В каноническом определении логарифмически нормального распределения термин просто равен ln(x) - μ
. Сравнивая подход SciPy и канонический подход, он дает критическое понимание: ln(scale)
представляет μ. loc
, однако, не имеет соответствия в каноническом определении и лучше остается в 0. Далее я утверждал, что форма (s
) равна σ.
Доказательство
>>> import math
>>> from scipy.stats import lognorm
>>> mu = 2
>>> sigma = 2
>>> l = lognorm(s=sigma, loc=0, scale=math.exp(mu))
>>> print("mean: %.5f stddev: %.5f" % (l.mean(), l.std()))
mean: 54.59815 stddev: 399.71719
Я использую WolframAlpha в качестве ссылки. Он обеспечивает аналитически определенные значения среднего и стандартного отклонения логнормального распределения.
http://www.wolframalpha.com/input/?i=log-normal+distribution%2C+mean%3D2%2C+sd%3D2
Матч значения.
WolframAlpha, а также SciPy придумывают среднее и стандартное отклонение, оценивая аналитические термины. Выполним эмпирический тест, принимая много образцов из распределения SciPy, и вычислить их среднее значение и стандартное отклонение «вручную» (из всего набора образцов):
>>> import numpy as np
>>> samples = l.rvs(size=2*10**7)
>>> print("mean: %.5f stddev: %.5f" % (np.mean(samples), np.std(samples)))
mean: 54.52148 stddev: 380.14457
Это все еще не вполне сходился, но я думаю, что достаточно доказательств, что образцы соответствуют тому же распределению, которое предполагал Вольфрам Альфа, при μ = 2 и σ = 2.
И еще один маленькое редактирование: это выглядит как правильное использование поисковой системы помогло бы мы не были первыми, чтобы быть в ловушке этого:
https://stats.stackexchange.com/questions/33036/fitting-log-normal-distribution-in-r-vs-scipy http://nbviewer.ipython.org/url/xweb.geos.ed.ac.uk/~jsteven5/blog/lognormal_distributions.ipynb scipy, lognormal distribution - parameters
Другого редактированием: Теперь что я знаю, как он себя ведет, я понимаю, что поведение в принципе документировано. В the "notes" section мы можем прочитать:
с параметром формы сигмы и масштабного параметра ехр (мю)
Это просто на самом деле не очевидно (мы оба были не в состоянии оценить важность этого небольшого предложения) , Я думаю, причина, по которой мы не могли понять, что это означает, означает, что аналитическое выражение, показанное в разделе примечаний, не включает loc
и scale
. Думаю, это стоит улучшить отчет об ошибках/документацию.
Оригинальный ответ:
Действительно, тема параметра формы не очень хорошо документирован при взгляде на страницу Документов для конкретного распределения. Я рекомендую иметь взгляд на основной документации статистики - есть раздел о параметрах формы:
http://docs.scipy.org/doc/scipy/reference/tutorial/stats.html#shape-parameters
Похоже, что должна быть lognorm.shapes
свойства, говоря вам о том, что означает параметр s
, в частности.
Редактировать: Существует только один параметр, на самом деле:
>>> lognorm.shapes
's'
При сравнении общее определение логарифмически нормального распределения (из Википедии):
и формулы дается scipy docs:
lognorm.pdf(x, s) = 1/(s*x*sqrt(2*pi)) * exp(-1/2*(log(x)/s)**2)
становится очевидно, что s
является истинным σ (sigma
).
Однако из документов не очевидно, как параметр loc
связан с μ (mu
).
Это может быть, как и в ln(x-loc)
, который бы не соответствуют ц в общей формуле, или это может быть ln(x)-loc
, которая обеспечивала бы соответствие между loc
и μ. Попробуйте! :)
Edit 2
Я сделал сравнение между тем, что говорят WolframAlpha (WA) и SciPy. WA довольно ясно, что он использует μ и σ как обычно понимаемые (как определено в связанной статье Википедии).
>>> l = lognorm(s=2, loc=0)
>>> print("mean: %.5f stddev: %.5f" % (l.mean(), l.std()))
mean: 7.38906 stddev: 54.09584
Это соответствия WA's output.
Теперь, для loc
, не являющегося нолем, есть несоответствие. Пример:
>>> l = lognorm(s=2, loc=1)
>>> print("mean: %.5f stddev: %.5f" % (l.mean(), l.std()))
mean: 8.38906 stddev: 54.09584
WA gives среднее 20.08 и стандартное отклонение 147. у вас есть, loc
делает не соответствуют ц в классическом определении логарифмически нормального распределения.