首页 > 解决方案 > 如何计算R中数据框的jaccard相似度?

问题描述

我正在尝试使用 Jaccard 相似度查找相似的用户。

我想改变原来的df,比如结果df。

结果 df 列值是交集/并集。

例如..

用户 1 和用户 2 的相似度为 1/2。

1/2 = 两个用户共同拥有的项目数/两个用户拥有的项目总数

这样,我想创建一个计算所有用户相似度的结果df。

我该怎么办?

在此处输入图像描述

在此处输入图像描述

标签: rdataframe

解决方案


编写一个函数,计算两个用户共有的项目数除以项目总数。

calc <- function(x, y) {
  sum(x == 'Y' & y == 'Y')/sum(x == 'Y' | y == 'Y')  
}

按行拆分数据并使用outer

tmp <- asplit(df, 1)
outer(tmp, tmp, Vectorize(calc))

#      [,1] [,2] [,3]  [,4] [,5]
#[1,] 1.000  0.5  0.0 0.333  0.4
#[2,] 0.500  1.0  0.0 0.000  0.2
#[3,] 0.000  0.0  1.0 0.000  0.4
#[4,] 0.333  0.0  0.0 1.000  0.4
#[5,] 0.400  0.2  0.4 0.400  1.0

数据

如果您以可重现的格式而不是图像提供数据,那将会很有帮助。

df <- data.frame(item1 = c('Y', 'Y', 'N', 'N', 'Y'), 
                 item2 = c('Y', 'N', 'N', 'Y', 'Y'), 
                 item3 = c('N', 'N', 'Y', 'N', 'Y'), 
                 item4 = c('N', 'N', 'Y', 'N', 'Y'), 
                 item5 = c('N', 'N', 'N', 'Y', 'Y'))

推荐阅读