gpt4 book ai didi

python - 计算两个 Gamma 分布列表之间的 KL 散度

转载 作者:太空宇宙 更新时间:2023-11-03 20:33:13 27 4
gpt4 key购买 nike

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

  • 实际人口分布 = [0.2,0.3,0.3,0.2]
  • sample_population_distribution = [0.1,0.4,0.2,0.3]

我希望将这两个列表拟合到 Gamma 分布,然后计算返回的两个列表以获得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, moment = 'mvsk')”,我将得到一个KL值方式大于1,所以这两种方法都无法获得正确的KL。

我错过了什么?

最佳答案

请参阅此堆栈溢出帖子: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)]

看起来您并不适合 Gamma 分布,看起来您正在使用矩量估计器的方法来获取 Gamma 分布的参数,然后为您的每个元素绘制一个随机数actual(sample)_population_distribution 列出了给定列表的分布统计信息。

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

我也不知道你想用 kl 背离做什么。您的实际总体已标准化为 1,样本分布也是如此。您可以将这些元素直接插入到 KL 散度中以获得离散分数 - 您对代码所做的就是使用定义的 Gamma 函数将 Gamma 噪声拉伸(stretch)并添加到原始列表值中。对原始总体数据进行 Gamma 损坏后,您的 KL 散度更有可能出现较大偏差。

抱歉,我只是不明白您想在这里实现什么目标。如果我猜你的初衷,我会说你的问题是你需要数百个数据点来保证与任何 Gamma 拟合程序的收敛。

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

关于python - 计算两个 Gamma 分布列表之间的 KL 散度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57351224/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com