bio*_*ime 14 python statistics scipy
有很多关于处理lognormScipy发行的帖子,但我仍然不了解它.
2参数对数正态通常是由参数来描述\mu和\sigma其对应于Scipys loc=0和\sigma=shape,\mu=np.log(scale).
在scipy,lognormal分布 - 参数,我们可以阅读如何lognorm(\mu,\sigma)使用随机分布的指数生成样本.现在让我们尝试别的东西:
直接创建lognorm的问题是什么:
# 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
Run Code Online (Sandbox Code Playgroud)
我使用拟合的返回值来创建拟合分布.但是我再次表现得很糟糕:
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)
Run Code Online (Sandbox Code Playgroud)

我做了同样的观察:大多数时候所有参数的自由配合都失败了.您可以通过提供更好的初始猜测来帮助,修复参数是没有必要的.
samp = stats.lognorm(0.5,loc=0,scale=1).rvs(size=2000)
# this is where the fit gets it initial guess from
print stats.lognorm._fitstart(samp)
(1.0, 0.66628696413404565, 0.28031095750445462)
print stats.lognorm.fit(samp)
# note that the fit failed completely as the parameters did not change at all
(1.0, 0.66628696413404565, 0.28031095750445462)
# fit again with a better initial guess for loc
print stats.lognorm.fit(samp, loc=0)
(0.50146296628099118, 0.0011019321419653122, 0.99361128537912125)
Run Code Online (Sandbox Code Playgroud)
您还可以编写自己的函数来计算初始猜测,例如:
def your_func(sample):
# do some magic here
return guess
stats.lognorm._fitstart = your_func
Run Code Online (Sandbox Code Playgroud)
我意识到自己的错误:
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)