计算布尔数据的相似度

数据挖掘 推荐系统 相似
2022-03-09 08:47:12

我正在尝试实现简单的推荐系统,并且我正在尝试了解实现目标的不同方法。

我的数据集包含用户和他们购买的商品。我有关于用户购买了哪些物品的信息以及这些物品的标题形式的描述。

起初我虽然可以使用基于用户的协同过滤方法,但我被困在了这个问题上。我不太确定如何计算布尔数据的相似性。

例如,当我有这样的数据时

   1  2  3  4
A  0  1  0  1
B  0  1  0  1
C  1  0  1  1
D  0  1  0  0
E  0  0  1  1

我想为用户E推荐项目,那么在这种情况下我应该如何计算相似度?例如,我从 python 中的 scikit learn 模块中选择了余弦相似度。但我不太确定应该将什么视为输入。根据我的阅读,它应该只是计算相似度的两个用户共有的项目向量。

例如,如果我想计算用户EC之间的相似性,我的输入应该是什么?因为如果我只输入它们共同的值,那是没有意义的,对吧?因为输入将是 [1, 1] 和 [1, 1] 并且相似度为 1。

然后我尝试像这样输入整个向量:

from sklearn.metrics.pairwise import cosine_similarity
from numpy import array, reshape

c = array([1, 0, 1, 1])
e = array([0, 0, 1, 1])

result = cosine_similarity(c.reshape(1, -1), e.reshape(1, -1))

>>> result is 0.81649658

我认为这种方法更有意义,但根据我对此类推荐的了解,我不确定它是否可以接受。

1个回答

您应该查看Jaccard Index,它是项目集之间事实上的相似性,其中集合使用布尔向量表示。在这个布尔向量中,每个坐标代表一个项目,1 表示该项目存在,否则为 0。例如:对于香蕉、橙子和苹果的项目宇宙。设置的香蕉,橙色将由 (1, 1, 0) 表示。Jaccard Index 是集合与集合的交集,因此对于集合 (1, 1),它的值为 1。

余弦相似度适用于实值向量,但余弦相似度是否优于 Jaccard 索引,反之亦然,取决于应用。您应该对您的数据进行测试并验证哪个更好,有关讨论,请参阅此问题