回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>有很多关于用Scipy处理<code>lognorm</code>分布的帖子,但是我仍然没有掌握它的窍门。</p>
<p>2参数lognormal通常由参数<code>\mu</code>和<code>\sigma</code>来描述,它们对应于Scipys<code>loc=0</code>和<code>\sigma=shape</code>,<code>\mu=np.log(scale)</code>。</p>
<p>在<a href="https://stackoverflow.com/questions/8747761/scipy-lognormal-distribution-parameters">scipy, lognormal distribution - parameters</a>,我们可以阅读如何使用随机分布的指数生成<code>lognorm(\mu,\sigma)</code>样本。现在让我们尝试其他方法:</p>
<h2>(一)</h2>
<p>直接创建lognorm有什么问题:</p>
<pre><code># lognorm(mu=10,sigma=3)
# so shape=3, loc=0, scale=np.exp(10) ?
x=np.linspace(0.01,20,200)
sample_dist = sp.stats.lognorm.pdf(x, 3, loc=0, scale=np.exp(10))
shape, loc, scale = sp.stats.lognorm.fit(sample_dist, floc=0)
print shape, loc, scale
print np.log(scale), shape # mu and sigma
# last line: -7.63285693379 0.140259699945 # not 10 and 3
</code></pre>
<h2>(二)</h2>
<p>我使用拟合的返回值来创建拟合分布。但显然我又做错了:</p>
<pre><code>samp=sp.stats.lognorm(0.5,loc=0,scale=1).rvs(size=2000) # sample
param=sp.stats.lognorm.fit(samp) # fit the sample data
print param # does not coincide with shape, loc, scale above!
x=np.linspace(0,4,100)
pdf_fitted = sp.stats.lognorm.pdf(x, param[0], loc=param[1], scale=param[2]) # fitted distribution
pdf = sp.stats.lognorm.pdf(x, 0.5, loc=0, scale=1) # original distribution
plt.plot(x,pdf_fitted,'r-',x,pdf,'g-')
plt.hist(samp,bins=30,normed=True,alpha=.3)
</code></pre>
<p><img src="https://i.stack.imgur.com/xzBFX.png" alt="lognorm"/></p>