如何在 r 中创建相似度矩阵?

Posted

技术标签:

【中文标题】如何在 r 中创建相似度矩阵?【英文标题】:How do I create similarity matrices in r? 【发布时间】:2022-01-12 07:11:47 【问题描述】:

我有一个矩阵,其中的行是立法者,列是问题,以及指示立法者如何对给定问题进行投票的值(0 - 缺席,1 - 支持,2 - 反对)。我需要为每个问题创建一个相似性矩阵(如果两位立法者都出席投票,他们是否以相同的方式投票)。在 r 中是否有不使用嵌套 for 循环的快速方法?

这是矩阵的样子:

    I1 I2 I3 I4
L1   1  1  1  2
L2   1  1  0  0
L3   2  2  2  2
L4   2  2  0  0

这是我想为第一期获得的内容:

   L1 L2 L3 L4
L1     1  0  0
L2  1     0  0
L3  0  0     1
L4  0  0  1

【问题讨论】:

【参考方案1】:

你可以试试

func <- function(a, b) ifelse(a==b & a*b != 0, 1, 0)

lapply(dummy, function(x) 
  res <-outer(x, x, func)
  diag(res) <- NA
  colnames(res) = rownames(res) = c("L1", "L2", "L3", "L4")
  res
  )


$I1
   L1 L2 L3 L4
L1 NA  1  0  0
L2  1 NA  0  0
L3  0  0 NA  1
L4  0  0  1 NA

$I2
   L1 L2 L3 L4
L1 NA  1  0  0
L2  1 NA  0  0
L3  0  0 NA  1
L4  0  0  1 NA

$I3
   L1 L2 L3 L4
L1 NA  0  0  0
L2  0 NA  0  0
L3  0  0 NA  0
L4  0  0  0 NA

$I4
   L1 L2 L3 L4
L1 NA  0  1  0
L2  0 NA  0  0
L3  1  0 NA  0
L4  0  0  0 NA

数据

dummy <- read.table(text = "    I1 I2 I3 I4
   1  1  1  2
   1  1  0  0
   2  2  2  2
   2  2  0  0", header = T)
rownames(dummy) <- c("L1", "L2", "L3", "L4")

   I1 I2 I3 I4
L1  1  1  1  2
L2  1  1  0  0
L3  2  2  2  2
L4  2  2  0  0

【讨论】:

这与预期的输出不相似 @Onyambu 有问题的预期输出是$I1。我想我错过了行/列名。 您能指定虚拟对象吗? @snitsova 这是你的矩阵。我在上面添加代码。 @Park 我明白了。虚拟对象的类是一个数据框。谢谢!

以上是关于如何在 r 中创建相似度矩阵?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中创建聚类图?

如何使用已计算的 TFIDF 分数计算余弦相似度

余弦相似度计算

如何衡量两个“任意数据集”间的相似度?

如何计算两个文档的相似度

具有numpy的大型稀疏矩阵的余弦相似度