【问题标题】:Calculate KL Divergence between two gamma distribution list计算两个 gamma 分布列表之间的 KL Divergence
【发布时间】: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


    【解决方案1】:

    查看此堆栈溢出帖子: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 噪声。在原始人口数据的 gamma 损坏后,您更有可能与 KL 散度有更大的偏差。

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

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

    【讨论】:

    • 谢谢佩德罗。是否可以为广义分布的解析解提供 Python 代码?这篇论文对我来说很难。
    • 可能。有人在堆栈上写了两个参数 gamma 分布的 KL 散度方程:stats.stackexchange.com/questions/11646/…。你只需要把方程编码成一个函数,然后输入你估计的超参数来得到你的 KL 散度。
    猜你喜欢
    • 2014-11-22
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 2011-12-18
    • 2018-12-16
    相关资源
    最近更新 更多