已经有很多关于使用Scipy处理lognorm
发行版(docs)的帖子,但我仍然没有掌握它的窍门。
lognormal通常由两个参数\mu
和\sigma
来描述,这两个参数对应于Scipy参数loc=0
和\sigma=shape
、\mu=np.log(scale)
。
在scipy, lognormal distribution - parameters中,我们可以看到如何使用随机分布的指数生成lognorm(\mu,\sigma)
样本,现在让我们尝试其他方法:
A)
直接创建对数范数的问题是什么:
import scipy as sp
import matplotlib.pyplot as plt
# 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
B)
我使用拟合的返回值来创建拟合分布。但显然我又做错了什么:
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)
5条答案
按热度按时间a9wyjsp71#
我做了同样的观察:所有参数的自由拟合在大多数情况下都失败了。2你可以提供一个更好的初始猜测来帮助你,没有必要修正参数。
您也可以创建自己的函数来计算初始猜测值,例如:
x4shl7ld2#
我认识到了我的错误:
A)我正在绘制的样本需要来自
.rvs
方法。如下所示:sample_dist = sp.stats.lognorm.rvs(3, loc=0, scale=np.exp(10), size=2000)
B)拟合存在一些问题。当我们固定
loc
参数时,拟合成功得多。param=sp.stats.lognorm.fit(samp, floc=0)
iq0todco3#
此问题已在较新的scipy版本中得到修复。将scipy0.9升级到scipy0.14后,此问题消失。
wmtdaxz34#
如果你只是对绘图感兴趣,你可以使用seaborn来得到对数正态分布。
vc6uscn95#
我在here中回答
我把代码留在这里只是为了偷懒:D
诀窍在于理解这两件事:
1.如果变量的EXP是正态的,MU和STD -〉EXP(X)~ scipy.stats.lognorm(s=sigma,位置=0,比例=np.exp(mu))