推荐系统实践 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 ...
随机推荐
- 时间UTC格式装换php时间格式
date_default_timezone_get("UTC");date("Y-m-d", strtotime("2017-11-13T18:04: ...
- 循序渐进VUE+Element 前端应用开发(26)--- 各种界面组件的使用(2)
在我们使用Vue+Element开发前端的时候,往往涉及到很多界面组件的使用,其中很多直接采用Element官方的案例即可,有些则是在这个基础上封装更好利用.更少代码的组件:另外有些则是直接采用第三方 ...
- js &&与||的妙用
&&表达式中,若前一个为false则不会执行下去,||表达式中,一直寻找到true即停止 例:成长速度为5显示1个箭头,为10显示2个箭头,为 15显示3个箭头,其余显示0个箭头var ...
- .net core集成JWT(基础)
关于JWT的基本概念,如果有不清晰的同学,请点击这里,就不在这里赘述了.接下来聊聊JWT是怎么发挥作用的. 第一,安装nuget包 Microsoft.AspNetCore.Authenticatio ...
- PF_PACKET抓包mmap
PACKET套接口创建 内核函数packet_create处理PF_PACKET套接口的创建工作.其参数sock->type决定了采用哪一种工作模式,如果参数type为SOCK_PACKET即第 ...
- centos6 virbox安装
yum install kernel-devel yum update kernel* wget http://download.virtualbox.org/virtualbox/debian/or ...
- ceph客户端服务端属性匹配关系
ceph的server是定期会发布版本,而它的客户端是放到linux 内核当中的,一些属性的支持是依赖于内核版本的,这样就存在一些问题,一些功能后端支持,而客户端旧了:还有可能是客户端用的很新的内核, ...
- 西数WD2T硬盘分区对齐的方法
新购一个西数2T硬盘,也就是绿盘的那种,淘宝500左右,支持高级格式化. 到手以后,分区格式化,前几天格式化完成以后,fdisk -l 发现如下文字 引用 Partition 1 does not s ...
- Java POI 导出带有图片的word
1. 引入maven ,具体可以上github看一下,这里做简单的说明,是一个大神封装了一下 官方提供的语法 文本语法是 {{Text}} 图片语法是{{@Image}} 其他的自己去看官方文档 &l ...
- Kafka高性能揭秘:sequence IO、PageCache、SendFile的应用详解
大家都知道Kafka是将数据存储于磁盘的,而磁盘读写性能往往很差,但Kafka官方测试其数据读写速率能达到600M/s,那么为什么Kafka性能会这么高呢? 首先producer往broker发送消息 ...