首页 > 解决方案 > 计算两个 gamma 分布列表之间的 KL Divergence

问题描述

我有两个清单。两者都包括标准化百分比:

我希望将这两个列表适合伽马分布,然后计算返回的两个列表以获得 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。

我想念什么?

标签: pythongamma-distributiongammagamma-function

解决方案


请参阅此堆栈溢出帖子: https ://stats.stackexchange.com/questions/280459/estimating-gamma-distribution-parameters-using-sample-mean-and-std

我不明白您要做什么:

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)]

看起来您不适合伽马分布,看起来您正在使用矩量法估计器来获取伽马分布的参数,然后为实际的每个元素绘制一个随机数(样本)_population_distribution 列表给定列表的分布统计信息。

众所周知,伽马分布很难拟合。我希望您的实际数据有更长的列表——4 个数据点不足以估计两个参数的分布。在您获得数百个或更多元素之前,估计值是一种垃圾,请查看有关 MLE 估计器的此文档以获取伽马分布的 Fisher 信息: https ://www.math.arizona.edu/~jwatkins/O3_mle .pdf

我也不知道您要如何处理 kl 散度。您的实际总体已经标准化为 1,样本分布也是如此。您可以将这些元素直接插入到 KL 散度中以获得离散分数——您对代码所做的是使用定义的 gamma 函数在原始列表值中拉伸和添加 gamma 噪声。在原始人口数据的伽马损坏后,您更有可能与 KL 散度有更大的偏差。

对不起,我只是看不到你在这里想要完成什么。如果我猜测你的初衷,我会说你的问题是你需要数百个数据点来保证与任何伽马拟合程序的收敛。

编辑:我只是想补充一下关于 KL 分歧的内容。如果您打算使用 KL 散度对拟合 gamma 分布进行评分,最好使用分析解决方案,其中两个 gamma 分布的比例和形状参数是您的两个输入。除非您抽取 100,000 个随机样本并将它们直方图放入 1,000 个左右的 bin 中,然后标准化您的直方图,否则随机采样噪声数据点不会有帮助 - 我只是将这些数字扔掉,但您会想要近似一个连续的尽可能最好地分布,这会很困难,因为伽马分布有长尾。本文档具有广义分布的分析解决方案: https ://arxiv.org/pdf/1401.6853.pdf. 只需将第三个参数设置为 1 并简化,然后编写一个函数。


推荐阅读