为什么Scipy的fit()函数对伽玛分布产生完全不同的分布?

时间:2019-05-23 19:44:44

标签: python numpy scipy gamma-distribution

我正在尝试使用scipy的fit函数来使伽马分布适合观察到的数据。观察到的数据的直方图如下:

enter image description here

均值和方差是

print("mean",np.mean(observed_data)) # mean 0.427611176580073
print("Var",np.var(observed_data)) # Var 0.6898193689790143

但是,如果我使用scipy.stats.gamma.fit()将观察到的数据拟合为伽马分布,然后再次从该分布进行采样,则均值和方差完全不同:

enter image description here

我知道scipy基于MLE是合适的,但是我不理解为什么这些关键统计数据如此不正确的背后直觉-均值和方差完全不同。实际上,只要通过自己的求解器运行此命令,我就能获得更好的结果:

from scipy.optimize import fsolve
from typing import List
def fit_gamma_distribution(data: List[float]):
    mean = np.mean(data)
    variance = np.var(data)

    def equations(p):
        k, theta = p
        return (k * theta - mean, k * theta **2 - variance)
    solved_k, solved_theta = fsolve(equations, (1,1))

    if np.isclose(np.array([solved_k * solved_theta]), np.array([mean]), rtol=0.01):
        return fsolve(equations, (1,1))

k, theta = fit_gamma_distribution(observed_data)

new_dist = np.random.gamma(shape=k, scale=
theta, size=len(observed_data))
plt.hist(new_dist, alpha= 0.5, bins=40)
plt.hist(observed_data, alpha=0.2, bins=40)
plt.xlim(0,5)
plt.title(f"New sampled distribution: μ = {round(np.mean(new_dist),2)} observed μ = {round(np.mean(observed_data), 2)}")

enter image description here

在我看来,它比scipy更好。为什么会这样?

0 个答案:

没有答案