我有两个清单。两者都包括标准化百分比:
- 实际人口分布 = [0.2,0.3,0.3,0.2]
- sample_population_distribution = [0.1,0.4,0.2,0.3]
我希望将这两个列表适合伽马分布,然后计算返回的两个列表以获得 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。
我想念什么?