我无法理解创建对数正态变量的基础知识,如此处所述.
对数正态分布采用均值和方差作为参数.我想使用这些参数创建一个冻结分布,然后得到cdf,pdf等.
但是,在文档中,他们使用了冻结分发
from scipy.stats import lognorm
s = 0.953682269606
rv = lognorm(s)
Run Code Online (Sandbox Code Playgroud)
's'似乎是标准偏差.我尝试使用'loc'和'scale'参数而不是's',但这会产生错误(s是必需参数).如何为位置和比例生成参数值为"m","s"的冻结分布?
Jan*_*cke 14
ln(scale)(!)s)loc 设置σ和μ中的任何一个都不需要我认为这是一个严重的问题,没有明确记录.我猜想在SciPy中使用对数正态分布进行简单测试时,许多人已经失败了.
该统计模块对待loc,并scale同样为所有的发行(这是没有明确写下来,但字里行间时,可以推断).我的怀疑是loc从中减去x,结果除以scale(结果被视为新的x).我测试了这一点,事实证明是这样的.
对数正态分布意味着什么?在对数正态分布的规范定义中ln(x)出现该术语.显然,同样的术语出现在SciPy的实现中.通过上面的考虑,这是怎么了loc,并scale最终在对数:
ln((x-loc)/scale)
Run Code Online (Sandbox Code Playgroud)
通过常用的对数演算,这是相同的
ln(x-loc) - ln(scale)
Run Code Online (Sandbox Code Playgroud)
在对数正态分布的规范定义中,该术语就是简单的 ln(x) - ?.比较SciPy的方法和规范方法,然后提供关键的洞察力:ln(scale)代表μ.loc然而,在规范定义中没有对应关系,最好留在0处.在下面,我已经论证了shape(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
Run Code Online (Sandbox Code Playgroud)
我使用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
Run Code Online (Sandbox Code Playgroud)
这仍然不是完全收敛的,但我认为足够证明样本对应于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
另一个编辑:现在我知道它的行为,我意识到原则上的行为是有记录的.在"备注"部分,我们可以阅读:
具有形状参数sigma和比例参数exp(mu)
这真的不是很明显(我们都无法理解这个小句子的重要性).我想我们无法理解这句话意味着什么的原因是注释部分中显示的分析表达式不包括loc和scale.我想这值得一个bug报告/文档改进.
原始答案:
实际上,在查看特定分布的文档页面时,形状参数主题没有详细记录.我建议看一下主要的统计数据文档 - 有一个关于形状参数的部分:
http://docs.scipy.org/doc/scipy/reference/tutorial/stats.html#shape-parameters
看起来应该有一个lognorm.shapes属性,告诉你s参数的含义,具体来说.
编辑: 确实只有一个参数:
>>> lognorm.shapes
's'
Run Code Online (Sandbox Code Playgroud)
比较对数正态分布的一般定义(来自维基百科):

和scipy docs给出的公式:
lognorm.pdf(x, s) = 1 / (s*x*sqrt(2*pi)) * exp(-1/2*(log(x)/s)**2)
Run Code Online (Sandbox Code Playgroud)
很明显,这s是真正的σ(sigma).
但是,从文档来看,loc参数与μ(mu)的关系并不明显.
它可能是如ln(x-loc),这将不符合通式到μ,或者它可以是ln(x)-loc,这将确保之间的对应关系loc和μ.试试看!:)
编辑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
Run Code Online (Sandbox Code Playgroud)
这符合WA的输出.
现在,因为loc不是零,所以存在不匹配.例:
>>> l = lognorm(s=2, loc=1)
>>> print("mean: %.5f stddev: %.5f" % (l.mean(), l.std()))
mean: 8.38906 stddev: 54.09584
Run Code Online (Sandbox Code Playgroud)
WA 给出了 20.08的平均和你有它的147有一个标准偏差,loc并没有对应的对数正态分布的经典定义μ.