我有一个示例程序的距离向量。我试图量化它们的相似程度。我在样本组之间使用欧几里得距离(每个值属于一个桶,我们逐桶比较),效果很好。但是对于大量样本,需要进行太多比较。
我想知道是否有一种有效的方法来建立索引来比较样本。样本看起来像这样--
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}
最佳答案
有许多方法可以表征“两个分布之间的差异”。具体和有针对性的答案需要有关例如的更多详细信息。潜在的概率分布。
这完全取决于您如何定义两个分布之间的差异。给你两个想法:
- 一个 Kolmogorov-Smirnov test是一种非参数检验,用于测量两个累积/经验分布函数之间的“距离”。
- Kullback-Leibler divergence用信息论的语言将两个分布之间的“距离”测量为熵的变化。
[一年后]更新
在重温这篇文章时,强调几点可能很重要:
- 标准的两样本 Kolmogorov-Smirnov (KS) 检验假设基础分布是连续的。对于离散数据(来自原始帖子的数据似乎是),另一种方法可能是使用两个样本 KS 测试的引导版本,如
Matching::ks。启动
。更多细节可以在例如找到Cross Validated: Can I use Kolmogorov-Smirnov to compare two empirical distributions?和 Wikipedia: Two-sample Kolmogorov–Smirnov test . - 如果原始帖子中的示例数据具有代表性,我认为基于 KS 统计量的测试或 KL 散度(或任何其他与此相关的测试)都不会给出非常有意义的答案。原因是每个样本的值基本上都为零(准确地说,> 80% 的值为零)。这与每个样本 21 个值的小样本量相结合意味着实际上没有太多“剩余”来表征任何潜在的分布。
用更一般的术语(并忽略上一点指出的限制),要计算所有成对组合的 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/