【问题标题】:Scipy lognorm fitting to histogramScipy lognorm拟合直方图
【发布时间】:2017-01-30 16:23:50
【问题描述】:

我正在将对数正态 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()

这就是它的样子:

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

谢谢!

【问题讨论】:

  • (1) 明智的猜测总是有利于基于 MLE 的拟合。 (2) 如果您提供您的数据或展示一个可重复的示例会更好 (3) 我不确定您对data 的 pdf 采样有何看法(特别是因为我们不知道内容)。通常你会使用 np.linspace() 来生成某种网格like in the docs。 (4) 并且只是为了确保 matplotlib 没有引入麻烦:我会在没有 logscale 的情况下尝试它(仅分析,没有太大希望)

标签: python scipy normal-distribution


【解决方案1】:

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

【讨论】:

  • 供参考:“normed”已被贬值,请改用“density”
猜你喜欢
  • 2016-02-19
  • 2021-07-17
  • 2016-02-22
  • 2014-11-07
  • 1970-01-01
  • 1970-01-01
  • 2016-07-05
相关资源
最近更新 更多