文章目录

  • 1. 推荐系统简介
    • 1.1 推荐系统是什么?
    • 1.2 推荐系统的类型
  • 2. 推荐系统常用算法
    • 2.1 协同过滤算法
      • 2.1.1 UserCF基础算法
      • 2.1.2 ItemCF基础算法
      • 2.1.3 相似度修正
      • 2.1.4 UserCF与ItemCF对比
    • 2.2 隐语义模型
      • 2.2.1 算法原理
      • 2.2.2 LFM与协同过滤对比
    • 2.3 基于图的模型
  • Reference

最近想了解下推荐系统,阅读了《推荐系统实践》(项亮),本文简单介绍推荐系统常用算法的原理,大部分内容来自项亮大牛的书籍。

1. 推荐系统简介

1.1 推荐系统是什么?

随着信息技术的发展,互联网上的信息量快速增长。为了在众多信息中找到想要的内容,常用的方式有——

  • 分类目录,如雅虎、hao123,将网站分门别类,但只能覆盖热门网站
  • 搜索引擎,如谷歌、百度

与分类目录和搜索引擎相同,推荐系统也是一种针对信息过载的解决方案,通过分析用户的行为、兴趣等数据,主动给用户推荐满足其兴趣和需求的信息,区别在于——

  • 对用户来说,用户不需要主动提供明确的需求,推荐系统会根据其历史行为等数据建模,主动推荐信息
  • 对信息来说,推荐系统可以更好地挖掘长尾信息,而不仅仅是热门信息

推荐系统已经在很多互联网产品中使用,常见的使用场景有——

  • 电子商务,如淘宝的【猜你喜欢】和【类似商品推荐】
  • 视频网站,如爱奇艺的【猜你在追】和【精彩推荐】,短视频、小说、漫画等内容产品也类似
  • 音乐应用,如豆瓣FM、QQ音乐的【个性电台】,根据收听历史推荐歌曲
  • 社交网络,如QQ的【好友推荐】,或利用社交网络推荐信息给用户
  • 基于位置的服务,如美团推荐附近的美食
  • 个性化广告,根据用户的兴趣,给不同用户投放不同的广告

1.2 推荐系统的类型

推荐系统根据优化目标的不同,常被分为两种类型——

  • 评分预测问题,即给定物品,预测用户对其的打分情况,如Netflix的电影推荐。在评分预测问题中,损失函数是均方根误差RMSE,最终推荐给用户的物品是用户对其打分最高(最喜欢)的物品
  • TopN问题,是指使用打分函数对物品进行排序,给出N个用户最可能选择的物品列表

由于早期推荐系统研究是基于电影评分数据的评分预测问题,因此绝大多数推荐系统研究都是基于用户评分数据的评分预测。而在实际应用中,TopN问题更加常用,原因在于——

  • 评分预测问题依赖用户对物品的评分这类显性数据,而大多数场景下我们只有用户浏览行为等隐性数据
  • 推荐系统的目的是找到用户感兴趣的电影,预测用户是否会观看电影比预测用户观看电影后的评分更重要,可能存在电影用户看过后会打出高分,但用户看的可能性非常小

本文介绍的推荐系统算法是用于求解TopN问题的。

2. 推荐系统常用算法

实现推荐系统的算法有很多,但大致可分为三类,下面会依次介绍其基本原理。

在介绍的过程中,使用的数据为用户的隐性数据,如浏览行为。

2.1 协同过滤算法

协同过滤算法(也称为基于邻域的算法)分为两大类,分别是基于用户的协同过滤(UserCF)和基于物品的协同过滤(ItemCF),是推荐系统中最经典的算法。

2.1.1 UserCF基础算法

UserCF的思想是根据用户行为数据,找到与目标用户有相似兴趣的其他用户,给用户推荐其他用户喜欢的物品。

其算法流程分为两步:

  1. 找到与目标用户兴趣相似的K个用户集合,计算用户相似度可以使用余弦相似度,如下:

wuv=∣N(u)∩N(v)∣∣N(u)∣∣N(v)∣其中,N(u)表示用户u产生过行为的物品集合w_{uv}=\frac{|N(u)\cap N(v)|}{\sqrt{|N(u)||N(v)|}}\\其中,N(u)表示用户u产生过行为的物品集合 wuv​=∣N(u)∣∣N(v)∣​∣N(u)∩N(v)∣​其中,N(u)表示用户u产生过行为的物品集合

  1. 在最相似的K个用户中找到他们喜欢且目标用户没有产生过行为的物品,用以下公式计算用户 uuu 对物品 iii 的感兴趣程度排序后推荐前N个物品给目标用户:

p(u,i)=∑v∈S(u,K)∩N(i)wuvrvi其中,S(u,K)是用户u最相似的K个用户集合,N(i)为对i有过行为的用户集合,rvi为用户v对物品i的评分,由于数据为隐性数据而不是评分数据,rvi设为常数1p(u,i)=\sum_{v\in S(u,K)\cap N(i)}w_{uv}r_{vi}\\ 其中,S(u,K)是用户u最相似的K个用户集合,N(i)为对i有过行为的用户集合,\\ r_{vi}为用户v对物品i的评分,由于数据为隐性数据而不是评分数据,r_{vi}设为常数1 p(u,i)=v∈S(u,K)∩N(i)∑​wuv​rvi​其中,S(u,K)是用户u最相似的K个用户集合,N(i)为对i有过行为的用户集合,rvi​为用户v对物品i的评分,由于数据为隐性数据而不是评分数据,rvi​设为常数1

这样,就可以得到目标用户最感兴趣的TopN物品列表。

2.1.2 ItemCF基础算法

ItemCF的思想是根据用户行为数据,计算物品间的相似度,基于用户以往的喜好记录,推荐给用户相似的物品。

其算法流程分为两步:

  1. 计算物品之间的相似度,可使用余弦相似度,如下:

wij=∣N(i)∩N(j)∣∣N(i)∣∣N(j)∣其中,N(i)表示对物品i产生过行为的用户集合w_{ij}=\frac{|N(i)\cap N(j)|}{\sqrt{|N(i)||N(j)|}}\\其中,N(i)表示对物品i产生过行为的用户集合 wij​=∣N(i)∣∣N(j)∣​∣N(i)∩N(j)∣​其中,N(i)表示对物品i产生过行为的用户集合

  1. 用如下共识计算目标用户 uuu 对物品 jjj 的感兴趣程度,排序后推荐前N个物品给目标用户。从公式可以看到,与用户喜欢过的物品越相似,计算的值越高

puj=∑i∈N(u)∩S(j,K)wijruip_{uj}=\sum_{i \in N(u)\cap S(j,K)}w_{ij}r_{ui} puj​=i∈N(u)∩S(j,K)∑​wij​rui​

这样,就可以得到目标用户最感兴趣的TopN物品列表。

2.1.3 相似度修正

上述介绍的算法是比较简单和原始的版本,使用的数据也只有用户的行为数据。

实际场景中,用户的画像信息、物品的属性、时间空间信息都会加入考虑,算法也会相应地改进以适应实际需求。

以上述介绍的用户相似度计算方式为例,在实际场景中,我们认为热门物品对相似度的贡献比冷门物品小,也就是两个人对冷门物品都产生过行为更能说明兴趣相似,因此用户相似度可以如下对热门物品做惩罚:
wuv=∑i∈N(u)∩N(v)log11+∣N(i)∣∣N(u)∣∣N(v)∣其中,N(u)表示用户u产生过行为的物品集合,N(i)表示对物品i产生过行为的用户集合w_{uv}=\frac{\sum_{i\in N(u)\cap N(v)} log\frac{1}{1+|N(i)|}}{\sqrt{|N(u)||N(v)|}}\\其中,N(u)表示用户u产生过行为的物品集合,N(i)表示对物品i产生过行为的用户集合 wuv​=∣N(u)∣∣N(v)∣​∑i∈N(u)∩N(v)​log1+∣N(i)∣1​​其中,N(u)表示用户u产生过行为的物品集合,N(i)表示对物品i产生过行为的用户集合
类似地,在物品相似度中认为活跃用户的贡献小于非活跃用户,因此物品相似度可以如下对活跃用户做惩罚:
wij=∑u∈N(i)∩N(j)log11+∣N(u)∣∣N(i)∣∣N(j)∣其中,N(u)表示用户u产生过行为的物品集合,N(i)表示对物品i产生过行为的用户集合w_{ij}=\frac{\sum_{u \in N(i)\cap N(j)}log \frac{1}{1+|N(u)|}}{\sqrt{|N(i)||N(j)|}}\\其中,N(u)表示用户u产生过行为的物品集合,N(i)表示对物品i产生过行为的用户集合 wij​=∣N(i)∣∣N(j)∣​∑u∈N(i)∩N(j)​log1+∣N(u)∣1​​其中,N(u)表示用户u产生过行为的物品集合,N(i)表示对物品i产生过行为的用户集合

2.1.4 UserCF与ItemCF对比

从上述UserCF与ItemCF的原理看,UserCF的推荐结果反映了与目标用户兴趣相似的小群体的热点,ItemCF的推荐结果是维护目标用户的历史兴趣,从不同角度对比如下:

UserCF常在新闻网站中使用,因为新闻数量很多,时效性很强,且从冷启动角度看,新的新闻出现后可快速用于推荐;

ItemCF则在电商、视频网站中使用,在这些网站中物品不容易过时,用户的兴趣也更持久。

2.2 隐语义模型

LFM(Latent Factor Model),隐语义模型是推荐系统中很热门的研究话题。

隐语义模型最开始是在NLP领域中使用,用于找到文本的隐含语义,相关的主题模型有LSA、pLSA、LDA等,在这篇回答中解释得很清楚,建议看一下:既然 LDA 是一种比 PLSA 更高级的模型,为啥百度还在用 PLSA?

在NLP的主题模型中,通过在单词与文档之间引入 【主题】 这一隐含变量,来挖掘文本的语义,比如在上面回答中举到的例子:

文本1:“马云、马化腾和李彦宏”

文本2:“阿里巴巴、腾讯和百度掌门人”

如果通过单词来计算两个文本的距离,可能会得出两个文本完全不相关的结论。

但若把两个文本的 【主题】 抽离出来,会得到“企业家”、“互联网”、“BAT”等等这些主题,这样就发现两句话主题上是完全相同的,由此可知这两句话具有很高的相似性。

将LFM应用到推荐系统中,则是在用户和物品之间引入【类别】这一隐含变量——对于某个用户,首先得到他的兴趣分类,再从属于该分类的物品中挑选他可能喜欢的物品。

2.2.1 算法原理

假设用户的兴趣分类(或物品的分类)有 FFF 种,用如下公式表示用户对物品的感兴趣程度——
Preference(u,i)=rui=puqi=∑k=1Fpu,kqk,iPreference(u,i)=r_{ui}=p_uq_i=\sum_{k=1}^{F}p_{u,k}q_{k,i} Preference(u,i)=rui​=pu​qi​=k=1∑F​pu,k​qk,i​
其中 ruir_{ui}rui​ 表示用户是否对物品 iii 产生行为,pup_upu​ 是用户-分类矩阵 PPP 的第 uuu 行,表示用户 uuu 与各个兴趣分类的关系,qiq_iqi​ 是分类-物品矩阵 QQQ 的第 iii 列,表示物品 iii 与各个兴趣分类的关系。

因此,只要求解出两个矩阵 PPP 和 QQQ,根据感兴趣程度的排序就可以推荐TopN列表给目标用户。

求解过程如下:

  1. 由于我们的数据是隐性数据,即只有用户对哪些物品产生过行为,对应的 rui=1r_{ui} = 1rui​=1,为了求解矩阵,需要先按如下原则采集负样本,对应的 rui=0r_{ui}=0rui​=0——
  • 对每个用户,保证正负样本数平衡
  • 对每个用户采集负样本时,要选取热门但用户没有行为的物品
  1. 得到正负样本后,则需要最小化以下损失函数,其中后两项为防止过拟合的正则化项

C=∑(rui−r^ui)2+λ∣∣pu∣∣2+λ∣∣qi∣∣2=∑(rui−∑k=1Fpu,kqk,i)2+λ∣∣pu∣∣2+λ∣∣qi∣∣2C=\sum(r_{ui}-\hat r_{ui})^2+\lambda||p_u||^2+\lambda||q_i||^2=\sum(r_{ui}-\sum_{k=1}^{F}p_{u,k}q_{k,i})^2+\lambda||p_u||^2+\lambda||q_i||^2 C=∑(rui​−r^ui​)2+λ∣∣pu​∣∣2+λ∣∣qi​∣∣2=∑(rui​−k=1∑F​pu,k​qk,i​)2+λ∣∣pu​∣∣2+λ∣∣qi​∣∣2

  1. 对参数求偏导,有

∂C∂pu,k=−2qk,i+2λpu,k∂C∂qk,i=−2pu,k+2λqk,i\frac{\partial C}{\partial p_{u,k}}=-2q_{k,i}+2\lambda p_{u,k}\\ \frac{\partial C}{\partial q_{k,i}}=-2p_{u,k}+2\lambda q_{k,i} ∂pu,k​∂C​=−2qk,i​+2λpu,k​∂qk,i​∂C​=−2pu,k​+2λqk,i​

  1. 使用梯度下降法,迭代求解参数值,递推公式如下,其中 α\alphaα 是学习速率

pu,k=pu,k+α(qk,i−λpu,k)qk,i=qk,i+α(pu,k−λqk,i)p_{u,k}=p_{u,k}+\alpha(q_{k,i}-\lambda p_{u,k})\\ q_{k,i}=q_{k,i}+\alpha(p_{u,k}-\lambda q_{k,i}) pu,k​=pu,k​+α(qk,i​−λpu,k​)qk,i​=qk,i​+α(pu,k​−λqk,i​)

2.2.2 LFM与协同过滤对比
  • 离线计算的空间复杂度:UserCF需要计算用户相似度表,空间复杂度为O(M2)O(M^2)O(M2),ItemCF需要计算物品相似度表,空间复杂度为 O(N2)O(N^2)O(N2)。而LFM存储两个矩阵,假设有 FFF 个隐类,则空间复杂度为 O(F∗(M+N))O(F*(M+N))O(F∗(M+N)),在用户数或物品数很高的情况下,LFM所需空间小得多
  • 离线计算的时间复杂度:两种算法时间复杂度没有大的差别
  • 在线实时推荐:UserCF和ItemCF将相似度表缓存在内存中,可以在线进行实时推荐,如用户喜欢新的物品后,ItemCF可以实时推荐类似的物品给该用户;而LFM需要计算用户对所有物品的感兴趣程度,复杂度太高,无法实时推荐
  • 推荐结果解释:ItemCF支持很好的推荐解释,LFM这类神经网络可解释性则比较差

2.3 基于图的模型

用户行为可以用二分图表示,如下图所示,很多图的算法也可以应用到推荐系统上,此处介绍基于随机游走的PersonalRank算法

PersonalRank算法跟用于网页排序的PageRank算法原理基本相同,其思路是,假设给用户 uuu 做推荐,可以从对应图上的 vuv_uvu​ 节点出发进行随机游走,最终每个节点被访问的概率(Rank值)会收敛,排序即可得到用户的推荐列表。

随机游走的规则为:

  1. 初始状态下,vuv_uvu​ 节点的Rank值为1,其余节点为0,每次游走,节点上的Rank值也会传递到下一个节点

  2. 在每个节点上,有 α\alphaα 的概率继续随机游走,即以相等的概率游走到该节点指向的任意节点上

    • 因此,传递到下一节点的Rank值期望为 Rank(v)∣out(v)∣\frac{Rank(v)}{|out(v)|}∣out(v)∣Rank(v)​,out(v)out(v)out(v) 为节点 vvv 指向的顶点集
    • 因此,每个节点可以得到的Rank值期望为 α∑v′∈in(v)Rank(v′)∣out(v′)∣\alpha \sum_{v' \in in(v)} \frac{Rank(v')}{|out(v')|}α∑v′∈in(v)​∣out(v′)∣Rank(v′)​,in(v)in(v)in(v) 为指向节点 vvv 的顶点集
  3. 在每个节点上,剩余有 1−α1-\alpha1−α 的概率回到 vuv_uvu​ 起点

    • 因此,起点 vuv_uvu​ 还可以得到额外的Rank值 ∑v(1−α)Rank(v)=1−α\sum_v (1-\alpha) Rank(v)=1-\alpha∑v​(1−α)Rank(v)=1−α

因此用迭代公式表达上述随机游走的过程如下:
Rank(v)={α∑v′∈in(v)Rank(v′)∣out(v′)∣(v≠vu)(1−α)+α∑v′∈in(v)Rank(v′)∣out(v′)∣(v=vu)Rank(v)=\left\{ \begin{aligned} \alpha & \sum_{v' \in in(v)} \frac{Rank(v')}{|out(v')|}&(v \ne v_u) \\ ( & 1-\alpha) + \alpha \sum_{v' \in in(v)} \frac{Rank(v')}{|out(v')|} &(v=v_u) \end{aligned} \right. Rank(v)=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧​α(​v′∈in(v)∑​∣out(v′)∣Rank(v′)​1−α)+αv′∈in(v)∑​∣out(v′)∣Rank(v′)​​(v​=vu​)(v=vu​)​
基于图的推荐算法(PersonalRank),这篇博客中有详细的代码实现和注释,可以参考一下。

上述算法需要在全图进行迭代,时间复杂度很高,可以通过转化为矩阵运算求解,此处不再说明。

Reference

  1. 《推荐系统实践》,项亮
  2. 既然 LDA 是一种比 PLSA 更高级的模型,为啥百度还在用 PLSA?
  3. 基于图的推荐算法(PersonalRank)

推荐系统学习 - (1)基本算法相关推荐

  1. 推荐系统学习笔记-PNN算法

    由来 Product-based Neural Network)是在2016年提出的用于计算CTR问题的深度神经网络模型,PNN的网络结构对传统的FNN(Feedforward Neural Netw ...

  2. Python推荐系统学习笔记(3)基于协同过滤的个性化推荐算法实战---ItemCF算法(下)

    本文在 Python推荐系统学习笔记(2)基于协同过滤的个性化推荐算法实战---ItemCF算法 一文的基础上,对其基本的ItemCF算法做出改进. 一.相关概念 1.ItemCF中,基于行为(喜好) ...

  3. Python推荐系统学习笔记(5)基于协同过滤的个性化推荐算法实战---UserCF算法(下)

    本文在 Python推荐系统学习笔记(4)基于协同过滤的个性化推荐算法实战---UserCF算法(上) 一文的基础上,对其基本的UserCF算法做出改进. 一.相关概念 1.UserCF中,基于行为( ...

  4. AI公开课:19.05.29 浣军-百度大数据实验室主任《AutoDL 自动化深度学习建模的算法和应用》课堂笔记以及个人感悟

    AI公开课:19.05.29 浣军 百度大数据实验室主任<AutoDL 自动化深度学习建模的算法和应用>课堂笔记以及个人感悟 导读        浣军博士,汉族,1975年出生于江苏苏州, ...

  5. 推荐系统常用的推荐算法

    转载自  推荐系统常用的推荐算法 一.推荐系统概述和常用评价指标 1.1 推荐系统的特点 在知乎搜了一下推荐系统,果真结果比较少,显得小众一些,然后大家对推荐系统普遍的观点是: (1)重要性UI> ...

  6. 【干货】推荐系统中的机器学习算法与评估实战

    [导读]推荐系统是机器学习技术在企业中最成功和最广泛的应用之一.本文作者结合MLMU演讲[1]的Slides,对推荐系统的算法.评估和冷启动解决方案做了详细的介绍. 作者 | Pavel Kordík ...

  7. 破解YouTube、Facebook推荐系统背后的那些算法

    最初看到这篇文章是@fengyoung 在Facebook上分享的,觉得题目很有意思就看了一遍,看完后感觉很有启发,遂决定翻译一下让更多人看到. 这篇文章内所指的算法包含多个YouTube增长类算法( ...

  8. 吴恩达|机器学习作业8.1.推荐系统(协同过滤算法)

    8.1.推荐系统(协同过滤算法) 1)题目: 在本次练习中,你将实现协同过滤算法并将它运用在电影评分的数据集上,最后根据新用户的评分来给新用户推荐10部电影.这个电影评分数据集由1到5的等级组成.数据 ...

  9. Coggle推荐系统学习任务1:推荐系统基础

    任务1:推荐系统基础 1.推荐系统与常见的结构化问题的区别是什么? 推荐系统是用来解决信息过载的手段. 作为信息消费者,如何从大量信息中找到自己感兴趣的信息是一件非常困难的事情;作为信息生产者, 如何 ...

最新文章

  1. 5 行代码实现图像分割
  2. 乔布斯当年是这样面试我的,你能挺到哪一步?
  3. 遍历替换字符串中特定字符
  4. 2021年春季学期-信号与系统-第二次作业参考答案-第四小题
  5. Android Studio 中的FindBugs插件使用,轻松帮你发现Bug (转)
  6. 学点数学(4)-协方差矩阵
  7. qt中设置父窗口中某一控件样式后,子窗口中某一控件也随父控件样式
  8. Linux之HugePages快速配置
  9. Shiro【授权过滤器、与ehcache整合、验证码、记住我】
  10. 4.你认为一些军事方面的软件系统采用什么样的开发模型比较合适?
  11. 在Amazon S3 上架设静态网站
  12. CPU瓶颈(五)--过度编译与不必要重复编译的解决方案
  13. 用Java代码实现学生管理系统
  14. HEX、RGB颜色表
  15. 自己动手写一个分库分表中间件(五)分布式事务问题解决思路<一>基于 Spring 编程式事务
  16. mma7660(重力感应传感器)
  17. 【esp32-s3】6.2 文件系统——文件夹列表
  18. 川大高分子为什么不学c语言,四川大学软件工程考研难吗
  19. FastAPI 教程翻译 - 用户指南 26 - 安全性
  20. 2021全球程序员收入报告,字节跳动年薪274万元排第5!

热门文章

  1. 计算机主机板的各种接口安装,计算机主板上的插座或接口有哪些
  2. 【转】再谈USB 3.0的实际传输速度
  3. Kubernetes 核心组件:API Server 概念/功能
  4. 一阶电路暂态响应的结果分析。_线性动态电路可视化分析
  5. Ultimate Retouch 3.7.59汉化版|影楼终极人像精修磨皮扩展支持2019
  6. python 计算一个字符串中所有数字的和
  7. 2019年旅韩华侨华人新春招待会举行
  8. 清华大学王青计算机系,物理系邀请清华大学王青教授做学术讲座
  9. linux获取图标接口,Linux ioctl接口
  10. 河北省职称计算机35题,河北省职称计算机考试真题选读.doc