商品(购买数据)和标准化之间的余弦相似度

数据挖掘 推荐系统 阿帕奇火花 pyspark 余弦距离
2022-02-22 05:31:03

我使用IndexedRowMatrix表示产品的用户购买行为,为了构建产品推荐,我使用余弦相似度来计算产品之间的相似度。PySpark 提供了一个调用columnSimilarities()来执行此操作的函数。

我的问题是,我需要在使用之前对每个产品的向量进行归一化columnSimilarities()吗?我阅读了关于归一化余弦相似度的信息,并了解到余弦相似度已经对向量进行归一化,就好像我们对向量进行归一化一样,那么余弦相似度将只是 2 个向量的点积。参考

此外,这个问题的答案之一余弦相似度与点积作为距离度量表明Sometimes it is desirable to ignore the magnitude, hence cosine similarity is nice, but if magnitude plays a role, dot product would be better as a similarity measure.这意味着余弦相似度和点积不一样。

我对差异感到困惑,什么时候在计算余弦相似度之前使用归一化比较好,什么时候不适合?规范化的不同方法是什么?

有什么帮助吗?

1个回答

我的问题是,在使用 columnSimilarities() 之前是否需要对每个产品的向量进行归一化?

不,您不需要在使用 columnSimilarities() 之前对每个产品的向量进行规范化,因为它已经在操作中执行。我认为您的困惑来自您认为点积和余弦相似度相同的事实。他们不是。 这是余弦相似度

点积只是余弦相似度函数的一个组成部分,表示为“A(点)B”

关于您引用的答案,该解决方案建议使用点积作为余弦相似度的替代方法,因为点积计算不受幅度的影响。点积不使用平均值作为其计算的一部分。

什么时候在计算余弦相似度之前使用归一化比较好,什么时候不适合?

我建议不要在余弦相似度之前使用归一化。但是,如果余弦相似度没有返回所需的结果,您可以考虑其他方法。您可以使用调整后的余弦相似度或点积(如您链接的答案中所引用)。这两项措施都考虑了幅度上的差异。调整后的余弦相似度在计算余弦相似度之前减去均值。点积在计算中不使用平均值。这在您的上下文中很重要。例如,总是给产品打 5 星的用户和总是给产品打 1 星的用户是不等价的。

标准化的不同方法是什么?

有很多方法可以对向量进行归一化。您可以使用 Z-score 标准化、标准 min-max 缩放、l1 或 l2-normalization

更多信息:在计算余弦距离之前是否需要特征归一化