Machine Learning with Graphs 之 Random Walk with Restarts and Personalized PageRank

Machine Learning with Graphs 之 Random Walk with Restarts and Personalized PageRank_第1张图片
在一个推荐系统中,用一个二分图来代表用户以及商品,它们彼此之间用边连接,构成购买关系。

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

Machine Learning with Graphs 之 Random Walk with Restarts and Personalized PageRank_第2张图片
我们的目标是图上的近邻性研究,即如果一个用户购买了商品Q,我们应该向他推荐什么其他商品。
直观想法是,如果商品P和商品Q被相似的用户购买,那么当某用户购买了Q时,我们可以向其推荐商品P。
Machine Learning with Graphs 之 Random Walk with Restarts and Personalized PageRank_第3张图片
那么怎样衡量两个商品的相关性呢?比如AA’与BB’哪一组的相关性更高?
Machine Learning with Graphs 之 Random Walk with Restarts and Personalized PageRank_第4张图片
此时我们当然可以说,如果两个商品之间的路径越短,两者越相关,如上r(AA’) > r(BB’)。
Machine Learning with Graphs 之 Random Walk with Restarts and Personalized PageRank_第5张图片
如果照上面shortest path的判断标准,AA’与CC’相关性是一样吗?CC’最短路径相同,但是拥有两个公共的邻居
Machine Learning with Graphs 之 Random Walk with Restarts and Personalized PageRank_第6张图片
当更复杂的情况呢?DD‘也拥有两个公共的邻居,但是邻居比较多金,买了许多的商品。
Machine Learning with Graphs 之 Random Walk with Restarts and Personalized PageRank_第7张图片
那么我们是怎样衡量图上的相似性的呢?
回顾之前的PageRank,我们是对整个graph的所有节点做一个重要性排序,中间会遇到死循环和deadnode的问题,因此会随机向graph的某个节点转发,跳出去。
而作为一个个性化的pagerank,personalized PageRank是page rank的一个特例,它teleport转发的集合就不再是整个network的节点,而是特定的集合S,然后根据与S的相关性,对节点进行排序。
而如果是random walk with restarts的话,此时S中便仅有唯一的节点Q,放在推荐的场景下,我么的目标就是如何找到与起点S = {Q}最相关的节点。
Machine Learning with Graphs 之 Random Walk with Restarts and Personalized PageRank_第8张图片
它的主要的idea就是random walks,即每个节点有一个重要性得分(初始值平均?),然后像page rank一样,重要性得分被平均地通过边分配到它的邻居上。对于给定的QUERY_NODES集合,我们模拟整个random walk的流程。
我们随机跳忘一个邻居,并且维护一个节点的访问次数变量,如果访问到自己,则自己的count数目+1,然后,有ALPHA的概率跳回到QUERY_NODES集合。经过t个steps后,拥有最高count的节点就是与QUERY_NODES最相关的节点,
Machine Learning with Graphs 之 Random Walk with Restarts and Personalized PageRank_第9张图片同上
Machine Learning with Graphs 之 Random Walk with Restarts and Personalized PageRank_第10张图片伪代码如上,此时QUERY_NODES只有一个商品Q
有两个疑问:

  • weight是怎么用的?sample_by_weight是初始设置的吗
  • 首先通过item选取一个与它相连的随机邻居user,然后再用过这个user选取一个与它相连的随机邻居商品,将该商品count + 1, 但这个梗商品可以是原来的item吗?比如Q,但按道理排序是把Q排除在外的啊?哪有自己和自己比较相似的道理的
    Machine Learning with Graphs 之 Random Walk with Restarts and Personalized PageRank_第11张图片这样,我们就能商品的访问次数,找到与query item Q最相关的商品,下一次当一个用户购买了商品Q之后,可以向其推荐该商品。
import numpy as np
import networkx as nx
import random

from scipy.sparse import spdiags
from functools import partial

def 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 associated
    transition matrix of the network
    
    args:
        x (Array) : Initial vector
        T (Matrix) : Input matrix of transition probabilities
        R (Float) : Restart probabilities
        max_iters (Integer) : The maximum number of iterations
        
    returns:
        This function will return the result vector x
    '''
    
    old_x = x
    err = 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:
            break
        old_x = x
    return x
  
def run_rwr(g, R, max_iters):
    '''
    This function will run the `rwr` on a network
    
    args:
        g (Network) : This is a networkx network you want to run rwr on
        R (Float) : The restart probability
        max_iters (Integer) : The maximum number of iterations
        
    returns:
        This fuunction will return a numpy array of affinities where each element in the array will represent
        the similarity between two nodes
    '''
    
    A = nx.adjacency_matrix(g, weight = 'weight')
    m,n = A.shape
    
    d = 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 aff
  
if __name__ == '__main__':
    # for simplicity let's use a fully connected graph and randomly remove edges from it
    n, n_remove = 40, 250

    G = 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 network
    aff = run_rwr(G, R = 0.2, max_iters=1000)

代码来自: https://towardsdatascience.com/random-walks-with-restart-explained-77c3fe216bca
Machine Learning with Graphs 之 Random Walk with Restarts and Personalized PageRank_第12张图片那这么做的合理性在哪儿呢?
因为它考虑了多种方面的相似性
比如上面提到的路径,直接或者间接的连接,节点的度。
具体来说,如果这个商品购买量很大。那么被推荐的概率也能相应更高,因为它更有可能随机游走到这儿,当然如果与Q的距离越近,当让更容易被推荐,如果P和Q拥有相似的用户群,那么也更容易被推荐,故在这种重启的随机游走中,这些因素都有被考虑在内。
Machine Learning with Graphs 之 Random Walk with Restarts and Personalized PageRank_第13张图片
因此可以将personalized pagerank和random walk with restarts视为page rank的变种,核心区别就是转发的节点的范围以及概率,pagerank是以均等的机会随机向网络中的所有节点转发,而topic-specific pagerank即personalized pagerank向一特定集合的节点进行转发,并且概率各不一样,而在random walk with restarts中,仅向同一个节点进行转发。

Machine Learning with Graphs 之 Random Walk with Restarts and Personalized PageRank_第14张图片

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

你可能感兴趣的:(论文笔记,机器学习,图论)