两个项目之间的 Jaccard 相似度

数据挖掘 相似 杰卡德系数
2022-03-11 06:57:59

计算两个用户之间的相似度相当简单。

考虑以下示例:

User A = {7,3,2,4,1}
User B = {4,1,9,7,5}

Products in common = {1,4,7}
Union of products = {1,2,3,4,5,7,9}

Hence the Jaccard similarity: 3/7 = 0.429

但是,我不清楚如何计算两种产品之间的相似度。假设我想计算上一个示例中产品 7 和 1 之间的相似度,如何实现呢?

2个回答

在任何商业环境中,项目相似性的概念都非常不简单。两个用户通常购买相同种类的产品可以认为是相似的,但我们不能说同一用户购买的两件商品相同。

出于推荐目的,有两种不同的项目相似性概念。一种是,如果这两个项目在物理上相似,例如:Blue Reebok ShoesRed Reebok Shoes,另一种是它们是否具有功能依赖关系,例如:Reebok ShoesReebok Socks为了找到物理上相似的项目,可以创建一个定义产品的属性字典,并对这些属性进行 Jaccard 相似性。例如:

Item A = {color: Blue, size: 10, material: Cotton, brand: Reebok}

Item B = {color: Red, size: 10, material: Cotton, brand: Reebok}

因此,集合的交集将是匹配的属性数,即

Intersection(A,B) = {size, material, brand}

Union(A,B) = {color, size, material, brand}

Jaccard Index = 3/4 = 0.75

对于寻找行为相关的项目,通常使用的一个代理是两个项目在同一会话中一起购买的越多,它们对彼此的功能就越依赖,因此更有价值的推荐。对于此设置,可以创建用户在单个会话中购买的产品矩阵。对于m用户和n产品,它将是稀疏m X n矩阵。如果我们明智地阅读相同的矩阵列,那将是在特定会话中购买该项目的一组用户。

因此,

Item A = {Ua, Ub, Uc}

Item B = {Ub, Ud}

Jaccard Index = 1/4 = 0.25

有多种方法可以做到这一点。一种方法是项目-项目协同过滤。假设您有 100 个用户和 100 首歌曲,在这种情况下,这将是一个 [# of users] X 101 [user and song column] 矩阵。此外,每个用户都喜欢了 100 首歌曲中的 x 首

现在,忽略用户列并创建一个 100 x 100 的歌曲矩阵。现在,对于每首歌曲 ie 列,您计算与其他 99 首歌曲的余弦相似度(这将是 song1 的余弦与 n 行和 song2 [n 行] 等等)。最后,对于每首歌曲,您将获得一个相似度值。基本上,很多用户喜欢的歌曲与其他歌曲将具有更大的相似性值。然而,假设听众通常喜欢某种类型的歌曲,用户可能只喜欢 10 首歌曲(类似类型),这样我们就有了来自 n 个其他用户的输入。最后,我们将能够根据 n 个用户的输入计算每首歌曲的相似度。

然后,您可以对每首歌曲的相似度得分进行排序并推荐给用户。

希望这可以帮助!