📜  如何计算R中的Jaccard相似度?

📅  最后修改于: 2022-05-13 01:55:50.250000             🧑  作者: Mango

如何计算R中的Jaccard相似度?

Jaccard Similarity也称为 Jaccard Index 或 Jaccard Coefficient 是表示数据样本之间相似性的简单度量。相似度被计算为数据样本内的交集长度与数据样本的并集长度之比。

它表示为——

J(A, B) =  |A Ո B| / |A U B|

它用于查找两个二进制向量或数字向量或字符串之间的相似性或重叠。它可以表示为 J。还有一个与 Jaccard Similarity 密切相关的术语,称为 Jaccard Dissimilarity 或 Jaccard Distance。 Jaccard 距离是数据样本之间差异的度量,可以表示为 (1 – J),其中 J 是 Jaccard 相似度。

Jaccard相似度的常见应用:

Jaccard Similarity 用于多种数据科学和机器学习应用程序。现实生活中经常遇到的一些用例包括:

  • 文本挖掘:根据两个文档中使用的术语数量来查找两个文本文档之间的相似性。
  • 电子商务:通过他们的购买历史从包含数千名客户和数百万件商品的销售数据库中找到相似的客户。
  • 推荐系统:根据评分和评论找到相似的客户,例如电影推荐算法、产品推荐、饮食推荐、婚姻推荐等。

Jaccard 相似度公式和概念:

Jaccard Similarity 的取值范围为 0 到 1。数字越大,数据集彼此越相似。虽然它很容易解释,但对较小的样本数据集极为敏感,并且可能给出错误的结果,因此在理解结果时需要小心。

数值集的 Jaccard 相似度:

Jaccard 相似度 (J) = ( 两个集合中的共同元素计数) / ( 第一个集合中的元素计数 + 第二个集合中的元素计数 - 两个集合中的共同元素计数)

其中(第一个集合中的元素计数 + 第二个集合中的元素计数 - 两个集合中的公共元素计数)= 两个集合中的唯一元素总数。

将 A 和 B 视为两个集合,它可以用符号形式表示为

J(A, B) =  |A Ո B| / |A U B| = |A Ո B| / |A| + |B| - |A Ո B|

例子:

在此示例中,我们将分别考虑 A 和 B 是两个集合,其中 Set A = { 5, 10, 15, 20, 25, 30, 35,40, 45, 50} 和 Set B = {10, 20, 30 , 40, 50, 60, 70, 80, 90, 100),A Ո B = { 10, 20, 30, 40, 50 } 即 |A Ո B| = 5,AUB = {5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 60, 70, 80, 90, 100 } 即 |AUB| = 15,因此,J(A, B) = |A Ո B| / |AUB| = 5 / 15 = 0.33333 并用 R 编程语言说明。

R
# Set A - numeric vector    
SetA <- c(5,10,15,20,25,30,35,40,45,50)
  
# Set B - numeric vector
SetB <- c(10,20,30,40,50,60,70,80,90,100)
  
# Function for computing Jaccard Similarity
jaccard_similarity <- function(A, B) {
  intersection = length(intersect(A, B))
  union = length(A) + length(B) - intersection
  return (intersection/union)
}
  
# Jaccard Similarity between sets, A and B
Jaccard_Similarity <- jaccard_similarity(SetA,SetB)
Jaccard_Similarity
  
# Jaccard Dissimilarity/Distance between sets, A and B 
Jaccard_Distance = 1 - Jaccard_Similarity
Jaccard_Distance


R
# Install packages qvalue and jaccard and load
# the library
library(qvalue)
library(jaccard)
  
# Binary vectors A and B depicting purchase of 
# items by customers
Binary_A <- c(0,1,0,0,0,1,0,0,1,1)
Binary_B <- c(0,0,1,0,0,0,0,0,1,1)
  
# Computing jaccard similarity between 2 binary 
# vectors A and B
jaccard(Binary_A,Binary_B)
  
# Computing jaccard distance between 2 binary 
# vectors A and B
Jaccard_distance <- 1 - jaccard(Binary_A,Binary_B)
Jaccard_distance


R
# Install package "bayesbio" and load the library
library(bayesbio)
  
# Two strings "String_A" and "String_B" as sets
String_A < - c("John", "is", "going", "to", "the",
               "market", "today", "to", "buy", "cake")
String_B < - c("Tim", "is", "at", "the", "shop",
               "already", "for", "buying", "two", "cakes")
  
# Computing Jaccard similarity between strings word 
# by word
# Note - value 0 denotes complete match and 1 denotes 
# no match as per "stringdist" function
stringdist(String_A, String_B, method='jaccard')
  
# Computing Jaccard similarity between strings overall
jaccardSets(String_A, String_B)
  
# Computing Jaccard distance
jaccard_distance = 1 - jaccardSets(String_A, String_B)
jaccard_distance


输出

二元集的 Jaccard 相似度

将 A 和 B 视为两个二进制向量,

Jaccard 相似度 (J) =(两个向量中均为 1 的观察数)/(两个向量中均为 1 的观察数 + A 为 0 且 B 为 1 的观察数 + 1 的观察数对于 A 和 0 对于 B)

符号形式变为

J(A, B) =  a_11 / (a_11 + b_01 + c_10)

其中 a_11 = 两个向量中的观测值均为 1

  • b_01 = 观测值在 A 中为 0,在 B 向量中为 1
  • c_10 = 观测值在 A 中为 1,在 B 向量中为 0
  • d_00 = 两个向量中的观测值均为 0(计算 Jaccard 相似度不需要)

例子:

考虑一家销售多种产品的杂货店,其中店主有兴趣根据所购买的商品找出两个顾客之间的相似性。这里 1 表示这两个客户已经购买了该产品,0 表示该产品不是这两个客户购买的。

 

Product1

Product2

Product3

Product4

Product5

Product6

Product7

Product8

Product9

Product10

Customer1

0

1

0

0

0

1

0

0

1

1

Customer2

0

0

1

0

0

0

0

0

1

1

R

# Install packages qvalue and jaccard and load
# the library
library(qvalue)
library(jaccard)
  
# Binary vectors A and B depicting purchase of 
# items by customers
Binary_A <- c(0,1,0,0,0,1,0,0,1,1)
Binary_B <- c(0,0,1,0,0,0,0,0,1,1)
  
# Computing jaccard similarity between 2 binary 
# vectors A and B
jaccard(Binary_A,Binary_B)
  
# Computing jaccard distance between 2 binary 
# vectors A and B
Jaccard_distance <- 1 - jaccard(Binary_A,Binary_B)
Jaccard_distance

输出

带字符串的集合的 Jaccard 相似性

Jaccard 相似度 (J) = (两个集合中存在的匹配字符串数) / (任一集合中的字符串数)

将 A 和 B 视为两个集合,它可以用符号形式表示为

J(A, B) =  |A Ո B| / |A U B|

例子 :

设 A 和 B 是两组字符串,其中

设置 A = { 'John', 'is', 'going',' to', 'the', 'market', 'today', 'to', 'buy', 'cake'} 和

Set B = {'Tim', 'is', 'at', 'the',' shop', 'already', 'for', 'buying', 'two', 'cakes'}

求两组之间的 Jaccard 相似度。

R

# Install package "bayesbio" and load the library
library(bayesbio)
  
# Two strings "String_A" and "String_B" as sets
String_A < - c("John", "is", "going", "to", "the",
               "market", "today", "to", "buy", "cake")
String_B < - c("Tim", "is", "at", "the", "shop",
               "already", "for", "buying", "two", "cakes")
  
# Computing Jaccard similarity between strings word 
# by word
# Note - value 0 denotes complete match and 1 denotes 
# no match as per "stringdist" function
stringdist(String_A, String_B, method='jaccard')
  
# Computing Jaccard similarity between strings overall
jaccardSets(String_A, String_B)
  
# Computing Jaccard distance
jaccard_distance = 1 - jaccardSets(String_A, String_B)
jaccard_distance

输出