将分布拟合到直方图

alo*_*oha 5 python scipy data-fitting

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

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

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()
Run Code Online (Sandbox Code Playgroud)

结果是:

在此输入图像描述

我究竟做错了什么?

unu*_*tbu 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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • pdf下的区域(在整个域中)等于1.如果使用,直方图下的区域等于1 normed=True.

  • x长度size(即20000),并pdf_fitted具有相同的形状x.如果我们调用plot并仅指定y值,例如plt.plot(pdf_fitted),则在x范围上绘制值[0, size].那个x范围太大了.由于直方图将使用x范围[min(y), max(y)],我们选择x跨越相似的范围:x = np.linspace(0, y.max())和调用plot指定的x值和y值,例如plt.plot(x, pdf_fitted).

  • 正如Warren Weckesser在评论中指出的那样,对于大多数应用程序,您知道伽马分布的域从0开始.如果是这种情况,请使用floc=0loc参数保持为0.不使用floc=0,gamma.fit将尝试找到loc参数的最佳拟合值同样,由于数据的变幻莫测,一般不会完全为零.

  • 请注意,通常不使用gamma分布的`loc`参数(即不应移动PDF),并且该值固定为0.默认情况下,`fit`方法将`loc`视为拟合参数,所以你可能得到一个小的非零移位 - 检查`fit`返回的参数.你可以通过使用参数`floc = 0`来告诉`fit`不要将`loc`作为拟合参数. (4认同)