建立协作过滤/推荐系统

时间:2009-10-03 02:33:49

标签: math coldfusion recommendation-engine collaborative-filtering

我正在设计一个网站,该网站是根据用户的口味向用户推荐各种商品的概念。 (即他们评价的项目,添加到收藏夹列表中的项目等)。这方面的一些例子是亚马逊,Movielens和Netflix。

现在,我的问题是,我不确定从这个系统的数学部分开始。我愿意学习所需的数学,只是我不知道需要什么类型的数学。

我查看过Grouplens.org处的一些出版物,特别是“Towards a Scalable kNN CF Algorithm: Exploring Effective Applications of Clustering”。 (pdf)我很擅长理解所有内容,直到第5页“预测生成”

P.S。我并不是在寻找对正在发生的事情的解释,虽然这可能会有所帮助,但我对我需要知道的数学更感兴趣。这样我就可以理解发生了什么。

5 个答案:

答案 0 :(得分:11)

让我解释作者介绍的程序(据我理解):

<强>输入:

  • 培训数据:这些项目的用户,项目和用户评级(不是 每个用户必须全部评分 项)
  • 目标用户:对某些项目有一些评分的新用户
  • 目标商品:我们想要的目标用户未评级的商品 预测它的评级。

<强>输出:

  • 目标用户对目标项目的预测

这可以针对一堆项目重复,然后我们返回N-top项目(最高预测评级)

<强>步骤:
该算法与天真的KNN方法非常相似(搜索所有训练数据以查找与目标用户具有相似评级的用户,然后将他们的评级结合起来进行预测[投票])。 随着用户/项目数量的增加,这种简单的方法无法很好地扩展。

所提出的算法是首先将训练用户聚类成 K 组(类似地评价项目的人群),其中 K &lt;&lt; N N 是用户总数) 然后我们扫描这些聚类以找到目标用户最接近哪一个(而不是查看所有培训用户) 最后,我们选择 l ,我们将预测作为平均加权距离 l 群集的距离。

注意,使用的相似性度量是correlation系数,聚类算法是二等分K-Means算法。我们可以简单地使用标准kmeans,我们也可以使用其他相似性指标,例如Euclidean distance或余弦距离。

第5页的第一个公式是相关性的定义:

corr(x,y) = (x-mean(x))(y-mean(y)) / std(x)*std(y)

第二个公式基本上是加权平均值:

predRating = sum_i(rating_i * corr(target,user_i)) / sum(corr(target,user_i))
               where i loops over the selected top-l clusters

希望这能澄清一些事情:)

答案 1 :(得分:8)

Programming Collective Intelligence是一个真正用户友好的介绍,在Python中有很多示例代码。至少,它将有助于为理解这一主题的学术论文中的数学奠定基础。

答案 2 :(得分:5)

Algorithm of the Intelligent Web(H Marmanis,D Babenko,Manning出版)是关于子喷气机的介绍性文本。它还涉及搜索概念,但其主要重点是分类,推荐系统等。这应该是您的项目的一个很好的入门,让您可以提出正确的问题,并深入挖掘在您的情况下看起来更有前途或更实际的事情。

这本书还包括相关数学主题(主要是线性代数)的“复习”,但这个复习很少;你会在网上做得更好。

发现或回到线性代数的一种愉快方式是遵循麻省理工学院开放式课程中的Prof. Gilbert Strand's 18.06 lecture series

线性代数不是获得救赎的唯一方法;-)你可能会发现有助于了解基本的统计概念,如分布,协方差,贝叶斯推理等......

答案 3 :(得分:1)

你可能应该知道:

  • 线性代数
  • 人工智能/机器学习/统计

很高兴:

  • 指标空间
  • 拓扑结构
  • EDA /健全统计
  • 仿冒代数
  • 功能分析
  • 图论

那就是说,你只需要常识即可。如果您有一个希望系统满足的属性列表,那么只需编写满足这些属性的代码,您就可以做很多事情。

示例可能是:

  • 永远不会做出“糟糕”的建议
  • 得分在一些参数中单调递增
  • 为X,Y,Z打开门,让我们有更好的想法。

答案 4 :(得分:1)

the official documentationAbracadabra Recommender API开始,您可以区分:

  • 主题:这些是您希望向用户推荐的实体。电影或文章例如是主题。受试者的特征在于他们具有在不同受试者之间区分它们的某些属性或内容。

  • 属性:属性是主题特征的通用术语。这可以是任何东西,它实际上取决于您如何定义主题。在主题是电影的示例中,属性可以是类型,例如,冒险,行动,科幻。属性也可以是此电影描述中出现的关键字,演员姓名,电影发行年份等。您可以为其命名!

  • 用户:顾名思义,这是希望获得某些主题推荐的人。用户通过喜欢属性或主题(以及随后的附加属性)来构建用户配置文件。

  • <强>流量 总体流程(完成工作的顺序)与任何类型的推荐系统相关,并且直观易懂。

我们始终需要做的第一件事就是用推荐主题和相应的属性填充推荐引擎。通常这只需要完成一次,但也可以动态完成。例如,如果您推荐文章,那么每次将文章添加到您的网站或博客时,您可能希望这样做。

第二步是输入用户的偏好。结合用户的唯一ID,您可以通过喜欢或不喜欢某些主题或属性来训练推荐系统。例如,可以向用户显示电影列表,并且给予他/她给每个电影评级的选项。或者,用户可以通过输入他喜欢的属性(例如,哪些类型,关键字,发布日期等)来建立简档。这部分完全取决于您决定项目的逻辑。

一旦系统经过培训(充满了主题和用户的偏好),我们就可以致电引擎向我们提供建议。您可以执行此操作一次,也可以动态执行此操作(从而在您从用户收到的每个反馈后重新训练模型)。随着用户提供更多反馈,模型变得更好,建议接近用户的实际偏好。

请注意,使用Abracadabra Recommender API,您只需向API发送HTTP调用即可培训模型并接收建议。 API可以使用任何语言访问,因此可以从您的网站或应用程序(Angular,React,Javascript ...)或您的服务器(NodeJS,Curl,Java,Python,Objective-C,Ruby,.NET ......)访问