使用seaborn通过scipy拟合后对数正态分布的拟合

时间:2016-10-12 02:45:32

标签: python scipy probability seaborn

我使用scipy.stats.lognormal对我的数据进行了分配,现在我正在尝试绘制分布。我用seaborn生成了我的数据:

ax = sns.distplot(1 - clint_unique_cov_filter['Identity'], kde=False, hist=True, 
                  norm_hist=True, fit=lognorm, bins=np.linspace(0, 1, 500))
ax.set_xlim(0, 0.1)

这让我觉得我很满意:

seaborn fit

我需要使用此发行版的参数进​​行进一步分析,但首先我想验证我理解这些术语。 This post告诉我,我想进行以下转换以转换lognorm.fit的输出以获取对数正态的标准mu和sigma参数:

shape, loc, scale = lognorm.fit(1 - clint_unique_cov_filter['Identity'])
mu = np.log(scale)
sigma = shape

但是当我尝试绘制这个时,我没有得到我期望的分布。为了仔细检查,我尝试将原始值重新粘贴到图中,但分布明显不同:

s, l, sc = lognorm.fit(1 - clint_unique_cov_filter['Identity'])
rv = lognorm(s, l, sc)
plt.plot(np.linspace(0, 0.1), rv.pdf(np.exp(np.linspace(0, 0.1))))

incorrect distribution

为什么这个分布与一个seaborn产生的分布不一样?

编辑:

阅读seaborn代码让我得到了答案:

params = lognorm.fit(1 - clint_unique_cov_filter['Identity'])
xvals = np.linspace(0, 0.1)
pdf = lambda x: lognorm.pdf(xvals, *params)
yvals = pdf(xvals)
plt.plot(xvals, yvals)

这提供了正确的情节:

plot following seaborn's method of fitting

0 个答案:

没有答案