超过 2 个变量的相似性度量

机器算法验证 r 二进制数据 距离 相似之处 杰卡相似度
2022-04-04 15:54:56

如果我有两个二元变量,我可以用不同的相似性度量很容易地确定这些变量的相似性,例如使用 Jaccard 相似性度量:

J=M11M01+M10+M11

示例R

# Example data
N <- 1000
x1 <- rbinom(N, 1, 0.5)
x2 <- rbinom(N, 1, 0.5)

# Jaccard similarity measure
a <- sum(x1 == 1 & x2 == 1)
b <- sum(x1 == 1 & x2 == 0)
c <- sum(x1 == 0 & x2 == 1)

jacc <- a / (a + b + c)
jacc

但是,我有一组 1.000 个二进制变量,想确定整个组的相似性。

问题:确定两个以上二元变量相似度的最佳方法是什么?

一种想法是测量每个成对组合的相似性,然后取平均值。您可以在下面找到此过程的示例:

# Example data
N <- 1000 # Observations
N_vec <- 1000 # Amount of vectors
x <- rbinom(N * N_vec, 1, 0.5)
mat_x <- matrix(x, ncol = N_vec)
list_x <- split(mat_x, rep(1:ncol(mat_x), each = nrow(mat_x)))

# Function for calculation of Jaccard similarity
fun_jacc <- function(v1, v2) {

  a <- sum(v1 == 1 & v2 == 1)
  b <- sum(v1 == 1 & v2 == 0)
  c <- sum(v1 == 0 & v2 == 1)

  jacc <- a / (a + b + c)
  return(jacc)
}

# Apply function to all combinations (takes approx. 1 min to calculate)
mat_jacc <- sapply(list_x, function(x) sapply(list_x, function(y) fun_jacc(x,y)))
mat_jacc[upper.tri(mat_jacc)] <- NA
diag(mat_jacc) <- NA
vec_jacc <- as.vector(mat_jacc)
vec_jacc <- vec_jacc[!is.na(vec_jacc)]
median(vec_jacc)

虽然这是非常低效的,我也不确定这在理论上是否是衡量此类变量相似性的最佳方法。

更新:根据 user43849 的建议,可以使用 Sorensen 的多站点相异性来计算相异性:

# Example data
N <- 1000 # Observations
N_vec <- 1000 # Amount of vectors
x <- rbinom(N * N_vec, 1, 0.5)
mat_x <- matrix(x, ncol = N_vec)

# Multiple-site dissimilarity according to Sorensen
library("betapart")
beta.multi(t(mat_x), index.family = "sor")$beta.SOR # Vectors are not similar --> almost 1
3个回答

这个答案将大量借鉴生态文献,其中 Jaccard 和其他(不)相似性度量通常用于量化不同地点物种组合之间的组成(不)相似性。最好的参考文献是Baselga (2013) Multiple site dissimilarity quantifies composition heterogeneity between several sites,而平均成对差异可能会产生误导可在此处免费获得

基本上,有几种方法可以量化高阶差异(比成对高阶)。一种是对样本中所有对的成对差异进行平均。由于各种原因,该指标通常表现不佳,Baselga (2013)中有详细说明。另一种可能性是找到从观察到多元质心的平均距离。

索伦森指数明确概括为两个以上的观察。回想一下,索伦森指数是2aba+b其中 a 是样本 A 中的物种数(在您的情况下是物种数),b 是样本 B 中的物种数,ab 是样本 A 和 B 共享的物种数(即点积)。Diserud 和 Odegaard (2007) 提出并由 Chao 等人 (2012) 讨论的三点概括是32ab+ac+bcabca+b+c. 参阅 Diserud 和 Odegaard (2007),了解该指标背后的动机以及扩展N>3. Baselga (2013)中的参考资料还将指向 Simpson 指数的多站点泛化,以及用于计算多站点 Sorensen 和 Simpson 指标的 R 包。

一些研究人员还发现检查人类共享的物种的平均数量很有用。i网站,在哪里i范围从2N. 这揭示了一些有趣的缩放属性,并结合了不同值的各种概念i. 此处的主要参考资料是 Hui 和 McGeoch (2014) ,可在此处免费获得本文还有一个相关的 R 包,称为“zetadiv”。

一个可能的方向是将问题表示为图形。变量将是节点,边缘将具有足够强的成对相关性。

您可以根据图表定义许多相关性度量,您应该找到最适合您的那个。在最常见的图关联中,图越密集,关联度越高。

可能的措施可能是:

  • 具有和边缘的节点(变量)的数量(或比率)(与某些变量有很强的相关性)。它很容易计算并为您提供自变量的数量。该指标的一个变体是仅选择具有至少几条边的节点。
  • 边数。该指标赋予相关性数量更高的权重,但可能会给具有许多未连接变量的图高分。
  • 连通分量的数量(或比率)。这个度量有点复杂,但它更好地捕捉了我们常见的定义 os 相似性。如果一个变量连接到一组变量,它们往往表现为一个单一的单元,而不管变量的数量是多少。您可以使用 dbscan 来获取图形结构,但其他图形算法也可能满足您的需求。

相似性总是在两个项目之间。然后可以通过首先为两个项目创建单个表示然后找到它与第三个项目的相似性来将其扩展到更多(比如三个)项目。representation因此,当您有 1000 个项目时,您可以询问任何给定向量与这 1000 个向量的相似或多远的问题。representation可以是这 1000 个向量的平均值,也可以是任何基于您如何定义的向量。