我正在尝试使用scipy
的fit函数来使伽马分布适合观察到的数据。观察到的数据的直方图如下:
均值和方差是
print("mean",np.mean(observed_data)) # mean 0.427611176580073
print("Var",np.var(observed_data)) # Var 0.6898193689790143
但是,如果我使用scipy.stats.gamma.fit()
将观察到的数据拟合为伽马分布,然后再次从该分布进行采样,则均值和方差完全不同:
我知道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)}")
在我看来,它比scipy
更好。为什么会这样?