statistics - 衡量两个分布之间的差异

标签 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}

最佳答案

有许多方法可以表征“两个分布之间的差异”。具体和有针对性的答案需要有关例如的更多详细信息。潜在的概率分布。

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

  1. 一个 Kolmogorov-Smirnov test是一种非参数检验,用于测量两个累积/经验分布函数之间的“距离”。
  2. Kullback-Leibler divergence用信息论的语言将两个分布之间的“距离”测量为熵的变化。

[一年后]更新

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

  1. 标准的两样本 Kolmogorov-Smirnov (KS) 检验假设基础分布是连续的。对于离散数据(来自原始帖子的数据似乎是),另一种方法可能是使用两个样本 KS 测试的引导版本,如 Matching::ks。启动。更多细节可以在例如找到Cross Validated: Can I use Kolmogorov-Smirnov to compare two empirical distributions?Wikipedia: Two-sample Kolmogorov–Smirnov test .
  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]]))
    

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

关于statistics - 衡量两个分布之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52471839/

相关文章:

linux - 如何为 Linux 制作 Qt 应用程序的二进制分发

c++ - 高效的 boost 分配使用

python - 如何使用库函数 scipy.stats.binom.pmf 返回给定概率的二项分布中的试验次数 (n)?

perl - 如何在 Perl 中将 z 分数转换为百分比

matlab - 使用 VPA 评估微小概率

neural-network - "break symmetry"是什么意思?在神经网络编程的背景下?

rpart:分类回归量与连续回归量的计算时间

R:条件期望值

python - Python中的概率分布

python - 将 python 标志 cx_freeze 添加到可执行文件