我正在寻找技术来为我正在工作的网站上的用户生成“邻居”(品味相似的人);类似于last.fm的工作方式。
目前,我有一个可以发挥作用的用户兼容功能。它对用户进行排名1)评级相似的项目2)同样评价该项目。如果在生成“邻居”时我不得不仅使用其中一个因素,那么这个函数会更加重要,这将是最重要的。
我的一个想法就是只计算每个用户组合的兼容性,并选择评价最高的用户作为用户的邻居。这样做的缺点是,随着用户数量的增加,这个过程需要花费很长时间。对于1000个用户,它需要1000C2(0.5 * 1000 * 999 = = 499 500)调用兼容性功能,这在服务器上也可能非常繁重。
所以我正在寻找任何建议,文章链接以及如何最好地实现这样的系统。
答案 0 :(得分:6)
在“集体智慧编程”一书中
http://oreilly.com/catalog/9780596529321
第2章“制作建议”非常好地概述了根据用户之间的相似性向人们推荐项目的方法。您可以使用相似性算法来查找您要查找的“邻居”。这一章可在谷歌图书搜索中找到:
http://books.google.com/books?id=fEsZ3Ey-Hq4C&printsec=frontcover
答案 1 :(得分:1)
请务必查看Collaborative Filtering。许多推荐系统使用协同过滤来向用户建议项目。他们通过找到“邻居”然后建议你的邻居评价很高但你没有评价的项目来做到这一点。你可以找到邻居,谁知道,也许你将来会想要推荐。
GroupLens是明尼苏达大学的研究实验室,研究协同过滤技术。他们有大量已发表的研究以及一些样本数据集。
Netflix Prize是确定谁能最有效地解决此类问题的竞赛。关注他们LeaderBoard的链接。一些竞争对手分享他们的解决方案。
就计算成本低廉的解决方案而言,您可以尝试这样做:
这种方法不够准确,但速度很快。
干杯。
答案 2 :(得分:1)
您需要的是一种群集算法,它会自动将类似用户组合在一起。您面临的第一个难点是大多数聚类算法都希望它们聚类的项目在欧几里德空间中表示为点。在您的情况下,您没有点的坐标。相反,您可以计算它们之间的“相似性”函数的值。
这里有一个很好的可能性就是使用spectral clustering,它恰好需要你拥有的东西:一个相似性矩阵。缺点是你仍然需要计算每对点的兼容性函数,i。即算法是O(n ^ 2)。
如果您绝对需要比O(n ^ 2)更快的算法,那么您可以尝试一种名为dissimilarity spaces的方法。这个想法非常简单。您可以反转兼容性功能(例如,通过取其倒数)将其转换为相异度或距离的度量。然后将每个项目(在您的情况下为用户)与一组原型项进行比较,并将得到的距离视为空间中的坐标。例如,如果你有100个原型,那么每个用户将由100个元素的向量表示,i。即通过100维空间中的一点。然后,您可以使用任何标准聚类算法,例如K-means。
现在的问题是你如何选择原型,以及你需要多少原型。已经尝试了各种启发式方法,但是,这里有一个dissertation,它认为随机选择原型可能就足够了。它显示了使用100或200个随机选择的原型产生良好结果的实验。在您的情况下,如果您有1000个用户,并且您选择其中200个作为原型,那么您需要评估您的兼容性功能200,000次,这比每对的性能提高了2.5倍。但真正的优势在于,对于1,000,000个用户来说200个原型仍然是足够的,你需要进行200,000,000个比较,而不是500,000,000,000个因子2500的改进。你得到的是O(n)算法,这是尽管有一个很大的常数因子,但优于O(n ^ 2)。
答案 3 :(得分:0)
问题似乎是“分类问题”。是的,有很多解决方案和方法。
开始探索检查: http://en.wikipedia.org/wiki/Statistical_classification
答案 4 :(得分:0)
您听说过kohonen networks吗?
它是一种自组织学习算法,可将类似的变量聚类成类似的插槽。虽然大多数网站都像我链接到的网站将网络显示为二维,但很少涉及将算法扩展到多维超立方体。
使用这样的数据结构查找和存储具有相似品味的邻居是微不足道的,因为类似的用户应该存储到类似的位置(几乎像反向哈希码)。
这可以将您的问题转化为找到定义相似性的变量并确定可能的枚举值之间的距离,例如经典和声音接近于死亡金属和雷鬼的距离(至少在我的意见中)< / p>
顺便说一句,为了找到好的分割变量,最好的算法是decision tree。靠近根的节点将是建立“亲密度”的最重要的变量。
答案 5 :(得分:0)
看起来你需要阅读clustering algorithms。一般的想法是,每次将它们分成相似点的簇时,不要将每个点与每个其他点进行比较。然后邻域可以是同一群集中的所有点。簇的数量/大小通常是聚类算法的参数。
你可以在Google的系列中找到关于video about clustering的cluster computing and mapreduce。
答案 6 :(得分:0)
如果您将此视为构建/批处理问题而非实时查询,则可以大大减轻对性能的担忧。
图表可以静态计算然后潜在更新,例如每小时,每天等,然后生成针对运行时查询优化的边和存储,例如每个用户排名前10位的类似用户。
+1编程集体智能 - 它非常有用 - 希望它不是(或者我是!)以面向Python的方式,但仍然很好。