<pre name="code" class="python">import math"""
UserBasedCF是基于用户协同过滤算法,是用户对项目的历史偏好,发掘用户之间的相关性
步骤:1、找到和目标用户兴趣相似的用户集合2、找到这个集合中的用户喜欢的,且目标用户没有的物品推荐给目标用户"""
#定义基于用户的协同过滤算法类
class UserBasedCF:#初始化对象def __init__(self,train_file,test_file):#训练数据self.train_file = train_file#测试数据self.test_file = test_file#读取数据self.readData()#数据读取函数   def readData(self):#读取文件,生成用户-物品的评分表和测试集#用户-物品的评分表#训练集self.train = dict()#打开文件,按行读取训练数据      for line in open(self.train_file):#获得用户、物品、评分数据,丢弃时间戳数据user,item,score,_ = line.strip().split("\t")#用户-物品评分矩阵self.train.setdefault(user,{})#分数赋值self.train[user][item] = int(score)#测试集  self.test = dict() #打开文件,按行读取训练数据   for line in open(self.test_file):#获得用户、物品、评分数据,丢弃时间戳数据user,item,score,_ = line.strip().split("\t")#用户-物品评分矩阵self.test.setdefault(user,{})#分数赋值self.test[user][item] = int(score)#用户间相似度def UserSimilarity(self):#建立物品-用户的倒排表#数据格式:key:物品 value:用户1,用户2self.item_users = dict()#遍历训练集中用户-物品数据for user,items in self.train.items():#遍历用户对应的物品数据for i in items.keys():#倒排表还没有该物品if i not in self.item_users:#倒排表中该物品项赋值为set()集合self.item_users[i] = set()#倒排表中该物品项添加该用户 self.item_users[i].add(user)#计算用户-用户相关性矩阵C = dict()  #用户-用户共现矩阵(某用户,与其他用户出现交集的个数)N = dict()  #用户产生行为的物品个数(不同用户的物品个数)#遍历物品-用户的倒排表,取得物品-用户数据for i,users in self.item_users.items():#遍历物品i下的用户for u in users:#初始化用户产生行为的物品个数0N.setdefault(u,0)#遍历到该用户加1N[u] += 1#用户-用户共现矩阵初始化C.setdefault(u,{})#遍历该物品下所有的用户for v in users:#若该项为当前用户,跳过if u == v:continue#遍历到其他不同用户则加1#初始化为0                  C[u].setdefault(v,0)#加1C[u][v] += 1#计算用户-用户相似度,余弦相似度self.W = dict()      #相似度矩阵#遍历用户-用户共现矩阵的所有项,#每行用户、该行下的其他用户for u,related_users in C.items():#存放用户间相似度self.W.setdefault(u,{})#遍历其他每一个用户及对应的同现矩阵的值,即分子部分for v,cuv in related_users.items():#余弦相似度self.W[u][v] = cuv / math.sqrt(N[u] * N[v])#返回用户相似度return self.W#给用户user推荐,前K个相关用户喜欢的,#用户user未产生过行为的物品#默认3个用户,推荐10个物品def Recommend(self,user,K=3,N=10):#用户user对物品的偏好值rank = dict()#用户user产生过行为的物品项itemaction_item = self.train[user].keys()   #对用户user按相似度从大到小进行排列#取与用户user相似度最大的K个用户for v,wuv in sorted(self.W[user].items(),key=lambda x:x[1],reverse=True)[0:K]:#遍历前K个与user最相关的用户#遍历每件物品、用户对该物品的偏好值for i,rvi in self.train[v].items():#若用户user对物品i已有评价,则跳过if i in action_item:continue#计算用户user对物品i的偏好值#初始化该值为0rank.setdefault(i,0)#通过与其相似用户对物品i的偏好值相乘并相加rank[i] += wuv * rvi#按评分值大小,为用户user推荐结果的取前N个物品return dict(sorted(rank.items(),key=lambda x:x[1],reverse=True)[0:N])   if __name__ == '__main__':cf  =  UserBasedCF('u.data','u.data')cf.UserSimilarity()print cf.Recommend('3')

python UserBasedCF相关推荐

  1. python协同过滤可以预测吗_基于用户的协同过滤推荐算法原理-附python代码实现...

    在推荐系统众多方法中,基于用户的协同过滤推荐算法是最早诞生的,原理也较为简单.该算法1992年提出并用于邮件过滤系统,两年后1994年被 GroupLens 用于新闻过滤.一直到2000年,该算法都是 ...

  2. 基于python爬虫的电影推荐网站的设计与实现

    目 录 摘 要 I Abstract II 1绪论 1 1.1选题背景及意义 1 1.2国内外研究现状 2 1.3推荐算法研究 5 1.3.1协同过滤算法 5 1.3.2基于内容的推荐算法 5 1.3 ...

  3. 协同过滤推荐算法-基于用户的协同过滤UserCF及python实现

    协同过滤推荐算法 基本思想: 根据用户的历史行为数据的挖掘发现用户的兴趣爱好,基于不同的兴趣爱好对用户进行划分并推荐兴趣相似的物品给用户. 协同过滤推荐算法包含: 1.1基于记忆的推荐算法(基于领域的 ...

  4. Github配置(git+vscode+python+jupyter)

    ①下载git 打开 git bash 工具的用户名和密码存储 $ git config --global user.name "Your Name" $ git config -- ...

  5. 【实验楼】python简明教程

    ①终端输入python进入 欣赏完自己的杰作后,按 Ctrl + D 输入一个 EOF 字符来退出解释器,你也可以键入 exit() 来退出解释器. ②vim键盘快捷功能分布 ③这里需要注意如果程序中 ...

  6. 【Kaggle Learn】Python 5-8

    五. Booleans and Conditionals Using booleans for branching logic x = True print(x) print(type(x))''' ...

  7. 【Kaggle Learn】Python 1-4

    [Kaggle Learn]Python https://www.kaggle.com/learn/python 一. Hello, Python A quick introduction to Py ...

  8. 使用python愉快地做高数线代题目~

    今天接触到了python,发现真是极易上手啊!对比c语言是什么鬼东西= = 诶,等下,看完教学文章发现TA在下面写了这句话 如果做了前面的内容你可能已被吸引了,觉得c语言真的是废材! 不...不是的. ...

  9. python 位运算与等号_Python 运算符

    和大多数语言一样,Python也有很多运算符,并且运算符跟其他语言的运算符大同小异接下来一一介绍: 算术运算符: 运算符描述实例 +加 - 两个对象相加a+b的输出结果是30 -减 - 得到复数或者一 ...

最新文章

  1. java 获取utc,如何在Java 8中获取UTC + 0日期?
  2. 中级统计师基础知识中计算机,2009年全国中级统计专业技术资格考试大纲
  3. python2 与 python3的区别整理
  4. Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(上)
  5. VTK:InfoVis之DelimitedTextReader
  6. C# WPF MVVM开发框架Caliburn.Micro 名称Transformer⑩①
  7. 统计学习笔记(4) 线性回归(1)
  8. 信息学奥赛一本通C++语言——1010:计算分数的浮点数值
  9. MFC开发IM-第十三篇、MFC改变字体重影的问题
  10. 智能家居落地还有多远?
  11. 第四课--AMP架构双核应用程序开发和软中断处理(二)
  12. 240章节!“Python|爬虫|数据分析|机器学习|深度学习”中文版路线图视频(附链接)!...
  13. poj 2559 Largest Rectangle in a Histogram dp!!!
  14. 123页6万字XX市新型智慧城市顶层设计方案
  15. TCP/IP学习心得
  16. UBuntu安装配置记录
  17. oracle orderby多个字段,Oracle Order By用法详解
  18. 蓦然回首,会员制CRM就在下里巴人处
  19. android ip v6 teredo,win7系统通过teredo连接IPv6的操作方法
  20. Windows11便签工具在哪 win11的便签在哪里打开

热门文章

  1. Asp.Net实现增删改以及分页例子一
  2. JavaScript原生实现图集分解并下载功能教程(二、实现图集切割及下载)
  3. 用matlab设计病态系统,SS04_病态系统仿真.ppt
  4. 超过一成直播平台倒闭,直播创业何去何从?
  5. 23种设计模式在MMORPG游戏中的应用
  6. 小车舵机控制linux软件,在Linux(Ubuntu)上使用串口控制ROBOTIS Dynamxiel舵机
  7. cocos2dx实例开发之经典坦克
  8. chmod -R 644 dir04 报错:权限不够
  9. 艾永亮:这五大方法告诉你,通过竞品分析造就超级产品
  10. VIM正则表达式详解