构建协同过滤/推荐系统
Posted
技术标签:
【中文标题】构建协同过滤/推荐系统【英文标题】:Building a Collaborative filtering / Recommendation System 【发布时间】:2010-12-03 12:19:50 【问题描述】:我正在设计一个网站,该网站的理念是根据用户的喜好向他们推荐各种商品。 (即他们评价过的项目、添加到收藏夹列表中的项目等)亚马逊、Movielens 和 Netflix 就是其中的一些例子。
现在,我的问题是,关于这个系统的数学部分,我不确定从哪里开始。我愿意学习所需的数学,只是我不知道需要什么类型的数学。
我查看了Grouplens.org 上的一些出版物,特别是“Towards a Scalable kNN CF Algorithm: Exploring Effective Applications of Clustering”。 (pdf) 在第 5 页“预测生成”之前,我非常擅长理解所有内容
附言我并不是在寻找对正在发生的事情的解释,尽管这可能会有所帮助,但我对我需要知道的数学更感兴趣。这样我就可以理解是怎么回事了。
【问题讨论】:
【参考方案1】:Programming Collective Intelligence 是对该领域的真正用户友好的介绍,其中包含大量 Python 示例代码。至少,它将有助于为理解有关该主题的学术论文中的数学奠定基础。
【讨论】:
感谢推荐书!【参考方案2】:Algorithm of the Intelligent Web(H Marmanis, D Babenko, Manning 出版)是关于 subjet 的介绍性文字。它还涵盖了搜索概念,但主要关注分类、推荐系统等。这应该是您项目的一个很好的入门书,让您可以提出正确的问题,并深入挖掘在您的情况下看起来更有希望或更实用的地方。
本书还包括相关数学主题的“复习”(主要是线性代数),但这种复习很少;你会在网络上做得更好。
发现或重返线性代数的一种愉快方式是关注 MIT OpenCourseWare 上的Prof. Gilbert Strand's 18.06 lecture series。
线性代数不是拯救的唯一方法 ;-) 您可能会发现复习基本统计概念(例如分布、协方差、贝叶斯推理)很有用...
【讨论】:
谢谢,我去看看书。并感谢您的系列讲座。【参考方案3】:让我解释一下作者介绍的程序(据我了解):
输入:
训练数据:用户、项目和用户对这些项目的评分(不是 必须每个用户都评价所有 项目) 目标用户:对某些商品有一定评分的新用户 Target item:我们想要的未被目标用户评分的项目 预测它的评分。输出:
目标用户对目标项目的预测这可以对一堆项目重复,然后我们返回 N-top 项目(最高预测评分)
程序: 该算法非常类似于朴素的KNN 方法(搜索所有训练数据以找到与目标用户评分相似的用户,然后结合他们的评分进行预测[投票])。 随着用户/项目数量的增加,这种简单的方法不能很好地扩展。
提出的算法是首先将训练用户分成K组(对物品评分相似的人群),其中K 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
希望这能澄清一点:)
【讨论】:
谢谢,对我来说仍然是希腊语。有一天我会回来,这一切都会变得有意义。 :)【参考方案4】:你可能应该知道:
线性代数 人工智能/机器学习/统计很高兴拥有:
度量空间 拓扑 EDA / 稳健的统计数据 仿射代数 功能分析 图论也就是说,凭常识就能走得更远。如果您有一个希望系统满足的属性列表,您只需编写满足这些属性的代码就可以做很多事情。
示例可能是:
永远不要提出“不好”的建议 分数在几个参数中单调递增 为我们未来的 X、Y、Z 改进理念敞开大门。【讨论】:
【参考方案5】:从Abracadabra Recommender API 的the official documentation 开始,您首先要区分:
主题:这些是您希望向用户推荐的实体。例如,一部电影或一篇文章是一个主题。主题的特点是它们具有某些属性或内容,可以区分不同的主题。
属性:属性是对主题特征的通用术语。这可以是任何东西,这实际上取决于您如何定义主题。在主题是电影的示例中,属性可以是流派,例如冒险,动作,科幻。属性也可以是电影描述中出现的关键字、演员姓名、电影发行年份等。您可以命名它!
用户:顾名思义,就是希望接收特定主题推荐的人。用户通过喜欢属性或主题(以及随后附加的属性)来构建用户配置文件。
流程 有一个通用流程(完成工作的顺序)与任何类型的推荐系统相关,并且直观易懂。
我们总是需要做的第一件事就是用主题及其相应的属性填充推荐引擎。通常这只需要完成一次,但也可以动态完成。例如,如果您要推荐文章,那么您可能希望在每次将文章添加到您的网站或博客时都这样做。
第二步是输入用户的偏好。连同用户的唯一 ID,您可以通过喜欢或不喜欢某些主题或属性来训练推荐系统。例如,可能会向用户显示电影列表,并且他/她可以选择为每部电影评分。或者,用户可以通过输入他喜欢的属性(例如,哪些流派、关键字、发布日期等)来建立个人资料。这部分真的由你来决定和你的项目的逻辑。
一旦系统经过训练(填充主题和用户偏好),我们就可以调用引擎为我们提供建议。您可以执行一次,也可以动态执行(因此在收到用户的每次反馈后重新训练模型)。随着用户提供更多反馈,模型会变得更好,并且推荐更接近用户的实际偏好。
请注意,使用Abracadabra Recommender API,您只需向 API 发送 HTTP 调用即可训练您的模型并接收建议。可以使用任何语言访问 API,因此可以从您的网站或应用程序(Angular、React、javascript...)或您的服务器(NodeJS、Curl、Java、Python、Objective-C、Ruby、.NET...) .
【讨论】:
以上是关于构建协同过滤/推荐系统的主要内容,如果未能解决你的问题,请参考以下文章