如何在python中找到用户的偏好向量和项目描述表(大小不同的矩阵)之间的相似距离?

Posted

技术标签:

【中文标题】如何在python中找到用户的偏好向量和项目描述表(大小不同的矩阵)之间的相似距离?【英文标题】:How to find similarity distance between user's preference vector and items description table (matrices that are not the same size) in python? 【发布时间】:2020-11-17 17:44:38 【问题描述】:

我有两个不同的数据集:

users's "taste" table:

+-------+---------+--------+---------+---------+-----+--
|user_id|  Action |Adventure|Animation|Children|Drama|
+-------+---------+---------+---------+--------+-----+--
|   100 |    0    |    1    |    2    |   1    |  0  |
|   101 |    1    |    4    |    0    |   3    |  0  |
+-------+---------+---------+---------+--------+-----+--

movie's genre table:

+--------+---------+---- ----+---------+---------+-----+--
|movie_id|  Action |Adventure|Animation| Children|Drama|
+--------+---------+---- ----+---------+---------+-----+--
|   1001 |    0    |    1    |    1    |    1    |  0  |
|   1001 |    0    |    1    |    0    |    1    |  0  |
+--------+---------+---------+---------+---------+-----+--

我正在尝试根据用户的口味向用户推荐最相似的 N 部电影。我的想法是测量用户和每部电影之间的相似度距离(余弦相似度/点积)并返回前 N 个最相似的电影。在python中实现它的正确方法是什么?

【问题讨论】:

【参考方案1】:

这是一个简单的问题,但根据距离类型和数据大小,答案可能很复杂。我先给你一些钩子。

Sklearn 实现了distance metrics,您可以立即使用它来计算项目之间的距离,例如在 argmax 的帮助下找到最佳匹配。这将是一种幼稚的方法,但在小型数据集上效果很好,并且您可以灵活地使用任何您想要的指标。 距离已实现pairwise,可轻松计算距离矩阵以快速找到最佳匹配。但是你可以想象,对于更大的数据集,这种策略将不再适用。

当数据增长时,您可以使用BallTree 算法快速找到 (1) k-最近的,或 (2) 特定阈值内的所有电影。该算法在sklearn 中实现得很好,我建议从这种方法开始,因为它在快速和易于实现之间取得了很好的平衡。

其他选项是使用专门的包,如faiss 或ann。两者都只会在上述数据的速度/大小失败时使用。

【讨论】:

以上是关于如何在python中找到用户的偏好向量和项目描述表(大小不同的矩阵)之间的相似距离?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 中找到正确的向量/数组相似度?

中断向量表的作用是啥?如何设置中断向量表

如何在python中找到字符串向量之间的所有组合[重复]

存储来自多个查找表的用户配置文件数据。如何?

如何在与用户给定前缀匹配的字符串向量中找到第一个单词?

如何将 Excel 工作表上传到 Lightswitch Web 客户端中的 SQL 表?