基于其他用户喜欢的查找用户喜欢的东西的算法

Posted

技术标签:

【中文标题】基于其他用户喜欢的查找用户喜欢的东西的算法【英文标题】:Algorithms to find stuff a user would like based on other users likes 【发布时间】:2010-12-08 19:22:28 【问题描述】:

我正在考虑编写一个应用程序,根据家庭成员的喜好对 HTPC 中的电影进行分类。

我不知道统计或 AI,但 here 的东西看起来很有趣。我不知道从哪里开始做。

这是我想要完成的:

    根据每个用户的喜好组成一组样本,分别对每个样本属性进行评分。例如,可能某个用户非常喜欢西部电影,因此西部类型对该用户的权重会更高(对于其他属性,如演员、导演等)。

    用户可以根据其他用户的喜好获得建议。例如,如果用户 A 和 B 都喜欢 Spielberg(用户之间的联系),并且用户 B 喜欢 Batman Begins,但用户 A 讨厌 Katie Holmes,则相应地为用户 A 权衡电影(同样,每个属性单独,例如,也许用户 A 不太喜欢动作片,所以稍微降低评分,因为凯蒂·霍姆斯不是主要明星,所以不要像其他属性一样考虑这一点)。

基本上,将用户 A 的集合与用户 B 的集合进行比较,然后得出用户 A 的评分。

我对如何实现这个有一个粗略的想法,但我确信一些聪明的人已经想到了一个更好的解决方案,所以......有什么建议吗?

实际上,经过快速研究,贝叶斯过滤器似乎可以工作。如果是这样,这会是更好的方法吗?会不会像“标准化”电影数据、为每个用户训练一个分类器、然后对每部电影进行分类一样简单?

如果您的建议包括一些令人脑筋急转弯的概念(我在这些主题方面没有经验,特别是在 AI 方面),如果您还提供一些基础知识列表供我在深入研究这些内容之前进行研究,我将不胜感激.

谢谢!

【问题讨论】:

重复***.com/questions/626220/… 感谢您的参考。根据我的示例,我正在寻找更具体的答案。虽然阅读所有关于推荐系统的内容会很有趣,但我更愿意首先被引导到正确的方向:) 【参考方案1】:

Matthew Podwysocki 有一些关于这方面的有趣文章

http://codebetter.com/blogs/matthew.podwysocki/archive/2009/03/30/functional-programming-and-collective-intelligence.aspx

http://codebetter.com/blogs/matthew.podwysocki/archive/2009/04/01/functional-programming-and-collective-intelligence-ii.aspx

http://weblogs.asp.net/podwysocki/archive/2009/04/07/functional-programming-and-collective-intelligence-iii.aspx

【讨论】:

那里有一些非常有趣的东西,还有一些我将遵循的阅读建议。非常感谢!【参考方案2】:

这类似于this question OP 想要构建推荐系统的地方。简而言之,我们得到一组训练数据,其中包括用户对电影的评分(例如 1-5 星评分)和每部电影的一组属性(年份、流派、演员……)。我们想要构建一个推荐器,以便它为未看过的电影输出一个可能的评分。所以 inpt 数据看起来像:

user movie   year   genre   ...    | rating
---------------------------------------------
  1    1     2006   action         |    5
  3    2     2008   drama          |    3.5
  ...

对于未分级的电影 X:

10    20     2009   drama   ?

我们想要预测评分。对所有未看过的电影执行此操作,然后按预测的电影评分排序并输出前 10 名,从而为您提供一个推荐系统。

最简单的方法是使用k-nearest neighbor 算法。在评分的电影中,搜索与电影 X“最接近”的电影,并结合它们的评分来产生预测。 这种方法的优点是非常简单,易于从头开始实施。

还有其他更复杂的方法。例如,您可以构建一个decision tree,在训练数据上拟合一组规则。您还可以使用Bayesian networks、artificial neural networks、support vector machines 等等……对于没有适当背景的人来说,通过每一个都不容易。 我仍然希望您会使用外部工具/库。现在您似乎对贝叶斯网络很熟悉,所以一个简单的朴素贝叶斯网络实际上可能非常强大。一个优点是它允许在缺失数据的情况下进行预测。

主要思想有些相同;获取您拥有的输入数据,训练模型,然后使用它来预测新实例的类别。

如果您想在不需要编程的简单直观包中使用不同的算法,我建议您查看Weka(我的第一选择)、Orange 或RapidMiner。最困难的部分是将数据集准备为所需的格式。其余的就像选择什么算法并应用它一样简单(只需点击几下!)

我想对于不想深入细节的人来说,我建议使用最近邻方法,因为它直观且易于实现。仍然可以选择使用 Weka(或其他工具之一)值得研究。

【讨论】:

很棒的答案,谢谢。这个周末我将潜入 Weka,看看我想出了什么。【参考方案3】:

有一些算法对此很有用:

ARTMAP:通过概率对彼此进行分组(这并不快,但它是解决您的问题 IMO 的最佳选择)

ARTMAP 包含一组共同属性,并通过百分比确定相似性的可能性。 ARTMAP

KMeans:这将向量按彼此之间的距离分开 KMeans: Wikipedia

PCA:将所有值的平均值与可变位分开。这就是您在计算机视觉中用于人脸检测和背景减法的方法。 PCA

【讨论】:

谢谢。阅读有关 ARTMAP 的信息后,它似乎是一个不错的候选者。因为我比科学论文更了解代码,所以我发现了这个 users.visualserver.org/xhudik/art/doc/index.html 并产生了这个 ***.com/questions/1609296/… ... KMeans 看起来也很有趣,但一次一个 :) 这本书有一个非常简单的入门教程... amazon.com/AI-Application-Programming-Tim-Jones/dp/1584502789 但是,IRC 中 Fn 的概率有一个错误。【参考方案4】:

K-最近邻算法可能就在你身边。

【讨论】:

那个看起来很简单,我可以自己尝试实现。很好的学习资源,谢谢!【参考方案5】:

查看top teams 为netflix prize 所做的一些工作。

【讨论】:

以上是关于基于其他用户喜欢的查找用户喜欢的东西的算法的主要内容,如果未能解决你的问题,请参考以下文章

关于算法

推荐算法的基于协同过滤的推荐

推荐算法之基于用户的协同过滤

协同过滤推荐算法简述

《推荐系统实践》 3. 通用推荐模型

协同过滤算法