构建协同过滤/推荐系统

8
我正在设计一个网站,围绕着基于用户口味推荐各种物品的概念建立。(例如他们评价过的物品、添加到收藏夹中的物品等) 其中一些例子是亚马逊、Movielens和Netflix。
现在,我的问题是,我不确定从数学角度来看该系统应该从哪里开始。我愿意学习所需的数学知识,只是我不知道需要哪种类型的数学知识。
我查看了Grouplens.org上的一些出版物,特别是“Towards a Scalable kNN CF Algorithm: Exploring Effective Applications of Clustering。”(pdf) 我对第5页“预测生成”之前的内容理解得很好。
附言:我并不完全需要解释正在发生的事情,虽然这可能会有所帮助,但我更感兴趣的是我需要了解的数学知识。这样我就可以理解正在发生的事情。
5个回答

11

让我解释一下作者介绍的过程(按照我的理解):

输入:

  • 训练数据:用户、物品以及用户对这些物品的评分(不一定每个用户都对所有物品评分)
  • 目标用户:一个新用户对某些物品进行了评分
  • 目标物品:目标用户没有评价过的物品,我们想预测它的评分。

输出:

  • 目标用户对目标物品的预测评分

可以对一堆物品重复这个过程,然后返回N个最高预测评分的物品。

算法:
该算法与朴素的KNN方法非常相似(搜索所有训练数据,找到与目标用户评分相似的用户,然后将它们的评分组合起来给出预测[投票])。
随着用户/物品数量的增加,这种简单方法无法很好地扩展。

提出的算法是首先将训练用户分成K组(评分相似的一组人),其中K << NN是用户总数)。
然后我们扫描这些簇,找出目标用户最接近的那个(而不是查看所有训练用户)。
最后,我们从中选出l个,并将我们的预测作为到这些l个簇的距离加权平均值。

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

第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
谢谢,这对我来说仍然是希腊文。总有一天我会回来,一切都会变得清晰明了的。 :) - John

8
《集体智慧编程》是一本非常用户友好的介绍该领域的书籍,其中包含大量Python示例代码。至少,它将有助于为理解该主题的学术论文中的数学做好准备。

谢谢你的书籍建议! - John

5

智能网络算法(H Marmanis,D Babenko,Manning出版社)是一本介绍性的关于这个主题的文本。它还涵盖了搜索概念,但其主要重点在于分类、推荐系统等方面。这应该是你项目的良好入门,让你能够提出正确的问题并在情况看起来更有前途或实用的地方深入挖掘。

该书还包括相关数学主题(主要是线性代数)的“复习”,但这个复习很少;你可以在网上找到更好的资源。

一个愉快的发现或重新进入线性代数的方式是跟随MIT OpenCourseWare上Gilbert Strand教授的18.06讲座系列

线性代数并不是拯救的唯一途径;-)你可能会发现基本统计概念如分布、协方差、贝叶斯推断对你有用...


1
谢谢,我会去看这本书的。还有谢谢你提供的系列讲座。 - John

1
官方文档Abracadabra Recommender API中,您首先需要区分以下内容:
  • 主题:这些是您希望向用户推荐的实体。例如电影或文章都是主题。主题的特点在于它们具有某些属性或内容,这使得它们在各种主题之间有所区别。

  • 属性:属性是指主题的特征的通用术语。这可以是任何东西,它真的取决于您如何定义主题。在主题为电影的例子中,属性可以是类型,例如冒险、动作、科幻等。属性也可以是出现在电影描述中的关键字、演员姓名、电影发布年份等等。你想要什么就可以定义什么!

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

  • 流程:对于任何类型的推荐系统而言,都存在一种通用的流程(完成任务的顺序),并且这种流程也很容易理解。

我们需要做的第一件事情是向推荐引擎填充主题及其对应的属性。通常这只需要做一次,但也可以动态地进行。例如,如果您正在推荐文章,则可能希望每次添加文章到您的网站或博客时执行此操作。
第二步是输入用户的偏好。通过用户的唯一标识符和喜欢或不喜欢某些主题或属性,您可以训练推荐系统。例如,一个用户可能会看到一列电影,并被要求给每部电影评分。或者,用户可以通过输入他偏爱的属性(例如流派、关键字、发布日期等)来建立个人资料。这部分取决于您自己的决定和项目的逻辑。
一旦系统已经被训练(填充了主题和用户的偏好),那么我们就可以调用引擎来提供推荐。您可以只做一次,也可以动态地进行(因此在收到用户反馈后重新训练模型)。随着用户提供更多的反馈,模型变得更好,推荐接近于用户的实际偏好。
请注意,使用Abracadabra推荐API,您只需要向API发送HTTP请求即可训练模型并接收推荐结果。该API可以使用任何语言访问,因此可以通过您的网站或应用程序(Angular、React、Javascript等)或服务器(NodeJS、Curl、Java、Python、Objective-C、Ruby、.NET等)进行访问。

1

你可能需要了解:

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

有用但不是必须的:

  • 度量空间
  • 拓扑学
  • 探索性数据分析/鲁棒统计学
  • 仿射代数
  • 泛函分析
  • 图论

话虽如此,只要有常识,你就可以走得很远。如果你有一个想让你的系统满足的属性列表,你只需编写满足这些属性的代码,就能做很多事情。

例如:

  • 永远不要做出“糟糕”的建议
  • 得分在几个参数上单调递增
  • 为我们未来的X、Y、Z改进想法留下余地。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接