使用Scipy记录正态随机变量

时间:2015-02-24 16:10:05

标签: python scipy

我无法理解创建对数正态变量的基础知识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'位置和规模?

1 个答案:

答案 0 :(得分:14)

解开了谜团(编辑3)

  • μ对应ln(scale)(!)
  • σ对应于形状(s
  • 设置σ和μ中的任何一个都不需要
  • loc

我认为这是一个严重的问题,没有明确记录。我想在SciPy中使用对数正态分布进行简单测试时,许多人已经失败了。

为什么?

stats模块对所有发行版都视为locscale相同(这没有明确写下来,但可以在读取行之间推断)。我怀疑loc是从x中减去的,结果除以scale(结果被视为新的x)。我对此进行了测试,事实证明是这样的。

对数正态分布意味着什么?在对数正态分布的规范定义中,出现了术语ln(x)。显然,同样的术语出现在SciPy的实现中。考虑到上述问题,这就是locscale以>对数结束的方式:

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

enter image description here

值匹配。

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)

这真的不明显(我们都无法理解这句话的重要性)。我想我们无法理解这句话意味着什么的原因是注释部分中显示的分析表达式包括locscale。我想这值得进行错误报告/文档改进。

原始回答:

实际上,在查看特定分发的文档页面时,形状参数主题没有详细记录。我建议看一下主要的统计数据文档 - 有一个关于形状参数的部分:

http://docs.scipy.org/doc/scipy/reference/tutorial/stats.html#shape-parameters

看起来应该有一个lognorm.shapes属性,告诉你s参数的含义,具体来说。

修改 确实只有一个参数:

>>> lognorm.shapes
's'

当比较对数正态分布的一般定义时(来自维基百科): enter image description here

和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 对应于对数正态分布的经典定义中的μ