将分布拟合到直方图

Fit a distribution to a histogram

我想知道我的数据点的分布,所以我首先绘制了我的数据的直方图。我的直方图如下所示:

其次,为了使它们适合分布,这是我编写的代码:

size = 20000
x = scipy.arange(size)
# fit
param = scipy.stats.gamma.fit(y)
pdf_fitted = scipy.stats.gamma.pdf(x, *param[:-2], loc = param[-2], scale = param[-1]) * size
plt.plot(pdf_fitted, color = 'r')

# plot the histogram
plt.hist(y)

plt.xlim(0, 0.3)
plt.show()

结果是:

我做错了什么?

您的数据似乎不是伽玛分布的,但假设是,您可以这样拟合:

import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt

gamma = stats.gamma
a, loc, scale = 3, 0, 2
size = 20000
y = gamma.rvs(a, loc, scale, size=size)

x = np.linspace(0, y.max(), 100)
# fit
param = gamma.fit(y, floc=0)
pdf_fitted = gamma.pdf(x, *param)
plt.plot(x, pdf_fitted, color='r')

# plot the histogram
plt.hist(y, normed=True, bins=30)

plt.show()

  • pdf 下的面积(整个域)等于 1。 如果使用 normed=True.

  • ,则直方图下方的面积等于 1
  • x 的长度为 size(即 20000),pdf_fitted 的形状与 x 相同。如果我们调用 plot 并仅指定 y 值,例如plt.plot(pdf_fitted),然后在 x 范围 [0, size] 上绘制值。 这是一个太大的 x 范围。由于直方图将使用 [min(y), max(y)] 的 x 范围,我们选择 x 来跨越类似的范围:x = np.linspace(0, y.max()),并使用 x- 调用 plot和指定的 y 值,例如plt.plot(x, pdf_fitted).

  • 正如 Warren Weckesser 在评论中指出的那样,对于大多数应用程序,您知道伽马分布的域从 0 开始。如果是这种情况,请使用 floc=0 来保存 loc 参数设置为 0。如果没有 floc=0gamma.fit 也会尝试为 loc 参数找到最合适的值,鉴于数据的变幻莫测,这通常不会完全为零。