测量两个分布之间的差异

Sum*_*ift 3 statistics distribution

我有一个示例程序的距离向量。我试图量化它们的相似程度。我在样本组之间使用欧几里得距离(每个值属于一个桶,我们逐桶比较),效果很好。但是需要对大量样本进行太多比较。

我想知道是否有一种有效的方法来构建索引来比较样本。样品看起来像这样——

Sample:1 = {25 0 17 3 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0}
Sample:2 = {25 1 16 2 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0}
Sample:3 = {25 3 16 2 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0}
Run Code Online (Sandbox Code Playgroud)

Mau*_*ers 8

有很多方法可以表征“两个分布之间的差异”。一个特定的和有针对性的答案需要更多的细节,例如潜在的概率分布。

这完全取决于您如何定义两个分布之间的差异。给你两个思路:

  1. Kolmogorov-Smirnov检验是一种非参数检验,其测量两个累积/经验分布函数之间的“距离”。
  2. 相对熵措施信息论的语言中熵的变化两个分布之间的“距离”。

更新[一年后]

重温这篇文章时,强调以下几点可能很重要:

  1. 标准的双样本 Kolmogorov-Smirnov (KS) 检验假设基础分布是连续的。对于离散数据(原始帖子中的数据似乎是),替代方法可能是使用双样本 KS 测试的引导程序版本,如Matching::ks.boot. 更多细节可以在例如交叉验证中找到我可以使用 Kolmogorov-Smirnov 来比较两个经验分布吗?以及在维基百科上:双样本 Kolmogorov-Smirnov 检验
  2. 如果原始帖子中的样本数据具有代表性,我认为基于 KS 统计的测试或 KL 散度(或任何其他与此相关的测试)都不会给出非常有意义的答案。原因是每个样本的值基本上都为零(准确地说,> 80% 的值为零)。这与每个样本 21 个值的小样本量相结合意味着实际上没有多少“剩余”来表征任何潜在分布。
  3. 用更一般的术语(并忽略上一点中指出的限制),要计算所有成对组合的 KL 散度,可以执行以下操作

    library(entropy)
    library(tidyverse)
    expand.grid(1:length(lst), 1:length(lst)) %>%
        rowwise() %>%
        mutate(KL = KL.empirical(lst[[Var1]], lst[[Var2]]))
    
    Run Code Online (Sandbox Code Playgroud)

    由于 KL 散度不是对称的,我们需要计算成对 KL 散度矩阵的上三角下三角部分。为了减少计算时间,可以改用对称 KL 散度,这需要仅计算成对 KL 散度矩阵的上三角部分下三角部分的 KL 散度(尽管对称 KL 散度版本本身需要计算两个 KL分歧,即KL(1->2)KL(2->1)但这可以通过优化的例程来完成)。