在一个推荐系统中,用一个二分图来代表用户以及商品,它们彼此之间用边连接,构成购买关系。

在图论中,二分图是一类特殊的图,又称为二部图、偶图、双分图。二分图的顶点可以分成两个互斥的独立集 U 和 V 的图,使得所有边都是连结一个 U 中的点和一个 V 中的点。顶点集 U、V 被称为是图的两个部分。等价的,二分图可以被定义成图中所有的环都有偶数个顶点[1][2]。 二分图维基百科


我们的目标是图上的近邻性研究,即如果一个用户购买了商品Q,我们应该向他推荐什么其他商品。
直观想法是,如果商品P和商品Q被相似的用户购买,那么当某用户购买了Q时,我们可以向其推荐商品P。

那么怎样衡量两个商品的相关性呢?比如AA’与BB’哪一组的相关性更高?

此时我们当然可以说,如果两个商品之间的路径越短,两者越相关,如上r(AA’) > r(BB’)。

如果照上面shortest path的判断标准,AA’与CC’相关性是一样吗?CC’最短路径相同,但是拥有两个公共的邻居

当更复杂的情况呢?DD‘也拥有两个公共的邻居,但是邻居比较多金,买了许多的商品。

那么我们是怎样衡量图上的相似性的呢?
回顾之前的PageRank,我们是对整个graph的所有节点做一个重要性排序,中间会遇到死循环和deadnode的问题,因此会随机向graph的某个节点转发,跳出去。
而作为一个个性化的pagerank,personalized PageRank是page rank的一个特例,它teleport转发的集合就不再是整个network的节点,而是特定的集合S,然后根据与S的相关性,对节点进行排序。
而如果是random walk with restarts的话,此时S中便仅有唯一的节点Q,放在推荐的场景下,我么的目标就是如何找到与起点S = {Q}最相关的节点。

它的主要的idea就是random walks,即每个节点有一个重要性得分(初始值平均?),然后像page rank一样,重要性得分被平均地通过边分配到它的邻居上。对于给定的QUERY_NODES集合,我们模拟整个random walk的流程。
我们随机跳忘一个邻居,并且维护一个节点的访问次数变量,如果访问到自己,则自己的count数目+1,然后,有ALPHA的概率跳回到QUERY_NODES集合。经过t个steps后,拥有最高count的节点就是与QUERY_NODES最相关的节点,
同上
伪代码如上,此时QUERY_NODES只有一个商品Q
有两个疑问:

  • weight是怎么用的?sample_by_weight是初始设置的吗
  • 首先通过item选取一个与它相连的随机邻居user,然后再用过这个user选取一个与它相连的随机邻居商品,将该商品count + 1, 但这个梗商品可以是原来的item吗?比如Q,但按道理排序是把Q排除在外的啊?哪有自己和自己比较相似的道理的
    这样,我们就能商品的访问次数,找到与query item Q最相关的商品,下一次当一个用户购买了商品Q之后,可以向其推荐该商品。
import numpy as np
import networkx as nx
import randomfrom scipy.sparse import spdiags
from functools import partialdef rwr(x, T, R = 0.2, max_iters = 100):'''This function will perform the random walk with restart algorithm on a given vector x and the associatedtransition matrix of the networkargs:x (Array) : Initial vectorT (Matrix) : Input matrix of transition probabilitiesR (Float) : Restart probabilitiesmax_iters (Integer) : The maximum number of iterationsreturns:This function will return the result vector x'''old_x = xerr = 1.for i in range(max_iters):x = (1 - R) * (T.dot(old_x)) + (R * x)err = np.linalg.norm(x - old_x, 1)if err <= 1e-6:breakold_x = xreturn xdef run_rwr(g, R, max_iters):'''This function will run the `rwr` on a networkargs:g (Network) : This is a networkx network you want to run rwr onR (Float) : The restart probabilitymax_iters (Integer) : The maximum number of iterationsreturns:This fuunction will return a numpy array of affinities where each element in the array will representthe similarity between two nodes'''A = nx.adjacency_matrix(g, weight = 'weight')m,n = A.shaped = A.sum(axis = 1)d = np.asarray(d).flatten(())d = np.maximum(d, np.ones(n))invd = spdiags(1.0 / d, 0, m, n)T = invd.dot(A)rwr_fn = partial(rwr, T = T, R = R, max_iters = max_iters)aff = [rwr_fn(x) for x in np.identity(m)]aff = np.array(aff)return affif __name__ == '__main__':# for simplicity let's use a fully connected graph and randomly remove edges from itn, n_remove = 40, 250G = nx.Graph()G.add_nodes_from(range(n))G = nx.complete_graph(n, create_using=G)remove = random.sample(G.edges(),k=n_remove)G.remove_edges_from(remove)# apply random walk with restart on this networkaff = run_rwr(G, R = 0.2, max_iters=1000)

代码来自: https://towardsdatascience.com/random-walks-with-restart-explained-77c3fe216bca
那这么做的合理性在哪儿呢?
因为它考虑了多种方面的相似性
比如上面提到的路径,直接或者间接的连接,节点的度。
具体来说,如果这个商品购买量很大。那么被推荐的概率也能相应更高,因为它更有可能随机游走到这儿,当然如果与Q的距离越近,当让更容易被推荐,如果P和Q拥有相似的用户群,那么也更容易被推荐,故在这种重启的随机游走中,这些因素都有被考虑在内。

因此可以将personalized pagerank和random walk with restarts视为page rank的变种,核心区别就是转发的节点的范围以及概率,pagerank是以均等的机会随机向网络中的所有节点转发,而topic-specific pagerank即personalized pagerank向一特定集合的节点进行转发,并且概率各不一样,而在random walk with restarts中,仅向同一个节点进行转发。

Random walk with restarts: 从一个节点出发。在每一步游走时,面临两个选择:
[1] 移动到一个随机选择的邻居节点
[2] 跳回原点
rwr最初是为了图像分割算法而提出来的,它反复地探究一个网络的总体结构去估计两个节点之间的亲和力程度。这个过程反复迭代进行下去,直到走遍所有的节点,此时得到的概率向量包含所有节点与起点的亲和力分数。另外rwr的起点也可以选择一个起点集合(多个起点组成的集合)
对于一个N个节点的图来说,如果让每个节点都作为起点进行一次rwr算法,就可以得到N个N∗1N*1N∗1的概率向量,其中每个向量表示该起点与其他节点的亲和力程度。将这个N个列向量结合。就可以得到一个N∗NN*NN∗N的亲和力矩阵。

Machine Learning with Graphs 之 Random Walk with Restarts and Personalized PageRank相关推荐

  1. OGB数据集《Open Graph Benchmark: Datasets for Machine Learning on Graphs》

    OGB数据集 之前一直在几个玩具数据集上跑模型,发现了很多问题.看了OGB论文里的一些描述,我也深有体会,感觉很多东西都说到我心里去了.预计再发展几年吧,OGB也能像ImageNet那样,成为图表示学 ...

  2. 原创 | 斯坦福Machine Learning with Graphs 学习笔记(第二讲)

    作者:于媛,十三鸣 本文长度为3300字,建议阅读10+分钟 本文为大家介绍常用的网络属性和经典的网络模型. 标签:机器学习 [ 导读 ]在研究网络的时候,我们往往需要从结构层面对网络进行分析,网络属 ...

  3. Machine Learning with Graphs 之 Traditional Methods for Machine Learning in Graphs

    文章目录 一. Overview 二.Node Level Tasks and Features 2.1 overview 2.2 Node degree 2.3 Node Centrality Ei ...

  4. CS224W: Machine Learning with Graphs - 09 How Expressive are GNNs

    How Expressive are GNNs 0. Theory of GNNs How powerful are GNNs? Many GNN models have been proposed ...

  5. 原创 | 斯坦福Machine Learning with Graphs 学习笔记(第一讲)

    作者:林夕 本文长度为2900字,建议阅读9分钟 本文为大家介绍图网络的基本概念.网络的应用以及图的结构. 标签:机器学习 目录 一.Why Networks 二.网络的应用     2.1 应用领域 ...

  6. CS244W: Machine Learning with Graphs (3) ——网络中的Motifs和结构

    一.子网络(Subnetworks) 子网络或子图是组成网络的基础模块,它们同样可以帮助我们表征和区分网络. 例如,节点数为3的有向子图的所有可能情况(不包含同构的子图)如下: 如果使用这些三个节点的 ...

  7. 全球名校AI课程库(20)| Stanford斯坦福 · 图机器学习课程『Machine Learning with Graphs』

  8. 图机器学习(Graph Machine Learning)- 第二章 图机器学习简介 Graph Machine Learning

    第二章 图机器学习简介 Graph Machine Learning 文章目录 第二章 图机器学习简介 Graph Machine Learning 前言 1. 环境要求Technical requi ...

  9. 重启随机游走算法(RWR:Random Walk with Restart)

    重启随机游走算法(RWR:Random Walk with Restart) 1 pagerank算法的基本原理 Pagerank算法是Google的网页排名算法,由拉里佩奇发明.其基本思想是民主表决 ...

最新文章

  1. 算法工程师必知必会10大基础算法!
  2. 系统视频教学视频教程_太极拳教学视频教程,董氏太极拳基本功训练方法视频...
  3. 11.11.25 v2 done
  4. 基于 abp vNext 和 .NET Core 开发博客项目 - 集成Hangfire实现定时任务处理
  5. 创建型模式(一):FactoryMethod ( 工厂方法 )
  6. 【贪心】数据备份(P6320)
  7. win10禁止数字签名
  8. mysql innodb 并发 插入 慢_InnoDB并发插入,居然使用意向锁?
  9. 卷积和池化后特征图的大小~
  10. 所有关于php上传,关于php文件上传
  11. WinForm和WPF的区别
  12. Unity摄像机平滑处理跟随
  13. 打造智能化的园区管理系统
  14. 使用FCEUX调试器寻找并修改游戏初始物品
  15. 传奇登陆器 link.html 网页无法显示,打开登陆器后无法显示游戏各区列表的问题...
  16. mysql五日均线_mysql – 如何在SQL中的某个日期范围内执行移动平均线?
  17. 逍遥模拟器连接不到android,逍遥模拟器不能连上网怎么办?两招解决问题
  18. 七彩虹显卡软件测试,【七彩虹FM2A75评测】多款软件测试-中关村在线
  19. SAP MM MARD 表里的Storage Bin 字段
  20. c语言编程麦粒问题,c语言编程常见问题解析(资源泄漏)

热门文章

  1. elementUI实现table表头展示上、下角标
  2. 拉格朗日乘子法(自己总结一些要点)
  3. Ali-Perseus(擎天):统一深度学习分布式通信框架 [弹性人工智能]
  4. 项目经历 - 卷积网络识别古日文
  5. html语言如何排版,html语言,使用table排版.docx
  6. Spring5学习详细笔记
  7. Mac使用jd-gui启动报错 This program requires Java 1.8+
  8. Python调用OpenCV实现图像平滑处理
  9. echarts嵌套饼图自动动画_使用百度echarts制作可视化大屏——制作一个双层饼图...
  10. 毕业设计 STM32老人防摔倒报警系统 - 物联网 嵌入式 单片机