У меня есть два списка. Оба включают нормализованные проценты:
- фактическое_население_распределение = [0,2,0,3,0,3,0,2]
- sample_population_distribution = [0,1,0,4,0,2,0,3]
Я хочу подогнать эти два списка к гамма-распределению, а затем вычислить возвращенные два списка, чтобы получить значение KL.
Я уже смог получить KL.
Это функция, которую я использовал для расчета гаммы:
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)
Подгонка двух списков к гамма-распределению:
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))
Приведенный выше код не выдает никаких ошибок.
Но я подозреваю, что то, что я сделал для гаммы, неверно, потому что 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')
», я получу значение KL намного больше 1, поэтому оба способа недействительны для получения правильного KL.
Что мне не хватает?