I want to know the distribution of my data points, so first I plotted the histogram of my data. My histogram looks like the following:
![my histogram](https://i.stack.imgur.com/HQOYp.png)
其次,为了使它们适合发行版,这是我编写的代码:
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。
如果使用,直方图下方的面积等于 1normed=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=0
持有loc
参数为 0。无floc=0
, gamma.fit
将尝试找到最适合的值loc
参数也是如此,考虑到数据的变化无常,它通常不会完全为零。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)