根据评分为用户生成"邻居"
我正在寻找一种技术来在我正在工作的网站上为用户生成"邻居"(具有相似品味的人)。类似于last.fm的工作方式。
目前,我对用户具有兼容性功能,可以发挥作用。它对1)对相似项目进行评分2)对项目进行相似评分的用户排名。该函数的权重为2点,如果我在生成"邻居"时仅使用这些因素之一,则这将是最重要的。
我曾经想过的一个想法是,仅计算每个用户组合的兼容性,然后选择评分最高的用户作为该用户的邻居。不利的一面是,随着用户数量的增加,此过程将花费很长时间。对于仅1000个用户,它需要对兼容性函数的1000C2(0.5 * 1000 * 999 = = 499 500)调用,这在服务器上也可能非常繁重。
因此,我正在寻找有关如何最好地实现这样的系统的任何建议,文章链接等。
解决方案
问题似乎是"分类问题"。是的,有很多解决方案和方法。
要开始探索,请检查以下内容:
http://en.wikipedia.org/wiki/Statistical_classification
在《编程集体智慧》一书中
http://oreilly.com/catalog/9780596529321
第2章"提出建议"在根据用户之间的相似性概述向人们推荐项目的方法方面做得非常好。我们可以使用相似性算法来查找所需的"邻居"。本章可在Google图书搜索中找到:
http://books.google.com/books?id=fEsZ3Ey-Hq4C&printsec=frontcover
我们听说过kohonen网络吗?
它是一种自组织学习算法,可将相似的变量聚类到相似的位置。尽管大多数站点(如我链接到的站点)将网络显示为二维,但将算法扩展为多维超立方体的工作很少。
有了这样的数据结构,查找和存储具有相似品味的邻居就变得微不足道了,因为应该将相似的用户存储在相似的位置(几乎像反向哈希码)。
这将问题简化为寻找将定义相似性的变量并在可能的枚举值之间建立距离的问题之一,例如古典与声学之间的距离非常近,而死亡金属与雷鬼声则相距甚远(至少在我看来如此)
顺便说一句,为了找到良好的除法变量,最好的算法是决策树。靠近根的节点将是建立"紧密度"的最重要变量。
看来我们需要阅读有关聚类算法的文章。通常的想法是,每次将它们分为相似点的集群时,不必将每个点与其他点进行比较。然后,邻域可能是同一群集中的所有点。聚类的数量/大小通常是聚类算法的参数。
在Google关于集群计算和mapreduce的系列文章中,我们可以找到有关集群的视频。
如果我们将其视为构建/批处理问题而不是实时查询,则可以大大减轻对性能的担忧。
该图可以被静态地计算然后潜在地更新,例如。每小时,每天等),然后生成针对运行时查询进行优化的边和存储,例如每个用户的前10个相似用户。
+1用于编程集体智能也是非常有益的,希望它不是(或者我曾经是!)面向Python的,但仍然不错。
确保查看"协同过滤"。许多推荐系统使用协作过滤向用户推荐项目。他们通过找到"邻居"来做到这一点,然后建议邻居评价很高但我们没有评价的项目。我们可能会找到邻居,而谁知道呢,也许将来我们会需要一些建议。
GroupLens是明尼苏达大学的研究实验室,研究协作过滤技术。他们拥有大量已发表的研究成果以及一些样本数据集。
Netflix奖是一项竞赛,旨在确定谁可以最有效地解决此类问题。跟随其LeaderBoard上的链接。一些竞争者分享他们的解决方案。
- 为项目创建类别。如果我们在谈论音乐,那么它们可能是古典音乐,摇滚,爵士,嘻哈音乐……或者更进一步:Grindcore,Math Rock,Riot Grrrl ...
- 现在,每次用户对商品进行评分时,请在类别级别上汇总其评分。因此,我们知道"用户A"喜欢Honky Tonk和Acid House,因为它们经常为这些商品赋予较高的评分。频率和强度可能对类别总分很重要。
- 当需要寻找邻居时,与其遍历所有评分,不如在类别中寻找相似的分数。
至于计算上不昂贵的解决方案,我们可以尝试以下方法:
这种方法虽然不够精确,但速度很快。
干杯。
我们需要的是一种聚类算法,该算法将自动将相似的用户分组在一起。我们面临的第一个困难是,大多数聚类算法希望将它们聚类的项表示为欧几里得空间中的点。就我们而言,我们没有这些点的坐标。相反,我们可以计算成对的"相似性"函数的值。
这里的一种很好的可能性是使用频谱聚类,它恰好需要我们拥有的东西:相似性矩阵。缺点是我们仍然需要为每对点计算兼容性函数,即e。该算法为O(n ^ 2)。
如果我们绝对需要比O(n ^ 2)更快的算法,则可以尝试一种称为异种空间的方法。这个想法很简单。我们可以反转兼容性函数(例如,取其倒数),以将其转换为相异性或者距离的度量。然后,我们将每个项目(在情况下为用户)与一组原型项目进行比较,并将得到的距离视为空间中的坐标。例如,如果我们有100个原型,则每个用户将由100个元素(即i)的向量表示。 e。在100维空间中的一点。然后,我们可以使用任何标准的聚类算法,例如K-means。
段落数量不匹配