如何使用他们的兴趣找到类似的用户

时间:2010-07-11 19:43:58

标签: sql algorithm similarity nearest-neighbor

我正在尝试创建一个能够找到类似喜欢的电影/书籍/兴趣等用户的系统,就像last.fm上的邻居一样。共享最大共同兴趣的用户将获得最高匹配,并将显示在用户个人资料中(5个最佳匹配项)。

有任何合理的快速方式这样做吗?显而易见的解决方案是创建一个包含用户ID和兴趣ID的表,并将用户与所有其他用户进行比较,但这将永远存在于一个表上,其中包含数百万用户,每个用户有20个兴趣。

我认为存在一些有效的解决方案,因为last.fm工作得很好。我更喜欢使用一些常见的SQL数据库,如mySQL或pgSQL,但任何事情都可以。

感谢您的建议。


更新:
事实证明,最大的问题是找到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-50毫秒,每个用户平均拥有约20个利益(10万个可能的利益)

1 个答案:

答案 0 :(得分: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。