使用Scipy对直方图进行lognorm拟合

4
我正在将对数正态分布拟合到一些离散数据上,但是我的曲线与数据不太匹配,如下图所示。我的代码如下:
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import lognorm

data = genfromtxt('data.txt')
data = np.sort(data)

# plot histogram in log space

ax.hist(data, bins=np.logspace(0,5,200),normed=1)
ax.set_xscale("log")

shape,loc,scale = lognorm.fit(data)

print shape, loc, scale

pdf = sp.stats.lognorm.pdf(data, shape, loc, scale)

ax.plot(data,pdf)

plt.show()

这是它的外观: enter image description here 我是否需要为形状、位置和尺度提供合理的猜测来适应数据?
谢谢!

1
(1) 对于基于MLE的拟合,明智的猜测总是很好的选择。(2) 如果您提供数据或展示可重现的示例,那将更好。(3) 我不确定如何看待您从data中进行的pdf抽样(特别是因为我们不知道其内容)。通常,您会使用np.linspace()生成某种网格就像文档中所示。(4) 为了确保matplotlib没有引入问题:我建议尝试一下不使用对数刻度(仅进行分析,没有太大希望)。 - sascha
1个回答

11
你试图拟合的数据似乎不符合对数正态分布。当对数正态分布在对数x轴上绘制时,应该呈现出正态分布的形态。但是你展示的图表并非如此。当分布与数据不匹配时,将得到奇怪的参数。
在尝试拟合任何东西之前,你需要找出你的数据实际上是如何分布的(严格来说,这不是SO的主题)。
以下是从对数正态分布中随机抽取数据时所得到的结果:
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import lognorm

np.random.seed(42)

data = lognorm.rvs(s=0.5, loc=1, scale=1000, size=1000)

# plot histogram in log space
ax = plt.subplot(111)
ax.hist(data, bins=np.logspace(0,5,200), density=True)
ax.set_xscale("log")

shape,loc,scale = lognorm.fit(data)

x = np.logspace(0, 5, 200)
pdf = lognorm.pdf(x, shape, loc, scale)

ax.plot(x, pdf, 'r')

plt.show()

histogram and PDF of lognorm distribution look like normal distribution when the x-axis is logarithmic


1
参考:'normed'已被弃用,请使用'density'代替 - LittleNose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接