python - Scipy:对数正态拟合

标签 python statistics scipy

已经有很多关于使用 Scipy 处理 lognorm 分布的帖子,但我仍然没有掌握它。

2个参数lognormal通常用参数\mu\sigma来描述,对应Scipys的loc=0\sigma=shape, \mu=np.log(scale).

scipy, lognormal distribution - parameters ,我们可以阅读如何使用随机分布的指数生成 lognorm(\mu,\sigma)样本。现在让我们试试别的东西:

一)

直接创建对数范数有什么问题:

# 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)

lognorm

最佳答案

我做了同样的观察:所有参数的自由拟合在大多数情况下都失败了。您可以通过提供更好的初始猜测来提供帮助,无需修复参数。

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)

你也可以自己编写函数来计算初始猜测,例如:

def your_func(sample):
    # do some magic here
    return guess

stats.lognorm._fitstart = your_func

关于python - Scipy:对数正态拟合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18534562/

相关文章:

python - 将重复的列合并到同一数据框中

python - 从字典更新多个标签

testing - 无法安装ggp​​lot

从电子邮件下载的文件统计

opencv - 如何在扫描文档中查找段落边界框坐标?

python - 使用seaborn库从最佳拟合正态分布中获取平均值和标准差

python - scipy.ndimage.interpolate 卷积和关联之间的区别

python - `nth` 破坏了 pandas 中排序的数据框

PHP password_verify() 与 Python bcrypt.hashpw()

python - pandas : how to apply scipy. 对 groupby 对象的统计测试?