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