用户行为数据的二分图表示

用户的购买行为很容易可以用二分图(二部图)来表示。并且利用图的算法进行推荐。基于邻域的模型也可以成为基于图的模型,因为基于邻域的模型都是基于图的模型的简单情况。我们可以用二元组\((u,i)\)来表示用户\(u\)对物品\(i\)有过购买行为,这样的话数据集可以用一个二分图来表示。我这里尝试画一个二分图(有点丑,不要介意哈):

graph LR
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\)节点开始重新游走。如果决定继续游走,那么就从当前节点指向的节点中按照均匀分布随机选择一个节点作为游走下次经过的节点。这样,经过很多次随机游走后,每个物品节点被访问到的概率会收敛到一个数。最终的推荐列表中物品的权重就是物品节点的访问概率。

\[\begin{equation}
\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\)为二分图的转移概率矩阵,即

\[M(v,v')=\frac{1}{\mathrm{out}(v)}
\]

那么迭代公式修改为:

\[r = (1-\alpha)r_0 + \alpha M^T r
\]

我们解一下这个方程

\[r = (1-\alpha)(1-\alpha M^T)^{-1}r_0
\]

这里的\((1-\alpha M^T)\)是稀疏矩阵,对其快速求逆即可。

后记

最近这两天出去过节了,断更了几天,我又开始继续更新这个系列了。这个系列后续可能就比较快的更新完,再说一个好消息,更新完这个系列之后,王喆编著的《深度学习推荐系统》以及相关的实践课程视频我也买了,将继续更新《深度学习推荐系统》以及实践视频课的读书笔记,大家可以关注一下,敬请期待。

推荐系统实践 0x09 基于图的模型的更多相关文章

  1. 推荐系统实践 0x07 基于邻域的算法(2)

    基于邻域的算法(2) 上一篇我们讲了基于用户的协同过滤算法,基本流程就是寻找与目标用户兴趣相似的用户,按照他们对物品喜好的对目标用户进行推荐,其中哪些相似用户的评分要带上目标用户与相似用户的相似度作为 ...

  2. 推荐系统| ② 离线推荐&基于隐语义模型的协同过滤推荐

    一.离线推荐服务 离线推荐服务是综合用户所有的历史数据,利用设定的离线统计算法和离线推荐算法周期性的进行结果统计与保存,计算的结果在一定时间周期内是固定不变的,变更的频率取决于算法调度的频率. 离线推 ...

  3. 推荐系统实践 0x06 基于邻域的算法(1)

    基于邻域的算法(1) 基于邻域的算法主要分为两类,一类是基于用户的协同过滤算法,另一类是基于物品的协同过滤算法.我们首先介绍基于用户的协同过滤算法. 基于用户的协同过滤算法(UserCF) 基于用户的 ...

  4. 推荐系统之基于图的推荐:基于随机游走的PersonalRank算法

    转自http://blog.csdn.net/sinat_33741547/article/details/53002524 一 基本概念 基于图的模型是推荐系统中相当重要的一种方法,以下内容的基本思 ...

  5. DCOS实践分享(1):基于图形化模型设计的应用容器化实践

    2015年11月29日,Mesos Meetup 第三期 - 北京技术沙龙成功举行.本次活动由数人科技CTO 肖德时 和 Linker Networks 的 Sam Chen 一起组织发起. 在这次m ...

  6. SOA实践之基于服务总线的设计

    在上文中,主要介绍了SOA的概念,什么叫做“服务”,“服务”应该具备哪些特性.本篇中,我将介绍SOA的一种很常见的设计实践--基于服务总线的设计. 基于服务总线的设计 基于总线的设计,借鉴了计算机内部 ...

  7. 用PersonalRank实现基于图的推荐算法

    今天我们讲一个下怎么使用随机游走算法PersonalRank实现基于图的推荐. 在推荐系统中,用户行为数据可以表示成图的形式,具体来说是二部图.用户的行为数据集由一个个(u,i)二元组组成,表示为用户 ...

  8. TF-IDF计算方法和基于图迭代的TextRank

    文本处理方法概述 说明:本篇以实践为主,理论部分会尽量给出参考链接 摘要: 1.分词 2.关键词提取 3.主题模型(LDA/TWE) 4.词的两种表现形式(词袋模型和分布式词向量) 5.关于文本的特征 ...

  9. 基于图的异常检测(三):GraphRAD

    基于图的异常检测(三):GraphRAD 风浪 一个快乐的数据玩家/风控/图挖掘 24 人赞同了该文章 论文:<GraphRAD: A Graph-based Risky Account Det ...

随机推荐

  1. MIPS学习笔记(一)

    写在前面 本文是根据"MIPS Assembly Language Programming CS50 Discussion and Project Book. Daniel J. Ellar ...

  2. Java的类加载器有几种?什么是双亲委派机制?

    一.JAVA类加载器包括几种? 启动类加载器 bootstrap class loader 启动类加载器主要加载的是JVM自身需要的类,这个类加载是用C++语言实现的,是虚拟机自身的一部分,它负责将 ...

  3. uniapp微信小程序获取当前用户手机号码(前端)

    按钮触发获取用户信息 uniapp中与微信小程序官网所写会不同, <button open-type="getPhoneNumber" @getphonenumber=&qu ...

  4. git rebase的时候捅娄子了,怎么办?在线等……

    大家在使用git的过程当中有闯过祸吗? 我闯过,我闯的第一个祸就是使用git rebase造成的,虽然后来最终还是解决了,但是还是给我吓得不轻.当时的事情是这样的. 我们来看下这张图: 简单解释一下这 ...

  5. C# 集合类(三)

    C# 集合类自己经常用到: 数组(Array).动态数组(ArrayList).列表(List).哈希表(Hashtable).字典(Dictionary),对于经常使用的这些数据结构,做一个总结,便 ...

  6. 基于tensorflow的bilstm_crf的命名实体识别(数据集是msra命名实体识别数据集)

    github地址:https://github.com/taishan1994/tensorflow-bilstm-crf 1.熟悉数据 msra数据集总共有三个文件: train.txt:部分数据 ...

  7. windows端口占用和进程定位

    问题:Error was Port already in use: 40001 1. netstat -ano|findstr "40001" TCP 127.0.0.1:1404 ...

  8. MyBatis 中 @Param 注解的四种使用场景

    https://juejin.im/post/6844903894997270536 第一种:方法有多个参数,需要 @Param 注解 第二种:方法参数要取别名,需要 @Param 注解 第三种:XM ...

  9. 当年使用dpdk干的事

    mark一下  晚点上传 先不上传 ....0727

  10. 理解 Linux 的硬链接与软链接(转)

    Linux 的文件与目录 现代操作系统为解决信息能独立于进程之外被长期存储引入了文件,文件作为进程创建信息的逻辑单元可被多个进程并发使用.在 UNIX 系统中,操作系统为磁盘上的文本与图像.鼠标与键盘 ...