推荐算法——基于图的推荐算法PersonalRank算法
时间:2022-05-04
本文章向大家介绍推荐算法——基于图的推荐算法PersonalRank算法,主要内容包括一、推荐的概述、二、基于图的推荐算法PersonalRank算法、2、实验过程、参考文献、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
一、推荐的概述
在推荐系统中,通常是要向用户推荐商品,如在购物网站中,需要根据用户的历史购买行为,向用户推荐一些实际的商品;如在视频网站中,推荐的则是不同的视频;如在社交网站中,推荐的可能是用户等等,无论是真实的商品,还是视频,再或者是用户,都可以假设成一种物品,如下图所示:
(图片来自参考文献)
在上图中,左侧的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
参考文献
- 《推荐系统实践》
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 显示DataGrid序号的一个适用的方法
- SAP Spartacus cms-components.service.ts里的config.cmsComponents
- ng-template和ng-container的嵌套使用
- SAP Spartacus pageSlot一览
- Angular @Hostbinding工作原理
- Python干货 | 遥感影像拼接
- SAP Spartacus 自定义指令的实现以及通过@HostBinding实现属性绑定
- Python气象绘图教程—(十九)剖面图
- Angular DefaultDomRenderer2.setProperty
- 在pandas中利用hdf5高效存储数据
- AMS机器学习课程:Keras深度学习 - 卷积神经网络
- python教程 | 最标准的地图调用方式(国家测绘局提供数据)
- 「万物生长」一个APK从诞生到活跃在Android手机上
- webpack实战——生产环境配置【下】
- R语言作图——Violin plot with dot