基于邻域的协同过滤主要分为两类,基于用户的协同过滤和基于物品的协同过滤。前者给用户推荐和他兴趣相似的其他用户喜欢的物品,后者则是推荐和他之前喜欢过的物品相似的物品。

基于用户的协同过滤算法

这里介绍基于用户的协同过滤,从定义来说,可以分为以下两步进行:

  1. 找到和目标用户兴趣相似的用户集合
  2. 找和这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户

计算用户相似度的基本算法:

(1)Jaccard 公式

(2)余弦相似度:

得到用户之间的兴趣相似度后,UserCF算法会给用户推荐和他兴趣最相似的K个用户喜欢的物品,下面的公式表示用户u对物品i的感兴趣程度:

其中S(u,K)包含和用户u兴趣最相近的K个用户,N(i)是对物品i有过行为的用户集合,wuv是用户u和用户v的兴趣相似度,rvi代表用户v对物品i的兴趣,在这种情况下rvi=1

可以建立物品到用户的倒查表,对每个物品都保存对该物品产生过行为的用户列表,

可以给上图中的A推荐,选取K=3,用户A对物品c,e没有过行为,因此可以把这两个物品推荐给用户A,用户A对物品c,e的兴趣是:

改进:

上边的算法是有问题的,比如两个人都买过《新华字典》这本书,但这丝毫不能说明他们两个兴趣相似,因为大多数人都买过这本书,如果两个用户都买过《数据挖掘导论》,那可以认为两个人的兴趣比较相似,因为只要研究数据挖掘的人才会买这本书。即两个人对冷门物品采取过同样的行为更能说明他们兴趣的相似性,因此相似性度量函数为:

基于物品的协同过滤算法

下面介绍基于物品的协同过滤算法,其过程主要分为2步:

  1. 计算物品之间的相似度
  2. 根据物品的相似度和用户的历史行为给用户生成推荐列表

计算物品的相似度:

N(i):喜欢物品i的用户数  |N(i)∩N(j)|:同时喜欢物品i和物品j的用户数

与UserCF算法类似,用ItenCF算法计算物品相似度时,也可以首先建立用户-物品倒排表(即对每个用户建立一个包含他喜欢的物品的列表),然后对于每个用户,将物品列表中的物品两两在共现矩阵C中加1,最终将这些矩阵相加得到上边的C矩阵,其中C[i][j]记录同时喜欢物品i和物品j的用户数,最后将c矩阵归一化得到物品之间的余弦相似度矩阵W。

得到物品的相似度之后,ItemCF通过如下公式计算用户u对一个物品j的兴趣:

N(u)是用户喜欢的物品的集合,S(i,k)是和物品i最相似的k个物品的集合,wji 是物品j和i的相似度,rui是用户u对物品i的兴趣。对于隐反馈数据集,如果用户u对物品i有过行为,即可令rui=1,该公式的含义是,和用户历史上感兴趣的物品越相似,越有可能在用户的推荐列表中获得比较高的排名。

用户活跃度对用户的影响

除了上面的分析权重的过程,还可以考虑用户活跃度对物品相似度的影响IUF,即活跃用户对物品相似度的贡献应该小于不活跃的用户,因袭增加IUF参数来修正物品相似度的计算公式

  

物品相似度归一化

如果已经得到了物品的相似性矩阵w,则可以得到归一化之后的相似度矩阵w'

归一化之后的好处是不仅仅增加推荐的准确度,还提高了覆盖率和多样性。

实现算法:

import math
import time
import pandas as pddef calcuteSimilar(series1,series2):'''计算余弦相似度:param data1: 数据集1 Series:param data2: 数据集2 Series:return: 相似度'''unionLen = len(set(series1) & set(series2))if unionLen == 0: return 0.0product = len(series1) * len(series2)similarity = unionLen / math.sqrt(product)return similaritydef calcuteUser(csvpath,targetID=1,TopN=10):'''计算targetID的用户与其他用户的相似度:return:相似度TopN Series'''frame = pd.read_csv(csvpath)                                                        #读取数据targetUser = frame[frame['UserID'] == targetID]['MovieID']                          #目标用户数据otherUsersID = [i for i in set(frame['UserID']) if i != targetID]                   #其他用户IDotherUsers = [frame[frame['UserID'] == i]['MovieID'] for i in otherUsersID]         #其他用户数据similarlist = [calcuteSimilar(targetUser,user) for user in otherUsers]              #计算similarSeries = pd.Series(similarlist,index=otherUsersID)                           #Seriesreturn similarSeries.sort_values()[-TopN:]def calcuteInterest(frame,similarSeries,targetItemID):'''计算目标用户对目标物品的感兴趣程度:param frame: 数据:param similarSeries: 目标用户最相似的K个用户:param targetItemID: 目标物品:return:感兴趣程度'''similarUserID = similarSeries.index                                                 #和用户兴趣最相似的K个用户similarUsers = [frame[frame['UserID'] == i] for i in similarUserID]                 #K个用户数据similarUserValues = similarSeries.values                                            #用户和其他用户的兴趣相似度UserInstItem = []for u in similarUsers:                                                              #其他用户对物品的感兴趣程度if targetItemID in u['MovieID'].values: UserInstItem.append(u[u['MovieID']==targetItemID]['Rating'].values[0])else: UserInstItem.append(0)interest = sum([similarUserValues[v]*UserInstItem[v]/5 for v in range(len(similarUserValues))])return interestdef calcuteItem(csvpath,targetUserID=1,TopN=10):'''计算推荐给targetUserID的用户的TopN物品:param csvpath: 数据路径:param targetUserID: 目标用户:param TopN::return: TopN个物品及感兴趣程度'''frame = pd.read_csv(csvpath)                                                        #读取数据similarSeries = calcuteUser(csvpath=csvpath, targetID=targetUserID)                 #计算最相似K个用户userMovieID = set(frame[frame['UserID'] == 1]['MovieID'])                           #目标用户感兴趣的物品otherMovieID = set(frame[frame['UserID'] != 1]['MovieID'])                          #其他用户感兴趣的物品movieID = list(userMovieID ^ otherMovieID)                                          #差集interestList = [calcuteInterest(frame,similarSeries,movie) for movie in movieID]    #推荐interestSeries = pd.Series(interestList, index=movieID)return interestSeries.sort_values()[-TopN:]                                         #TopNif __name__ == '__main__':print('start..')start = time.time()a = calcuteItem('ratings.csv')print(a)print('Cost time: %f'%(time.time()-start))

参考:http://blog.csdn.net/sinat_33741547/article/details/52740010

推荐系统之基于邻域的算法-------协同过滤算法相关推荐

  1. SVD++:推荐系统的基于矩阵分解的协同过滤算法的提高

    1.背景知识 在讲SVD++之前,我还是想先回到基于物品相似的协同过滤算法.这个算法基本思想是找出一个用户有过正反馈的物品的相似的物品来给其作为推荐.其公式为: 其中 rui 表示预测用户u对物品i的 ...

  2. 吴恩达机器学习(十四)推荐系统(基于梯度下降的协同过滤算法)

    目录 0. 前言 1. 基于内容的推荐算法(Content-based recommendations) 2. 计算电影特征 3. 基于梯度下降的协同过滤算法(Collaborative filter ...

  3. SIGIR 2019 开源论文 | 基于图神经网络的协同过滤算法

    作者丨纪厚业 单位丨北京邮电大学博士生 研究方向丨异质图神经网络,异质图表示学习和推荐系统 引言 协同过滤作为一种经典的推荐算法在推荐领域有举足轻重的地位.协同过滤(collaborative fil ...

  4. 基于矩阵分解的协同过滤算法

    基于矩阵分解的协同过滤算法 基于矩阵分解的CF算法实现(一):LFM LFM原理解析 损失函数 随机梯度下降法优化 基于矩阵分解的CF算法实现(二):BiasSvd BiasSvd 损失函数 随机梯度 ...

  5. java基于springboot+vue的协同过滤算法的图书推荐系统 nodejs

    "互联网:"的战略实施后,很多行业的信息化水平都有了很大的提升.但是目前很多行业的管理仍是通过人工管理的方式进行,需要在各个岗位投入大量的人力进行很多重复性工作,使得对人力物力造成 ...

  6. 推荐系统 --- 推荐算法 --- 基于用户行为的推荐算法 - 协同过滤算法

    概述 历史 1992年,Goldberg.Nicols.Oki及Terry提出 基本思想 爱好相似的用户喜欢的东西可能也会喜欢 优点 共享朋友的经验,提高推荐的准确度 根据爱好相似的用户喜欢的视频进行 ...

  7. 机器学习算法--协同过滤算法

    0. 关键词 推荐算法 长尾理论 UserCF ItemCF 1. 推荐算法 互联网的飞速发展使我们进入了信息过载的时代,搜索引擎可以帮助我们查找内容,但只能解决明确的需求.为了让用户从海量信息中高效 ...

  8. 推荐系统算法—协同过滤算法详解

    文章目录 基于用户的协同过滤(UserCF) 基本思想 例子 UserCF 改进 基于物品的协同过滤(ItemCF) 基本思想 例子 ItemCF 改进 归一化 UserCF 与 ItemCF 对比 ...

  9. 关联规则挖掘算法_基于Apriori关联规则的协同过滤算法

    Apriori 算法 apriori关联规则算法的原理设计较为简单,著名的"啤酒和尿布"说的就是Apriori算法,通俗来讲apriori旨在寻找频繁项集,以帮助商家将消费者有可能 ...

最新文章

  1. 字节跳动裁撤人才发展中心,企业如何做人才发展?
  2. pppoe设计的一般性
  3. linux命令tree
  4. R语言入门系列-软件下载,环境搭建,数据导入导出
  5. javascript php xmlhttp file,xmlHTTP实例_javascript技巧
  6. OpenGL绘图过程简述
  7. Linux移植遇到问题记录
  8. 去小公司了解哪些工具?
  9. Java连接SQLite数据库
  10. 【Vue2.0】—生命周期函数(十)
  11. 【NOIP2015】【Vijos1979】信息传递(有向图最小环大小)
  12. 卷积神经网络及其特征图可视化
  13. C#调用windows API实现 smallpdf客户端程序进行批量压缩
  14. 从0到1亿美元 ---- PopCap创始人John Vechey自述(zt)
  15. 国内机器人编程赛事大全介绍
  16. C#——SqlParameter的使用方法及注意事项
  17. 行业寒冬之下,房多多赴美上市能否安然过冬?
  18. *TEST 3 for NOIP 哈希有毒
  19. FastJson耗时
  20. 解决swagger几种报错问题

热门文章

  1. python 命令行参数-Python 获得命令行参数的方法(推荐)
  2. python编程输入标准-Python中的输入与输出
  3. 关于深度学习中GPU显存使用的介绍
  4. mybatis-plus中的问题总结
  5. RTP与RTSP的区别
  6. QPixmap: It is not safe to use pixmaps outside the GUI thread原因
  7. 面试奇淫巧技之——面试非专业的工作的方法
  8. 「Vue」vue生命周期
  9. 经常使用排序算法实现[交换排序之冒泡排序、高速排序]
  10. 开放地址法实现HashTable