首页 > 编程语言 >推荐算法——基于图的推荐算法PersonalRank算法

推荐算法——基于图的推荐算法PersonalRank算法

时间:2023-06-14 18:35:47浏览次数:37  
标签:PR tmp PersonalRank 推荐 用户 商品 算法


一、推荐的概述

在推荐系统中,通常是要向用户推荐商品,如在购物网站中,需要根据用户的历史购买行为,向用户推荐一些实际的商品;如在视频网站中,推荐的则是不同的视频;如在社交网站中,推荐的可能是用户等等,无论是真实的商品,还是视频,再或者是用户,都可以假设成一种物品,如下图所示:

推荐算法——基于图的推荐算法PersonalRank算法_协同过滤


(图片来自参考文献)

在上图中,左侧的A,B,C表示的是三个用户,右侧的a,b,c,d表示的是四个商品,中间的连线表示用户与商品之间有过行为,或者是购买或者是打分,推荐的目的是从商品列表中向指定的用户推荐用户未行为过的商品。

推荐的算法有很多,包括协同过滤(基于用户的协同过滤和基于物品的协同过滤)以及其他的一些基于模型的推荐算法。

二、基于图的推荐算法PersonalRank算法

1、PersonalRank算法简介

在协同过滤中,主要是将上述的用户和商品之间的关系表示成一个二维的矩阵(用户商品矩阵)。

而在基于图的推荐算法中,将上述的关系表示成二部图的形式,为用户A推荐商品,实际上就是计算用户A对所有商品的感兴趣程度。

PersonalRank算法对通过连接的边为每个节点打分,具体来讲,在PersonalRank算法中,不区分用户和商品,因此上述的计算用户A对所有的商品的感兴趣的程度就变成了对用户A计算各个节点B,C,a,b,c,d的重要程度。

PersonalRank算法的具体过程如下(对用户A来说):

  • 初始化:
    PR(A)=1,PR(B)=0,⋯,PR(d)=0
  • 开始在图上游走,每次选择PR值不为0的节点开始,沿着边往前的概率为α,停在当前点的概率为1−α:
  • 首先从A开始,从A到a和c的概率为0.5,则此时a和c的PR值为:PR(a)=PR(c)=α×PR(A)×0.5,A的PR值变成了1−α
  • 此时PR值不为0的节点为A,a,c,则此时从这三点出发,继续上述的过程,直到收敛为止。

由此可以得出以下的PR计算方法:



PR(v)=⎧⎩⎨⎪⎪α×∑v′∈in(v)PR(v′)|out(v′)|(1−α)+α×∑v′∈in(v)PR(v′)|out(v′)| if v≠vu if v=vu

2、实验过程

2.1、实验结果:

推荐算法——基于图的推荐算法PersonalRank算法_推荐系统_02

根据最终的商品的打分,我们对其进行排序,由于A用户对商品c和商品a有过行为,因此根据打分,为用户A推荐商品d。

2.2、实验代码

#coding=utf-8
def PersonalRank(G, alpha, root, max_step):
    rank = dict()  
    for x in G.keys():
        rank[x] = 0

    rank[root] = 1  

    for k in range(max_step):
        print str(k)
        tmp = dict()
            for x in G.keys():
                    tmp[x] = 0
            for i, ri in G.items():  
                    for j, wij in ri.items():
                if j not in tmp:
                    tmp[j] = 0
                        tmp[j] += alpha * rank[i] / (1.0 * len(ri))  
                if j == root:
                        tmp[j] += (1 - alpha)
        # coverage
        check = []
        for k in tmp.keys():
            check.append(tmp[k] - rank[k])

        if sum(check) <= 0.0001:
            break

            rank = tmp
        for n in rank.keys():
                    print "%s:%.3f \t"%(n, rank[n]),
        print
    return rank  


if __name__ == '__main__' :  
        G = {'A' : {'a' : 1, 'c' : 1},
         'B' : {'a' : 1, 'b' : 1, 'c':1, 'd':1},  
             'C' : {'c' : 1, 'd' : 1},  
             'a' : {'A' : 1, 'B' : 1},  
             'b' : {'B' : 1},  
             'c' : {'A' : 1, 'B' : 1, 'C':1},  
             'd' : {'B' : 1, 'C' : 1}} 
    items_dict = {'a':0,'b':0,'c':0,'d':0}

        rank = PersonalRank(G, 0.85, 'A', 50)
    for k in items_dict.keys():
        if k in rank:
            items_dict[k] = rank[k]
    #sort:
    result = sorted(items_dict.items(), key = lambda d: d[1], reverse=True)
    print "\nThe result:"
    for k in result:
        print "%s:%.3f \t"%(k[0], k[1]),
    print

参考文献

  • 《推荐系统实践》


标签:PR,tmp,PersonalRank,推荐,用户,商品,算法
From: https://blog.51cto.com/u_16161414/6479841

相关文章

  • 【数据结构与算法面试题】求和
    题目来源“数据结构与算法面试题80道”。问题分析:可以使用类的构造方法,在类的每次实例化对象时都会调用构造方法,那么只需要实例化n个对象,就会调用n次构造方法,这就模拟了循环的过程,此时,只需要有一个全局变量记录累加的值即可。方法:#include<stdio.h>classcalnum{ public: cal......
  • 专访快手传输算法负责人周超博士:LAS标准的推出离不开信念感
    6月21日,快手正式对外发布基于流式的直播多码率自适应标准LAS(LiveAdaptiveStreaming),用于提供低延迟、平滑、流畅的直播多码率体验。LAS的端到端解决方案同时开源,包括服务端、客户端、业界领先的多码率自适应算法等,从而帮助业界实现零门槛接入和使用LAS。图:《搏击俱乐部》采访专家:......
  • java面试算法:设计搜索输入框的输入提示功能
    我们使用搜索引擎时,需要在搜索框输入关键字,当你在框中输入头几个字符时,搜索框会出现一个下拉框,里面包含着以当前输入字符为前缀的字符串,如果里面包含你想要输入的内容,那么你就可以直接选取,而不必要把关键字的所有字符依次输入,这种功能极大的提高了搜索体验。本次算法题的题目是,你如......
  • 策略模式:整体替换算法
    策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在策略模式中,我们定义了多个算法,并将每个算法封装在一个独立的类中(策略类),以便在运行时根据需要进行切换。这使得算法与调用其算法的客户端代码分离,从而实现了更高的灵活性和可维护性。主要实现方式:1策略接口->n*具......
  • 算法面试:根据前序遍历结果序列和中序遍历结果序列重构二叉树
    对不同结构的二叉树进行前序,后序或中序遍历时,得到的结果可以是相同的,例如:上面三种结构的二叉树在进行前序遍历时,得到的序列都是:{3,4,5},但如果给定两种遍历序列,例如再加上中序遍历序列:{4,3,5},那么二叉树的结构就可以唯一确定了,满足这两种遍历序列的二叉树只能是中间那颗二叉树。于......
  • 区块链底层算法基础:有限群及其代码实现
    区块链完全可以说是人类智慧的结晶,它的诞生是人类科技文明发展到一定程度的结果展现。区块链的功能得以实现要有赖于加解密技术的发展,而后者又来源于数论和抽象代数几百年的发展,因此要把握区块链的技术思路,不了解其加解密原理,那你就不可能掌握区块链的技术精髓,所以我们庖丁解牛,一点......
  • 算法面试题:逆时针打印二叉树外围边缘
    给定一颗二叉树如下:要求把二叉树的外边缘按照逆时针的方式打印出来,也就是你需要打印出以下节点:314,6,271,28,0,17,641,257,29,278,7整个二叉树的外边缘分三部分,第一部分是最左边缘,也就是节点314,6,271,28。第二部分是底边节点,他们分别是0,17,641,257,29。第三部分是右边缘,他们分......
  • 面试算法:在整形数组中构建元素之和能整除数组长度的子集
    更详细的讲解和代码调试演示过程,请参看视频如何进入google,算法面试技能全面提升指南假设A是一个整数数组,长度为n,数组中的元素可能是重复的。设计一个算法,找到一系列下标的集合I={i(0),i(1),i(2)….i(n)}.使得(A[i(0)]+A[i(1)]+…A[i(n)])modn=0.例如假定A={711......
  • 面试算法:计算堆栈当前元素的最大值
    更详细的讲解和代码调试演示过程,请参看视频如何进入google,算法面试技能全面提升指南有一道堆栈相关算法题,我被面试过两次以上,看似其在算法面试中出现的概率很高,由此值得我们好好分析下。题目是这样的:对于堆栈的常用操作有,pop弹出堆栈顶部的元素;push向堆栈压入一个元素;peek获......
  • 算法面试:单向链表节点的奇偶排序。
    给定一个单项链表,要求实现一个算法,把链表分成两部分,前一部分全是下标为偶数的节点,后一部分全是下标为奇数的节点,例如给定链表为下图的第一个队列,要求编写一个算法,将链表转换为第二个队列:要求算法不能分配多余的内存,同时,在操作链表是,不能更改节点内部的内容,只能更改节点的next指针......