Skip to main content
 首页 » 编程设计

python之适合直方图的 Scipy lognorm

2025年05月04日25yxwkf

我正在将对数正态 pdf 拟合到一些分箱数据,但我的曲线与数据不太匹配,请参见下图。我的代码是:

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

这是它的样子:

我是否需要以某种方式提供对形状、位置和比例的合理猜测?

谢谢!

请您参考如下方法:

您尝试拟合的数据看起来不像对数正态分布。对数正态分布,当绘制在对数 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()