推荐系统实践 0x09 基于图的模型
用户行为数据的二分图表示
用户的购买行为很容易可以用二分图(二部图)来表示。并且利用图的算法进行推荐。基于邻域的模型也可以成为基于图的模型,因为基于邻域的模型都是基于图的模型的简单情况。我们可以用二元组\((u,i)\)来表示用户\(u\)对物品\(i\)有过购买行为,这样的话数据集可以用一个二分图来表示。我这里尝试画一个二分图(有点丑,不要介意哈):
A(A) -->a[a]
A(A) -->b[b]
A(A) -->d[d]
B(B) -->b[b]
B(B) -->c[c]
左边是用户节点,右边是物品节点。连线代表用户对物品有过购买行为。
基于图的推荐算法
我们把个性化推荐算法放在二分图当中,给用户推荐物品就转变成了度量用户节点和商品节点的相关性,相关性越高的物品在推荐列表当中的权重就越大。一般来说顶点相关性取决于三个方面:
- 两个顶点之间的路径数;
- 两个顶点之间路径的长度;
- 两个顶点之间的路径经过的顶点。
相关性高的一对顶点一般具有如下特征:
- 两个顶点之间有很多路径相连;
- 连接两个顶点之间的路径长度都比较短;
- 连接两个顶点之间的路径不会经过出度比较大的顶点。
基于上面3个主要因素,研究人员设计了很多计算图中顶点之间相关性的方法。下一节将介绍一种基于随机游走的PersonalRank算法。
PersonalRank
假设要给用户\(u\)进行个性化推荐,可以从用户\(u\)对应的节点\(v_u\)开始在用户物品二分图上进行随机游走。游走到任何一个节点时,首先按照概率\(\alpha\)决定是继续游走,还是停止这次游走并从\(v_u\)节点开始重新游走。如果决定继续游走,那么就从当前节点指向的节点中按照均匀分布随机选择一个节点作为游走下次经过的节点。这样,经过很多次随机游走后,每个物品节点被访问到的概率会收敛到一个数。最终的推荐列表中物品的权重就是物品节点的访问概率。
\mathrm{PR}(V)=\left\{
\begin{aligned}
\alpha \sum_{v' \in \mathrm{in}(v)}\frac{\mathrm{PR}(v')}{|\mathrm{out}(v')|}\quad (v \ne v_u)\\
(1-\alpha)+\alpha\sum_{v' \in \mathrm{in}(v)}\frac{\mathrm{PR}(v')}{|\mathrm{out}(v')|}\quad (v=v_u)
\end{aligned}
\right.
\end{equation}
\]
用代码来表示:
def PersonalRank(G, alpha, root):
rank = dict()
rank = {x:0 for x in G.keys()}
rank[root] = 1
for k in range(20):
tmp = {x:0 for x in G.keys()}
for i, ri in G.items():
for j, wij in ri.items():
if j not in tmp:
tmp[j] = 0
tmp[j] += 0.6 * rank[i] / (1.0 * len(ri))
if j == root:
tmp[j] += 1 - alpha
rank = tmp
return rank
虽然PersonalRank算法可以通过随机游走进行比较好的理论解释,但该算法在时间复杂度上有明显的缺点。因为在为每个用户进行推荐时,都需要在整个用户物品二分图上进行迭代,直到整个图上的每个顶点的PR值收敛。这一过程的时间复杂度非常高,不仅无法在线提供实时推荐,甚至离线生成推荐结果也很耗时。为了解决PersonalRank每次都需要在全图迭代并因此造成时间复杂度很高的问题,这里给出 两种解决方案。第一种很容易想到,就是减少迭代次数,在收敛之前就停止。这样会影响最终的 精度,但一般来说影响不会特别大。另一种方法就是从矩阵论出发,重新设计算法。
我们将PR算法设计成矩阵的形式,令\(M\)为二分图的转移概率矩阵,即
\]
那么迭代公式修改为:
\]
我们解一下这个方程
\]
这里的\((1-\alpha M^T)\)是稀疏矩阵,对其快速求逆即可。
后记
最近这两天出去过节了,断更了几天,我又开始继续更新这个系列了。这个系列后续可能就比较快的更新完,再说一个好消息,更新完这个系列之后,王喆编著的《深度学习推荐系统》以及相关的实践课程视频我也买了,将继续更新《深度学习推荐系统》以及实践视频课的读书笔记,大家可以关注一下,敬请期待。
推荐系统实践 0x09 基于图的模型的更多相关文章
- 推荐系统实践 0x07 基于邻域的算法(2)
基于邻域的算法(2) 上一篇我们讲了基于用户的协同过滤算法,基本流程就是寻找与目标用户兴趣相似的用户,按照他们对物品喜好的对目标用户进行推荐,其中哪些相似用户的评分要带上目标用户与相似用户的相似度作为 ...
- 推荐系统| ② 离线推荐&基于隐语义模型的协同过滤推荐
一.离线推荐服务 离线推荐服务是综合用户所有的历史数据,利用设定的离线统计算法和离线推荐算法周期性的进行结果统计与保存,计算的结果在一定时间周期内是固定不变的,变更的频率取决于算法调度的频率. 离线推 ...
- 推荐系统实践 0x06 基于邻域的算法(1)
基于邻域的算法(1) 基于邻域的算法主要分为两类,一类是基于用户的协同过滤算法,另一类是基于物品的协同过滤算法.我们首先介绍基于用户的协同过滤算法. 基于用户的协同过滤算法(UserCF) 基于用户的 ...
- 推荐系统之基于图的推荐:基于随机游走的PersonalRank算法
转自http://blog.csdn.net/sinat_33741547/article/details/53002524 一 基本概念 基于图的模型是推荐系统中相当重要的一种方法,以下内容的基本思 ...
- DCOS实践分享(1):基于图形化模型设计的应用容器化实践
2015年11月29日,Mesos Meetup 第三期 - 北京技术沙龙成功举行.本次活动由数人科技CTO 肖德时 和 Linker Networks 的 Sam Chen 一起组织发起. 在这次m ...
- SOA实践之基于服务总线的设计
在上文中,主要介绍了SOA的概念,什么叫做“服务”,“服务”应该具备哪些特性.本篇中,我将介绍SOA的一种很常见的设计实践--基于服务总线的设计. 基于服务总线的设计 基于总线的设计,借鉴了计算机内部 ...
- 用PersonalRank实现基于图的推荐算法
今天我们讲一个下怎么使用随机游走算法PersonalRank实现基于图的推荐. 在推荐系统中,用户行为数据可以表示成图的形式,具体来说是二部图.用户的行为数据集由一个个(u,i)二元组组成,表示为用户 ...
- TF-IDF计算方法和基于图迭代的TextRank
文本处理方法概述 说明:本篇以实践为主,理论部分会尽量给出参考链接 摘要: 1.分词 2.关键词提取 3.主题模型(LDA/TWE) 4.词的两种表现形式(词袋模型和分布式词向量) 5.关于文本的特征 ...
- 基于图的异常检测(三):GraphRAD
基于图的异常检测(三):GraphRAD 风浪 一个快乐的数据玩家/风控/图挖掘 24 人赞同了该文章 论文:<GraphRAD: A Graph-based Risky Account Det ...
随机推荐
- Java SPI 机制实现解耦与本地化
SPI 是 Java 提供的一种服务加载方式,全名为 Service Provider Interface,可以避免在 Java 代码中写死服务的提供者,而是通过 SPI 服务加载机制进行服务的注册和 ...
- Python的Opencv库怎么装
原文章写于时间2019.4 当时鼓捣Opencv库弄了好长时间,前前后后弄了五天,找了好多帖子不知道删除重装了多少次,现在把我试出来正确的方法给大家分享一下. 1.Pycharm 我用的是win10系 ...
- .NET Core如何进行请求转发?
前言 冒个泡,近日,有关注我公众号的小伙伴私信我,遇到一个问题搞了很久没解决,此问题具有参考意义,这里跟大家分享下,希望对后续可能有需要的你能有所参考和帮助. 请求转发问题 内网环境跟外网隔离,现在外 ...
- STC转STM32第一次开发
目录 前言 项目 1. 模数转换,并通过OLED屏显示出来 需求: 实验器材: 接线: 源程序: 成品: 2. 简易频率计(0.1-10MHZ) 需求: 原理: 实验器材: 接线: 源程序: 写在结尾 ...
- 【QT】子类化QObject+moveToThread实现多线程
往期链接: <QThread源码浅析> <子类化QThread实现多线程> 从往期<QThread源码浅析>可知,在Qt4.4之前,run 是纯虚函数,必须子类化Q ...
- 【SpringBoot】02.编写HelloWorld
1.编写一个返回HelloWorld的Controller @Controller public class HelloWorld { @ResponseBody @RequestMapping(&q ...
- 左值 lvalue,右值 rvalue 和 移动语义 std::move
参考文章: [1] 基础篇:lvalue,rvalue和move [2] 深入浅出 C++ 右值引用 [3] Modern CPP Tutorial [4] 右值引用与转移语义 刷 Leetcode ...
- codeforces 1425E,一万种情况的简单题
大家好,欢迎阅读codeforces专题. 我们今天选中的是codeforces 1425场比赛的E题,这是一场印尼多校联合的ICPC的练习赛.ACM赛制,难度也比较近似.我们今天选择的是其中的一道M ...
- 设计师建筑师太难了,既要学BIM、无人机,还要学GIS!
我,一个平平无奇的城市规划专业(建筑专业.路桥专业)大学生,还有一年要毕业,很担心工作以后受到社会的毒打,遂问导师和学长,我要自学点什么技能和软件? 学长A:CAD,SketchUp,PS我都很熟练了 ...
- 80%人会答错的JS基础面试题
这套题第一道题难度最大,我第一遍的回答居然也错的,我悲观估计80%的JavaScript从业人员都答不完全准确 []==![] 得到什么? false, 你还需要看看基础 true, 恭喜你答对了,你 ...