"""
import random
import math
import os
import json
import time
#声明一个ItemCFRec类
class ItemCFRec:def __init__(self,datafile,ratio):#这是初始的封装类,其他函数都被封装在里面# 1、原始数据路径文件self.datafile = datafile# 测试集与训练集的比例self.ratio = ratioself.data = self.loadData()self.trainData,self.testData = self.splitData(3,47)self.items_sim = self.ItemSimilarityBest()# 2、定义函数loadData,新建一个data[],打开并遍历self.datafile每一行,取出userid、itemid、record对应的数据到data[]def loadData(self):print("加载数据...")data=[]for line in open(self.datafile):   #对评分数据的每一行,用::拆分得到三个变量并储存到data中userid,itemid,record,time1 = line.split("::")#timestamp = int(1000000000)+int(time1)timestamp = int(time1)time_local = time.localtime(timestamp)dt = time.strftime("%Y-%m-%d %H:%M:%S", time_local)data.append((userid,itemid,int(record),dt))#data =data.sort_values(by = 'timestamp')data1 = sorted(data , key= lambda x: x[3] , reverse = False)data2 = sorted(data, key=lambda x: x[3], reverse= True)return data1"""拆分数据集为训练集和测试集k: 参数seed: 生成随机数的种子M: 随机数上限"""# 3、定义splitData函数,用来随机划分训练集和测试集,def splitData(self,k,seed,M=9):print("训练数据集与测试数据集切分...")train,test = {},{}random.seed(seed)for user,item,record in self.data:if random.randint(0,M) == k:#生成0到m-1之间的随机数test.setdefault(user,{})#如果字典中包含有给定键,则返回该键user对应的值,否则返回为该键设置的值{}test[user][item] = recordelse:train.setdefault(user,{})train[user][item] = recordreturn train,test#训练集和测试集的划分 https://blog.csdn.net/qingsi11/article/details/107322751# 计算物品之间的相似度#4、创建itemSim、item_user_count、count三个空子典def ItemSimilarityBest(self):print("开始计算物品之间的相似度")# 如果相似度的文件已输出 则直接输出,否则运行elseif os.path.exists("item_sim.json"):print("物品相似度从文件加载 ...")itemSim = json.load(open("data/item_sim.json", "r"))else:itemSim = dict() # 相似度矩阵(得到每个物品和其他被用户公共喜欢过的物品的相似度值)item_user_count = dict()  # 得到每个物品有多少用户产生过行为(每个物品有行为的用户数)count = dict()  # 共现矩阵(表示同时喜欢两个物品的用户数)for user, item in self.trainData.items():   #遍历训练集字典中的每一项#print("user is {}".format(user))    #输出此次遍历的用户for i in item.keys():   #遍历该用户对应的物品item_user_count.setdefault(i, 0)   #每遍历一次,item_user_count字典增加(物品,行为用户数)if self.trainData[user][i] > 0.0:   #如果该次遍历的用户对该次遍历的物品有评分item_user_count[i] += 1   #该物品的行为用户数+1for j in item.keys():   #遍历该用户对应的物品count.setdefault(i, {}).setdefault(j, 0)   #设置count的默认格式(i物品,{j物品,共现次数})#if self.trainData[str(user)][i] > 0.0 and self.trainData[str(user)][j] > 0.0 and i != j:if self.trainData[user][i] > 0.0 and self.trainData[user][j] > 0.0 and i != j:count[i][j] += 1   #若该用户对两不同物品都有评分,这两物品的共现次数+1#此循环得到物品行为用户数item_user_count和两两物品共现矩阵count# 共现矩阵 -> 相似度矩阵for i, related_items in count.items():   #遍历共现矩阵的每一项(i物品,关联物品)itemSim.setdefault(i, dict())   #设置itemSim的默认格式(i物品,{})for j, cuv in related_items.items():   #遍历i物品的每一项关联物品(j物品,共现次数)itemSim[i].setdefault(j, 0)   #设置itemSim第i物品的默认格式(j物品,相似度值)itemSim[i][j] = cuv / math.sqrt(item_user_count[i] * item_user_count[j])   #i,j物品的相似度计算json.dump(itemSim, open('data/item_sim.json', 'w'))return itemSim#计算物品的相似度矩阵 https://blog.csdn.net/cxy861046317/article/details/116115930"""为用户进行推荐user: 用户k: k个临近物品nitem: 总共返回n个物品"""#生成该用户可能最感兴趣的40个电影的兴趣值的字典def recommend(self, user, k=8, nitems=40):result = dict()u_items = self.trainData.get(user, {})#得到传入参数的该用户的喜爱的物品和对应的评分#a_items = self.trainData[user]#这种写法也可for i, pi in u_items.items():   #遍历该用户下的每一项(即每一个物品i及其评分pi)for j, wj in sorted(self.items_sim[i].items(), key=lambda x: x[1], reverse=True)[0:k]:#对该用户下的i商品在相似度矩阵中和与其他物品的相似度的值排序,reverse=True为倒序#按照列表中第二个元素(即i物品与j物品的相似度值)对j物品的相似度值wj排序,取与i物品最相似的前k个物品if j in u_items:continue   #如果物品已经在该用户所选物品中,则跳过,遍历下一个物品result.setdefault(j, 0)   #设置格式(j物品,兴趣值)result[j] += pi * wj  #用该用户对i物品的评分乘以i与j物品的相似度得到该用户对j物品的兴趣值return dict(sorted(result.items(), key=lambda x: x[1], reverse=True)[0:nitems])#按照result中每一项的第二个元素(即兴趣值)递减排序,显示前nitems个result#  计算准确率def precision(self, k=8,nitems=10):print("开始计算准确率 ...")hit = 0precision = 0for user in self.testData.keys():#遍历测试集中的useru_items = self.testData.get(user, {})#得到每一个user看过的电影的评分result = self.recommend(user, k=k, nitems=nitems)#调用recommen函数,通过训练集预测用户感兴趣的电影,得到result字典for item, rate in result.items():if item in u_items:#如果预测的电影在测试集中的该用户看过的电影下,则hit+1hit += 1precision += nitemsreturn hit / (precision * 1.0)#预测的电影在测试集中的该用户看过的电影 的数目/recommend函数预测的推荐的电影数if __name__ == "__main__":ib = ItemCFRec("data/ml-1m/ratings.dat",[1,9])#给ItemCFRec("data/ml-1m/ratings.dat",[1,9])取名ib,1:9为测试集与训练集的比例print("用户1进行推荐的结果如下:{}".format(ib.recommend("1")))#在类ib下给recommend函数传入参数1,得到用户1进行推荐的结果如下:{}print("准确率为: {}".format(ib.precision()))#在类ib下调用precision函数,得到准确率

参照:https://zhuanlan.zhihu.com/p/94024379

基于ItemCF算法的电影推荐系统 的代码详解相关推荐

  1. 基于SVD算法的电影推荐系统实验

    基于SVD算法的电影推荐系统实验 推荐系统发展简单思维导图 电影推荐系统最初思路 程序实现的功能 程序整体框架 基于关键字搜索推荐模块 搜索推荐模块代码 基于电影名称关键字的推荐模块 基于电影类型搜索 ...

  2. 【计算机毕业设计】009基于推荐算法的电影推荐系统

    一.系统截图(需要演示视频可以私聊) 摘  要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式.本基于推荐算法的电影推荐系统就是在 ...

  3. 【目标检测算法-锚框公式推导及代码详解】

    目标检测算法-锚框公式推导及代码详解 0 沐神对锚框的宽高计算并未推导以及讲解 1 锚框宽高公式推导 1.1 基础概念 1.2 锚框宽高公式推导 1.3 图片验证计算 1.4 小结 2 代码详解 2. ...

  4. 基于神经网络的依存句法分析总结及代码详解

    上一篇文章CS224n之句法分析总结,介绍了句法分析以及具体的依存分析中的arc-standard算法.arc-standard系统是transition systems中最流行的一个系统之一.而本文 ...

  5. 免疫算法(IA)MatLab代码详解

    CSDN编辑器里面没有MATLAB选项,所以我为了注释更清楚,用的是//,大家不要被误解了呀,算法看代码就好了 1 免疫算法的精髓 生物免疫系统:动态性免疫.自适应免疫 免疫算法-保证信息的无害性.有 ...

  6. 独家总结 | KNN算法Python实现(附代码详解及注释)

    ↑ 点击上方[计算机视觉联盟]关注我们 上一篇已经介绍KNN算法的基本原理,这篇就不再赘述(公式太多,读不懂? 一文带你领略KNN近邻算法~简单易懂) 纸上得来终觉浅,仅仅懂了原理还不够,要用代码实践 ...

  7. 程序员的内涵之基于SDK的Windows应用程序框架代码详解

    基于SDK的Windows应用程序框架代码需要注意以下几个方面: 1.必须包含头文件windows.h WINDOWS.H是一个最重要的头文件,它包含了其他Windows头文件,这些头文件的某些也包含 ...

  8. 基于PaddleOCR的FCENet论文总结和代码详解(持续更新)

    Fourier Contour Embedding for Arbitrary-Shaped Text Detection 文末有总结一些CVPR有关OCR领域的最新论文及代码地址 Contribut ...

  9. 自强不息系列之基于SDK的Windows应用程序框架代码详解

    1.必须包含头文件windows.h WINDOWS.H是一个最重要的头文件,它包含了其他Windows头文件,这些头文件的某些也包含了其他头文件.这些头文件中最重要的和最基本的是: WINDEF.H ...

最新文章

  1. 绝对干货:19个有用的基于云的Web开发工具
  2. Oracle中验证非空的函数NVL(),NVL2()总结
  3. 雅客EXCEL(4)-录入数据、超链接阻断、下拉菜单、横列转数列、alt+向下方向键、定位公式
  4. 阿里数据中台系列之Apsara Stack控制台报警管理(三)
  5. OpenCV学习笔记(一):图像显示
  6. QNNPACK高性能前向内核库全面剖析——引言篇
  7. 小红书shield算法分析
  8. 富人和穷人的对比图,时刻提醒自己!
  9. android P OTA差分升级时报错记录
  10. Windows Firewall/Internet Connection Sharing (ICS) 无法启动解决办法
  11. 使用Adreno Profiler分析android游戏
  12. Python中的函数(调用、参数、返回值、变量的作用域)
  13. plsql如何显示表结构图_plsql导出导入 表结构、表数据、存储过程等
  14. python qt教程视频 下载_PyQt5开发与实战教程,视频教程下载
  15. Notepad++汉化教程
  16. OP负反馈放大电路的自激振荡
  17. 计算机合并单元格怎么操作,excel怎么合并单元格,教您excel合并单元格的方法
  18. BinaryWriter
  19. 【java】Java连接mysql数据库及mysql驱动jar包下载和使用
  20. python制作雷达图_如何利用Python matplotlib绘制雷达图

热门文章

  1. 东莞数控机床上加工模具
  2. python爬取指定关键字图片
  3. 敏捷实用工具系列之一:5Why分析法
  4. T5L芯片做主控在车载控制器行业的应用
  5. 植树节小报word手抄报模板来啦
  6. Spring源码解析之@Component注解的扫描
  7. java中的cascade,Hibernate中cascade作用
  8. 从 TikTok 危机看去中心化应用未来曙光 | ArcBlock 博客
  9. Linux Text file busy文本文件忙
  10. 渗透靶机(CMS漏洞)