【发布时间】:2019-12-12 13:00:50
【问题描述】:
我有两个列表。两者都包括标准化百分比:
- actual_population_distribution = [0.2,0.3,0.3,0.2]
- sample_population_distribution = [0.1,0.4,0.2,0.3]
我希望将这两个列表拟合到 gamma 分布中,然后计算返回的两个列表以获得 KL 值。
我已经可以拿到KL了。
这是我用来计算 gamma 的函数:
def gamma_random_sample(data_list):
mean = np.mean(data_list)
var = np.var(data_list)
g_alpha = mean * mean / var
g_beta = mean / var
for i in range(len(data_list)):
yield random.gammavariate(g_alpha, 1/g_beta)
将两个列表拟合到 gamma 分布中:
actual_grs = [i for i in f.gamma_random_sample(actual_population_distribution)]
sample_grs = [i for i in f.gamma_random_sample(sample_population_distribution)]
这是我用来计算 KL 的代码:
kl = np.sum(scipy.special.kl_div(actual_grs, sample_grs))
上面的代码不会产生任何错误。
但我怀疑我对 gamma 所做的方式是错误的,因为 np.mean/var 得到均值和方差。
确实,数字不同:
mean, var, skew, kurt = gamma.stats(fit_alpha, loc = fit_loc, scale = fit_beta, moments = 'mvsk')
如果我使用这种方式。
通过使用“mean, var, skew, kurt = gamma.stats(fit_alpha, loc = fit_loc, scale = fit_beta, moments = 'mvsk')”,我会得到一个大于 1 的 KL 值,因此这两种方式都无法获得正确的 KL。
我错过了什么?
【问题讨论】:
标签: python gamma-distribution gamma gamma-function