二部图
在推荐系统中,用户行为数据可以表示成图的形式,具体来说是二部图。用户的行为数据集由一个个(u,i)二元组组成,表示为用户u对物品i产生过行为

其中,users集U={A, B, C},items集I = {a,b,c,d}。则用户物品的二部图为:

图中顶点的相关度主要取决与以下因素:
1)两个顶点之间路径数
2)两个顶点之间路径长度
3)两个顶点之间路径经过的顶点
而相关性高的顶点一般有如下特性:
1)两个顶点有很多路径相连
2)连接两个顶点之间的路径长度比较短
3)连接两个顶点之间的路径不会经过出度较大的顶点

PersonalRank
假设给用户u进行个性化推荐,从图中用户u对应的节点vu开始游走,游走到一个节点时,首先按照概率alpha决定是否继续游走,还是停止这次游走并从vu节点开始重新游走。如果决定继续游走,那么就从当前节点指向的节点中按照均匀分布随机选择一个节点作为下次经过的节点,这样经过很多次的随机游走后,每个物品节点被访问到的概率就会收敛到一个数。最终推荐列表中物品的权重就是物品节点的访问概率。

将上述介绍转换为公式得:

公式中PR(i)表示物品i的访问概率(也即是物品i的权重),out(i)表示物品节点i的出度。alpha决定继续访问的概率。

代码实现
代码解析:
第一次:从推荐的用户开始游走,以公式的概率开始走它的相邻边,以1-alph停止走向自己节点。
第二次:从推荐的用户开始游走,以公式的概率开始走它的相邻边,以1-alph停止走向自己节点。但这里由于第一次游走导致,相邻位置的节点有自己的权值。





依次迭代,把最后的结果进行排列输出

import time
import operator
def PersonalRank(G, alpha, root, max_depth):rank = dict()rank = {x : 0 for x in G.keys()}rank[root] = 1#开始迭代begin = time.time()for k in range(max_depth):tmp = {x : 0 for x in G.keys()}#取出节点i和他的出边尾节点集合rifor i, ri in G.items():#取节点i的出边的尾节点j以及边E(i,j)的权重wij,边的权重都为1for j, wij in ri.items():#i是j的其中一条入边的首节点,因此需要遍历图找到j的入边的首节点,#这个遍历过程就是此处的2层for循环,一次遍历就是一次游走tmp[j] += alpha * rank[i] / (1.0 * len(ri))#我们每次游走都是从root节点出发,因此root节点的权重需要加上(1 - alpha)tmp[root] += (1 - alpha)rank = tmp#输出每次迭代后各个节点的权重print ('iter: ' + str(k) + "\t")for key, value in rank.items():print ("%s:%.3f, \t"%(key, value))print('\n')end = time.time()print('use_time', end-begin)lst = sorted(rank.items(), key =operator.itemgetter(1), reverse=True) #对最后一次以value值进行排序  使用 itemgetter() 从元组序列中获取指定的域值# print(lst) #得到list 每个位置是个元组  #[('B', 0.311771289366653)]for ele in lst:print ("%s:%.3f, \t" %(ele[0],ele[1]))return rankif __name__=='__main__':alpha=0.8G = {'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}}PersonalRank(G,alpha,'A',50)

从不同位置开始访问,得到的概率不一样。
结果为:(在40此开始收敛)
use_time 0.004008054733276367
A:0.314,
c:0.189,
B:0.166,
a:0.159,
C:0.076,
d:0.063,
b:0.033,

预测A的推荐物品,从A开始游走,
上面的代码是对本文一开始描述的数据集中的用户A进行推荐。上图给出了不同迭代次数后各节点的概率值。发现46次迭代之后,所有节点的概率值全都收敛。在这个例子中,A用户没有产生过行为的物品是b和d,相对于A的访问概率分别是0.063,0.033,d的访问概率显然要大于b,所有给A用户的推荐列表为{d,b}。

改进
上面算法在时间复杂度上有个明显的缺陷,每次为每个用户推荐时,都需要在整个用户物品二分图上进行迭代,直到整个图上每个节点收敛。这一过程时间复杂度非常高,不仅无法提高实时推荐,甚至离线生产推荐结果也很耗时。

为了解决时间复杂度过高问题,我们有两种方案:

方案一:减少迭代次数,在收敛前就停止迭代,虽然会对精度有影响,但影响不大。

方案二:我们可以从矩阵角度出发,personalrank经过多次的迭代游走,使得各节点的重要度趋于稳定,实际上我们根据状态转移矩阵:

经过一次矩阵运算就可以直接得到系统的稳态。上面迭代公式的矩阵表示形式为:
变形为:

只需计算一次(1-alphaMT)-1,这就相当于解线性方程组了。这里求r 就说把(1-a)ro看作b
把(i-aMt)看作系数

因为M是稀疏矩阵,我们可以利用scipy.sparse中的gmres,csr_matrix解稀疏矩阵的线性方程组。

代码
算法改进后python实现(User,Item)二分图

分析:
这里求r 就说把(1-a)ro看作b ,把(i-aMt)看作系数矩阵A。来计算r

这里用两种方法求解
(1)普通#x = np.linalg.solve(A,b) 解线性方程组
(2) #求解稀疏表示的线性方程 先转成稀疏表示形式,再求解:
gmres(AA, b, tol=1e-08, maxiter=1)[0]

import numpy as np
from numpy.linalg import solve
import time
from scipy.sparse.linalg import gmres, lgmres
from scipy.sparse import csr_matrixif __name__ == '__main__':alpha = 0.8vertex = ['A', 'B', 'C', 'a', 'b', 'c', 'd']#矩阵是由图的来的 A,B,C,a,b,c,d分别为矩阵的行和列M = np.matrix([[0, 0, 0, 0.5, 0, 0.5, 0],[0, 0, 0, 0.25, 0.25, 0.25, 0.25],[0, 0, 0, 0, 0, 0.5, 0.5],[0.5, 0.5, 0, 0, 0, 0, 0],[0, 1.0, 0, 0, 0, 0, 0],[0.333, 0.333, 0.333, 0, 0, 0, 0],[0, 0.5, 0.5, 0, 0, 0, 0]])r0 = np.matrix([[0], [0], [0], [0], [1], [0], [0]])  # 从'b'开始游走#print(r0.shape)n = M.shape[0]# print(n) 7# 方法一:直接解线性方程法A = np.eye(n) - alpha * M.T  #numpy.eye(N,M=None, k=0, dtype=<type 'float'>) 生成对角矩阵  这里生成单位矩阵b = (1 - alpha) * r0# begin = time.time()# r = solve(A, b)  #x = np.linalg.solve(A,b)  解线性方程组# end = time.time()# print('user time', end - begin)# rank = {}# for j in range(n):#     rank[vertex[j]] = r[j]# li = sorted(rank.items(), key=lambda x: x[1], reverse=True)# print(li)# for ele in li:#     print("%s:%.3f,\t" % (ele[0], ele[1]))# 方法二:采用CSR法对稀疏矩阵进行压缩存储,然后解线性方程data = list() #保存不为0的值row_ind = list() #保存不为0的行col_ind = list() #保存不为0的列for row in range(n):for col in range(n):if (A[row, col] != 0):data.append(A[row, col])row_ind.append(row)col_ind.append(col)AA = csr_matrix((data, (row_ind, col_ind)), shape=(n, n))  #对矩阵进行压缩begin = time.time()r = gmres(AA, b, tol=1e-08, maxiter=1)[0]  #求解稀疏表示的线性方程end = time.time()print("user time", end - begin)rank = {}for j in range(n):rank[vertex[j]] = r[j]li = sorted(rank.items(), key=lambda x: x[1], reverse=True)for ele in li:print("%s:%.3f,\t" % (ele[0], ele[1]))

参考:
https://blog.csdn.net/bbbeoy/article/details/78646635

推荐系统实践(六)CF 图模型相关推荐

  1. 推荐系统实践(五)----基于图的推荐算法

      基于图的模型(graph−basedmodelgraph-based modelgraph−basedmodel)是推荐系统中的重要内容.在研究基于图的模型之前,首先需要将用户行为数据表示成图的形 ...

  2. 图模型在信息流推荐系统中的原理和实践

    猜你喜欢 0.飞猪信息流内容推荐探索1.如何搭建一套个性化推荐系统?2.从零开始搭建创业公司后台技术栈3.全民K歌推荐系统算法.架构及后台实现4.微博推荐算法实践与机器学习平台演进5.腾讯PCG推荐系 ...

  3. 【推荐实践】腾讯推荐系统中的深度匹配模型

    省时查报告-专业.及时.全面的行研报告库 省时查方案-专业.及时.全面的营销策划方案库 [免费下载]2022年6月热门报告合集从零开始了解推荐系统全貌机器学习在B站推荐系统中的应用实践微信视频号实时推 ...

  4. 【推荐实践】腾讯-推荐系统中的深度匹配模型

    导读:推荐系统和搜索应该是机器学习乃至深度学习在工业界落地应用最多也最容易变现的场景.而无论是搜索还是推荐,本质其实都是匹配,搜索的本质是给定 query,匹配 doc:推荐的本质是给定 user,推 ...

  5. 《推荐系统实践》要点思维导图

    推荐系统实践 1 好的推荐系统 1.1 基本任务:联系用户和物品 与分类目录.搜索引擎一样解决信息过载问题. 解决无明确目的的物品需求,并能发掘物品长尾. 1.2 推荐应用 应用于电子商务.视频网站. ...

  6. Nebula 在 Akulaku 智能风控的实践:图模型的训练与部署

    本文整理自 Akulaku 反欺诈团队在 nMeetup·深圳场的演讲,B站视频见:https://www.bilibili.com/video/BV1nQ4y1B7Qd 这次主要来介绍下 Nebul ...

  7. 推荐系统实践读书笔记

    最近大概复习了一下这本书,了解了较早的推荐系统的一些方法,记录如下,以便大家对本书内容有个快速地了解.略去了第一张,详细的代码和细节可以参考其他博客.需要关注的地方直接标出了页码. 书里面的代码不是很 ...

  8. 推荐系统(十七)双塔模型:微软DSSM模型(Deep Structured Semantic Models)

    推荐系统(十七)双塔模型:微软DSSM模型(Deep Structured Semantic Models) 推荐系统系列博客: 推荐系统(一)推荐系统整体概览 推荐系统(二)GBDT+LR模型 推荐 ...

  9. 深入浅出之个性化推荐系统实践

    作者:沈燕 ,来自:网易云 大数据在网易内部的应用丰富多彩,在<让机器读懂用户--大数据中的用户画像>一文中,网易工程师对用户画像进行了较为系统的介绍,并提到用户画像的一个重要作用在于个性 ...

最新文章

  1. asp.net错误.在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错...
  2. Visualization Document Feb 12 16:42
  3. BFS——广度优先算法(Breadth First Search)
  4. 图论 —— k 短路
  5. linux查看openjdk的安装的路径
  6. in band out of band
  7. poj 1704 HDU-4315 阶梯博弈
  8. 欧拉筛(bzoj 2818: Gcd)
  9. 使用ROW_NUMBER()查询:列名 'RowNumber' 无效。
  10. Go Web开发之Revel - 返回值
  11. 线性调频信号(chirp signal)
  12. pythonnumpy安装教程_windows 下python+numpy安装实用教程
  13. 切图工具:又一个处理大图的例子
  14. mysql 中一个表里有父子关系_SQLAlchemy - 同一个表中的父子关系
  15. 手机邮箱怎么弄_手机邮箱设置
  16. linux 网卡爽ip,linux服务器双网卡爽IP实现双线
  17. ACM入门知识-----ACM赛事介绍
  18. 荧光平均值计算matlab,科学网—使用Image J进行自动荧光定量分析 - 陆绮的博文...
  19. [重磅]秦雯讲大数据:心动.幡动.风动
  20. 《改变心理学的40项研究》第一章 生物学与人类行为

热门文章

  1. cf551-brother_acm训练题解
  2. 嵌入式Linux下基于FFmpeg的视频硬件编解码
  3. 视频编解码硬件方案漫谈
  4. golang学习笔记之panic recover
  5. 推荐十个好用的程序员摸鱼网站,现在就给我玩起来!
  6. 云原生监控平台 Prometheus 的相关概念及部署
  7. P2P技术详解(三):P2P技术之STUN、TURN、ICE详解 (webrtc)
  8. 宁波大学园区图书馆公开采购乡村振兴战略下传统村落文化旅游设计
  9. electron 安装import_使用 electron 做个播放器
  10. SPSS的如何进行组内相关系数分析