我无法理解创建对数正态变量的基础知识here。
The log normal distribution takes on mean and variance as parameters。我想使用这些参数创建一个冻结分布,然后获得cdf,pdf等。
但是,在文档中,他们使用
获取冻结分发from scipy.stats import lognorm
s = 0.953682269606
rv = lognorm(s)
' S'似乎是标准偏差。我试图使用' loc'和'规模'参数而不是',但产生了错误(s是必需参数)。如何使用参数值生成冻结分布' m'' s'位置和规模?
答案 0 :(得分:14)
ln(scale)
(!)s
)loc
我认为这是一个严重的问题,没有明确记录。我想在SciPy中使用对数正态分布进行简单测试时,许多人已经失败了。
stats模块对所有发行版都视为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
这仍然没有完全收敛,但我认为足够证明样本对应于WolframAlpha假设的相同分布,给定μ= 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我们可以阅读:
使用形状参数sigma和scale参数exp(mu)
这真的不明显(我们都无法理解这句话的重要性)。我想我们无法理解这句话意味着什么的原因是注释部分中显示的分析表达式不包括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
,这将确保{{1}之间的对应关系和}。试试看! :)
修改2
我对WolframAlpha(WA)和SciPy所说的做了比较。 WA很清楚它使用μ和σ如通常所理解的那样(如链接的维基百科文章中所定义)。
loc
匹配WA's output。
现在,对于>>> l = lognorm(s=2, loc=0)
>>> print("mean: %.5f stddev: %.5f" % (l.mean(), l.std()))
mean: 7.38906 stddev: 54.09584
不为零,存在不匹配。例如:
loc
WA gives的平均值为20.08,标准差为147.你得到它,>>> l = lognorm(s=2, loc=1)
>>> print("mean: %.5f stddev: %.5f" % (l.mean(), l.std()))
mean: 8.38906 stddev: 54.09584
不对应于对数正态分布的经典定义中的μ