将分布拟合到直方图

时间:2015-03-23 10:53:53

标签: python scipy data-fitting

我想知道我的数据点的分布,所以首先我绘制了数据的直方图。我的直方图如下所示: my 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()

结果是:

enter image description here

我做错了什么?

1 个答案:

答案 0 :(得分:8)

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

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

enter image description here

  • 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在评论中指出的那样,对于大多数应用程序,您知道gamma分布的域从0开始。如果是这种情况,请使用floc=0loc参数保存到0.如果没有floc=0gamma.fit也会尝试找到loc参数的最佳拟合值,因为数据的变化通常不会完全为零。

相关问题