R语言 如何计算雅卡德相似度
雅卡德相似性 也被称为雅卡德指数或雅卡德系数,是一种表示数据样本之间相似性的简单措施。相似性被计算为数据样本内的交集长度与数据样本的联合长度之比。
它被表示为 –
J(A, B) = |A Ո B| / |A U B|
它是用来寻找两个二进制向量或数字向量或字符串之间的相似性或重叠。它可以表示为J。还有一个与Jaccard相似性密切相关的术语,叫做Jaccard异质性或Jaccard距离。雅卡德距离是对数据样本之间的不相似性的测量,可以表示为(1-J),其中J是雅卡德相似度。
雅卡德相似性的常见应用
雅卡德相似度被用于多种数据科学和机器学习应用中。在现实生活中经常遇到的一些用例包括:
- 文本挖掘: 根据两个文本文件中使用的术语数量,找到两个文本文件之间的相似性。
- 电子商务: 通过他们的购买历史从成千上万的客户和数以百万计的商品的销售数据库中找到类似的客户。
- 推荐系统: 根据评级和评论寻找相似的客户,例如,电影推荐算法、产品推荐、饮食推荐、婚姻推荐等。
雅卡德相似度公式和概念
雅卡德相似度的范围是0到1,数字越大,数据集之间的相似度就越高。虽然它很容易解释,但对较小的样本数据集极为敏感,并可能给出错误的结果,因此人们在理解结果时需要谨慎。
数字集的雅卡德相似度
雅卡德相似度(J)=(两组中共同元素的数量)/(第一组中元素的数量+第二组中元素的数量-两组中共同元素的数量)。
其中(第一组的元素数+第二组的元素数-两组中的共同元素数)=两组中总的独特元素数。
考虑到A和B是两个集合,它可以用符号形式表示为
J(A, B) = |A Ո B| / |A U B| = |A Ո B| / |A| + |B| - |A Ո B|
例子 。
在这个例子中,我们将考虑A和B分别是两个集合,其中集合A={5,10,15,20,25,30,35,40,45,50},集合B={10,20,30,40,50,60,70,80,90,100},AՈB={10,20,30,40,50 },即。|A Ո B| = 5,A U B = {5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 60, 70, 80, 90, 100 } 即 |A U B| = 15,因此,J(A, B) = |A Ո B| / |A U B| = 5 / 15 = 0.33333 并用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
输出
二元组的雅卡德相似度
考虑到A和B是两个二进制向量。
雅卡德相似度(J)=(两个向量中都是1的观察数)/(两个向量中都是1的观察数+A为0、B为1的观察数+A为1、B为0的观察数)
符号形式为
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表示这两个顾客没有购买过该产品。
客户 | 产品1 | 产品2 | 产品3 | 产品4 | 产品5 | 产品6 | 产品7 | 产品8 | 产品9 | 产品10 |
---|---|---|---|---|---|---|---|---|---|---|
客户1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 |
客户2 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
# 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
输出
有字符串的集合的雅卡德相似度
雅卡德相似度(J)=(两个集合中出现的匹配字符串的数量)/(其中一个集合中的字符串数量)。
考虑到A和B是两个集合,它可以用符号形式表示为
J(A, B) = |A Ո B| / |A U B|
例子:
让A和B是两组字符串,其中
集A = { ‘约翰’, ‘是’, ‘去’, ‘到’, ‘市场’, ‘今天’, ‘到’, ‘买’, ‘蛋糕’}和
设置B = {‘Tim’, ‘is’, ‘at’, ‘the’, ‘shop’, ‘already’, ‘for’, ‘buying’, ‘two’, ‘cakes’}
找到这两个集合之间的Jaccard相似度。
# 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
输出