计算两个伽玛分布列表之间的KL散度

时间:2019-08-05 01:07:51

标签: python gamma-distribution gamma gamma-function

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

  • actual_population_distribution = [0.2,0.3,0.3,0.2]
  • sample_population_distribution = [0.1,0.4,0.2,0.3]

我希望使这两个列表适合伽玛分布,然后计算返回的两个列表以获得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')”,我将得到一个大于1的KL值,因此这两种方法都无法获得正确的KL。

我想念什么?

1 个答案:

答案 0 :(得分:0)

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

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

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

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

很抱歉,我只是看不到您要完成的任务。如果我猜到您的初衷,那就是您的问题是您需要数百个数据点来保证与任何伽玛拟合程序的融合。

编辑:我只是想补充一下有关KL分歧的内容。如果您打算用KL散度对适合的伽玛分布进行评分,最好使用分析解决方案,其中两个伽玛分布的比例和形状参数是您的两个输入。除非对100,000个随机样本进行采样并将其直方图划分为1,000个左右,然后对直方图进行归一化,否则随机采样嘈杂的数据点将无济于事-我只是将这些数字舍弃掉,但您将想要近似一个连续的分布尽可能地好,这将是困难的,因为伽马分布的尾巴很长。本文档提供了针对通用分布的解析解决方案:https://arxiv.org/pdf/1401.6853.pdf。只需将第三个参数设置为1并进行简化,然后编写函数即可。

相关问题