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

一、推荐的概述

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

(图片来自参考文献)

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

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

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

1、PersonalRank算法简介

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

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

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

2、实验过程

2.1、实验结果:

根据最终的商品的打分,我们对其进行排序,由于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

参考文献

  • 《推荐系统实践》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI研习社

博客 | DeepMind 开源TRFL,又一个强化学习复现、创新好帮手

雷锋网 AI 科技评论按:继今年 8 月谷歌开源发布了专为学术研究人员设计的简单但鲁棒的强化学习框架「多巴胺」(Dopamine)之后,早已被谷歌母公司收购但保...

1164
来自专栏大数据文摘

只需看一眼,伯克利最新机器人就可以copy你的动作!

通过观察另一个人的做法来学习一项新技能,即模仿的能力,是人类和动物智力的关键部分。我们能让机器人做同样的事情吗?

800
来自专栏AI科技评论

动态 | 谷歌也发布了Web前端机器学习库,就叫deeplearn.js

AI 科技评论按:在人工智能时代,不管是音箱、手机、汽车、app,自家产品没有用上深度学习都不好意思跟别人打招呼;另外,谷歌和 Facebook 都分别在 Te...

3606
来自专栏AI研习社

博客 | 「压缩」会是机器学习的下一个杀手级应用吗?

雷锋网AI 科技评论按:机器学习的研究正进行的如火如荼,各种新方法层出不穷。尽管这样,还有一个问题摆在面前,研究这些算法对于现实有什么用。特别是当讨论起机器学习...

854
来自专栏美团技术团队

【沙龙干货】主题四:美团外卖中的单量预估及列表优化

分享内容 ---- 相对于团购,外卖有三个特点:移动化、本地化、场景化。 移动化,从2011年开始到2015年移动战略是逐渐上升的。对应外卖2014年移动占比一...

3453
来自专栏专知

微软研究院开源项目TextWorld:可用于强化学习训练的文本游戏

【导读】可以说,对话系统和自然语言处理(NLP)是现代人工智能(AI)中应用最广泛的部分。 尽管NLP研究不断取得进展,但和人相比,今天的大多数对话系统仍然相当...

791
来自专栏AI科技评论

业界 | 「压缩」会是机器学习的下一个杀手级应用吗?

机器学习的研究正进行的如火如荼,各种新方法层出不穷。尽管这样,还有一个问题摆在面前,研究这些算法对于现实有什么用。特别是当讨论起机器学习在手机和其他设备上的应用...

802
来自专栏大数据文摘

OpenAI联手DeepMind发布增强学习新突破,最佳奖励函数可智能化生成(附论文)

1403
来自专栏机器之心

学界 | 让好奇心驱动人工智能:UC Berkeley提出自监督预测算法

选自arXiv 作者:Deepak Pathak等 机器之心编译 参与:李泽南 无监督学习一直被认为是让人工智能在真实世界中有效工作的研究方向,此前大多数研究都...

36411
来自专栏ATYUN订阅号

亚马逊团队改进Alexa语音助手自动选择技能,错误率减少了12%

亚马逊的Alexa助手拥有超过50000个技能,如果你不确定从哪里开始,那么你也很难发现新的用途,在博客文章中,亚马逊Alexa AI部门的数据科学家Young...

882

扫码关注云+社区

领取腾讯云代金券