如何使用用户兴趣找到相似的用户

5
我正在尝试创建一个系统,能够找到与用户拥有类似喜爱电影/书籍/兴趣等的其他用户,就像last.fm上的邻居一样。共享最多兴趣的用户将具有最高匹配度,并在用户资料中显示(如5个最佳匹配)。
有没有任何相对较快的方法来实现这一点?显而易见的解决方案是创建一个包含用户ID和兴趣ID的表格,并将一个用户与所有其他用户进行比较,但在每个拥有20个兴趣的百万用户表格上这将花费很长时间。
我认为一些有效的解决方案存在,因为last.fm运行得非常好。我更喜欢使用像mySQL或pgSQL这样的常见SQL数据库,但任何东西都可以。
感谢您的建议。
更新: 事实证明,在SQL数据库中查找最近邻居是最大的问题,因为没有开源数据库支持这种搜索。 因此,我的解决方案是修改ANN以作为服务运行,并从PHP查询它(例如使用套接字)-即使在内存中拥有数百万用户,每个用户具有7个维度,也不是什么大问题,速度非常快。
对于较小的数据集,另一种解决方案是使用以下简单查询:
SELECT b.user_id, COUNT(1) AS mutual_interests
FROM `users_interests` a JOIN `users_interests` b ON (a.interest_id = b.interest_id)
WHERE a.user_id = 5 AND b.user_id != 5
GROUP BY b.user_id ORDER BY mutual_interests DESC, b.user_id ASC

平均每个用户拥有约20个兴趣(共有10,000种可能的兴趣),当100,000个用户同时在线时,响应时间为20-50毫秒。


这是一个非常难以解决的问题,它会根据您的使用情况而发生很大变化。解决这个问题的最佳方法是通过聚类兴趣来减少问题集。 - Wolph
1个回答

0

您想解决近似最近邻问题。将用户特征编码为某个空间中的向量,然后在该空间中找到近似最近的其他用户。

要使用哪个空间以及使用哪个距离度量可能是根据您的数据实验评估的事项。幸运的是,有一个C++包可以用来解决这个问题,它具有各种指标和算法,以适应您的需求:http://www.cs.umd.edu/~mount/ANN/

编辑:确实,这里的运行时间取决于特征数量。但是,在高维几何中有一个方便的定理,它说如果您在任意高维中有n个点,并且您只关心近似距离,那么您可以将它们投影到O(log n)维度而不会损失精度。请参见此处(http://en.wikipedia.org/wiki/Johnson-Lindenstrauss_lemma)。 (通过将您的点乘以随机+1 / -1值矩阵来执行随机投影)。请注意,例如log(1,000,000)= 6。


谢谢,将编码特征作为一个特殊向量似乎是个好主意。然而,这个ANN库(以及可能的任何C++方法)需要在内存中保存整个用户/兴趣表,这会有点太昂贵了,而且作者声称它只能在“数千到数十万”和“高达20维”的情况下表现良好,但很可能会有成千上万的维度(想象一下有多少电影存在)。 - blade
实际上,你可以将其投影到一个更小的维度来解决这个问题。让我更新我的答案,指向相关的定理。 - Aaron
啊,现在这就解释了这个谜团 :) 还有一个问题 - 添加新的兴趣/维度也需要重建减少的维度,对吧?(至少有时候是这样) - blade
是的,您需要更新投影,并随着添加功能逐渐增加维度。 - Aaron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接