热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java实现itemcf_基于物品的协同过滤算法ItemCF算法实现

#-*-codingutf-8-*-fromoperatorimportitemgetterfromtexttableimportTexttablefromcollectionsi

#-*- coding=utf-8 -*-

from operator importitemgetterfrom texttable importTexttablefrom collections importdefaultdictimportmath#读取文件

defreadFile(fileData):

data=[]

rates=[]

f=open(fileData,"r")

data=f.readlines()

f.close()for line indata:

dataLine=line.split("\t")

rates.append([int(dataLine[0]),int(dataLine[1]),int(dataLine[2])])returnrates#创建字典,生成用户评分的数据结构#输入:数据集合,格式:用户id\t硬盘id\t用户评分#输出:1.用户字典:dic[用户id]=[(电影id,电影评分)...]#2.电影字典:dic[电影id]=[用户id1,用户id2...]

defcreateDict(rates):

user_dict={}

movie_dict={}for i inrates:if i[0] inuser_dict:

user_dict[i[0]].append((i[1],i[2]))else:

user_dict[i[0]]=[(i[1],i[2])]if i[1] inmovie_dict:

movie_dict[i[1]].append(i[0])else:

movie_dict[i[1]]=[i[0]]returnuser_dict,movie_dict#建立物品倒排表,计算物品相似度

defitemCF(user_dict):

N=dict()

C=defaultdict(defaultdict)

W=defaultdict(defaultdict)for key inuser_dict:for i inuser_dict[key]:if i[0] not in N.keys(): #i[0]表示movie_id

N[i[0]]=0

N[i[0]]+=1 #N[i[0]]表示评论过某电影的用户数

for j inuser_dict[key]:if i==j:continue

if j not inC[i[0]].keys():

C[i[0]][j[0]]=0

C[i[0]][j[0]]+=1 #C[i[0]][j[0]]表示电影两两之间的相似度,eg:同时评论过电影1和电影2的用户数

for i,related_item inC.items():for j,cij inrelated_item.items():

W[i][j]=cij/math.sqrt(N[i]*N[j])returnW#结合用户喜好对物品排序

defrecommondation(user_id,user_dict,K):

rank=defaultdict(int)

l=list()

W=itemCF(user_dict)for i,score in user_dict[user_id]: #i为特定用户的电影id,score为其相应评分

for j,wj in sorted(W[i].items(),key=itemgetter(1),reverse=True)[0:K]: #sorted()的返回值为list,list的元素为元组

if j inuser_dict[user_id]:continuerank[j]+=score*wj #先找出用户评论过的电影集合,对每一部电影id,假设其中一部电影id1,找出与该电影最相似的K部电影,计算出在id1下用户对每部电影的兴趣度,接着迭代整个用户评论过的电影集合,求加权和,再排序,可推荐出前n部电影,我这里取10部。

l=sorted(rank.items(),key=itemgetter(1),reverse=True)[0:10]returnl#获取电影列表

defgetMovieList(item):

items={}

f=open(item,"r",encoding = 'ISO-8859-1')

movie_content=f.readlines()

f.close()for movie inmovie_content:

movieLine=movie.split("|")

items[int(movieLine[0])]=movieLine[1:]#print(items)

returnitems#主程序

if __name__=='__main__':

itemTemp=getMovieList("D:/movieRecommend/ml-100k/u.item") #获取电影列表

fileTemp=readFile("D:/movieRecommend/ml-100k/u.data") #读取文件

user_dic,movie_dic=createDict(fileTemp) #创建字典

user_id=66movieTemp=recommondation(user_id,user_dic,80) #对电影排序

rows=[]

table=Texttable() #创建表格并显示

table.set_deco(Texttable.HEADER)

table.set_cols_dtype(['t','f','a'])

table.set_cols_align(["l","l","l"])

rows.append(["user name","recommondation_movie","from userid"])for i inmovieTemp:

rows.append([user_id,itemTemp[i[0]][0],""])

table.add_rows(rows)print("推荐结果如下:")print(table.draw())



推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了为什么在main.js中写import不会全局生效的问题,并提供了解决方案。在每一个vue文件中都需要写import语句才能使其生效,而在main.js中写import语句则不会全局生效。本文还介绍了使用Swal和sweetalert2库的示例。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • importjava.util.ArrayList;publicclassPageIndex{privateintpageSize;每页要显示的行privateintpageNum ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
author-avatar
洱冬橙66_156
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有