【发布时间】:2016-06-25 20:43:55
【问题描述】:
标题可能令人困惑 - 我将尝试解释我想要做什么: 我正在学习计算机科学并尝试将一个小型电影推荐器作为我的讲座“数据仓库和数据挖掘”的项目。现在我正在尝试根据他们的电影评分计算 2 个用户的相似度。
class Rating(Model):
def __init__(self, userID, movieID, rating):
...
我覆盖了 Rating 的 __eq__, __ne__ and __hash__,但只考虑了 movieID,以便可以创建一组 2 个用户的 Ratings 来查找他们都已评分的电影。
def similarity(userA, userB):
ratingsA = userA.ratings
ratingsB = userB.ratings
common_ratings = set((ratingsA, ratingsB))
我现在想要的是如下内容: 2 个列表按相同顺序排序,以便计算用户/他们的评分的余弦距离。
[Rating(userID=1, movieID=4, rating=4.7), Rating(user=1, movie=7, rating=9.8)]
[Rating(userID=2, movieID=4, rating=2.0), Rating(user=2, movie=7, rating=6.6)]
我真的不喜欢我的方法,但在过去的几个小时里我找不到更好的方法。
另一种效率较低的方法(我认为?)是这样的:
lA = []
lB = []
for rA in ratingsA:
for rB in ratingsB:
if rA.movieID == rB.movieID:
lA.append(rA)
lB.append(rB)
sim = cos_dist(lA, lB)
这种方法可能会奏效,但我想运行时间会很糟糕,因为大约有 40000 部电影,而 2 个用户评价相同电影的概率非常低......
也许有人有一种有效的方法? 提前谢谢!
【问题讨论】:
-
用户能否多次评价同一部电影?如果不是,您应该在
append值之后立即break,因为所有后续迭代都是无用的。 -
Rating是 SQL 模型吗?因为在这种情况下,最好只使用 SQL 语句来加入表......
标签: python performance set similarity