资源简介
这是我参考网上资料后自己写的基于用户的协同过滤算法,包括算法所用到的数据集及相关代码,基于Python实现,代码包含详细解释。
代码片段和文件信息
# -*- coding=utf-8 -*-
import math
import sys
from texttable import Texttable
#pearson相关系数计算相似余弦距离
def calCosDist(user1user2): #user1user2表示[(电影id1评分)…]
x=0.0
y=0.0
avg_x=0.0
avg_y=0.0
sum_xy=0.0
sum_x=0.0
sum_y=0.0
for i in user1:
x+=i[1]
avg_x=x/len(user1)
for j in user2:
y+=j[1]
avg_y=y/len(user2)
for m in user1:
for n in user2:
if m[0]==n[0]: #与特定用户相同的电影才进行评分加权
sum_xy+=(m[1]-avg_x)*(n[1]-avg_y)
sum_y+=(n[1]-avg_y)*(n[1]-avg_y)
sum_x+=(m[1]-avg_x)*(m[1]-avg_x)
xx_yy=math.sqrt(sum_x*sum_y)
return sum_xy/xx_yy
#读取文件
def readFile(fileData):
data=[]
rates=[]
f=open(fileData“r“)
data=f.readlines()
f.close()
for line in data:
dataLine=line.split(“\t“)
rates.append([int(dataLine[0])int(dataLine[1])int(dataLine[2])])
return rates
#创建字典,生成用户评分的数据结构
# 输入:数据集合,格式:用户id\t硬盘id\t用户评分
# 输出:1.用户字典:dic[用户id]=[(电影id电影评分)...]
# 2.电影字典:dic[电影id]=[用户id1用户id2...]
def createDict(rates):
user_dict={}
movie_dict={}
for i in rates:
if i[0] in user_dict:
user_dict[i[0]].append((i[1]i[2]))
else:
user_dict[i[0]]=[(i[1]i[2])]
if i[1] in movie_dict:
movie_dict[i[1]].append(i[0])
else:
movie_dict[i[1]]=[i[0]]
return user_dictmovie_dict
#找出与用户相关的所有用户并排序
def findSimilarUser(user_iduser_dictmovie_dict):
neighbors=[]
neighbors_dist=[]
for movie in user_dict[user_id]:
for neighbor in movie_dict[movie[0]]:
if neighbor !=user_id and neighbor not in neighbors:
neighbors.append(neighbor) #neighbors表示与特定用户评论过相同电影的所有用户
for neighbor in neighbors:
dist=calCosDist(user_dict[user_id]user_dict[neighbor])
neighbors_dist.append([distneighbor])
neighbors_dist.sort(reverse=True)
return neighbors_dist
# 使用UserCF进行推荐
# 输入:用户ID用户字典,电影字典,邻居数量
# 输出:推荐的电影排序及相关用户
def userCF(user_iduser_dictmovie_dictK):
movies={}
movie_sort=[]
user_similar=findSimilarUser(user_iduser_dictmovie_dict)[:K]#找出与指定用户相关性最大的K个用户;user_similar=[相关性大小,用户id]
for user in user_similar:
for i in user_dict[user[1]]: #将前K个用户的id逐个取出来
if i[0] not in movies: #第一次迭代中,i[0]表示第一个用户评论过的电影id1
movies[i[0]]=user[0] #movies是一个字典;第一次迭代中,表示将第一个用户与特定用户的相关性加到电影id1上,后续迭代如果有其他用户也评论了电影id1,也将其用户相关性加到电影id1上
else:
movies[i[0]]+=user[0] #得到K个用户所评论的所有电影的加权和。如果某部电影有5个用户评论过,则将这5个用户与特定用户的相关性相加,得到特定用户对某部电影的感兴趣程度
#对电影相关性排序
for key in movies: #movies是一个字典;movies={电影id1:特定用户对id1的感兴趣程度,……}
movie_sort.append([movies[key]key]) #movie_sort是一个列表,movie_sort=[[特定用户对id1的感兴趣程度电影id1]……]
movie_sort.sort(reverse=True) #将特定用户对所有电影的感兴趣程度进行排序,这里的所有电影指K个用户所评论的所有电影
return movie_sort
#获取电影列表
def
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2017-02-18 15:52 基于用户的协同过滤算法数据集及实现代码\
目录 0 2017-02-18 15:52 基于用户的协同过滤算法数据集及实现代码\ml-100k\
文件 6750 2016-01-30 04:26 基于用户的协同过滤算法数据集及实现代码\ml-100k\README
文件 716 2000-07-20 05:09 基于用户的协同过滤算法数据集及实现代码\ml-100k\allbut.pl
文件 643 2000-07-20 05:09 基于用户的协同过滤算法数据集及实现代码\ml-100k\mku.sh
文件 1979173 2000-07-20 05:09 基于用户的协同过滤算法数据集及实现代码\ml-100k\u.data
文件 202 2000-07-20 05:09 基于用户的协同过滤算法数据集及实现代码\ml-100k\u.genre
文件 36 2000-07-20 05:09 基于用户的协同过滤算法数据集及实现代码\ml-100k\u.info
文件 236344 2000-07-20 05:09 基于用户的协同过滤算法数据集及实现代码\ml-100k\u.item
文件 193 2000-07-20 05:09 基于用户的协同过滤算法数据集及实现代码\ml-100k\u.occupation
文件 22628 2000-07-20 05:09 基于用户的协同过滤算法数据集及实现代码\ml-100k\u.user
文件 1586544 2001-03-09 02:33 基于用户的协同过滤算法数据集及实现代码\ml-100k\u1.ba
文件 392629 2001-03-09 02:32 基于用户的协同过滤算法数据集及实现代码\ml-100k\u1.test
文件 1583948 2001-03-09 02:33 基于用户的协同过滤算法数据集及实现代码\ml-100k\u2.ba
文件 395225 2001-03-09 02:33 基于用户的协同过滤算法数据集及实现代码\ml-100k\u2.test
文件 1582546 2001-03-09 02:33 基于用户的协同过滤算法数据集及实现代码\ml-100k\u3.ba
文件 396627 2001-03-09 02:33 基于用户的协同过滤算法数据集及实现代码\ml-100k\u3.test
文件 1581878 2001-03-09 02:33 基于用户的协同过滤算法数据集及实现代码\ml-100k\u4.ba
文件 397295 2001-03-09 02:33 基于用户的协同过滤算法数据集及实现代码\ml-100k\u4.test
文件 1581776 2001-03-09 02:34 基于用户的协同过滤算法数据集及实现代码\ml-100k\u5.ba
文件 397397 2001-03-09 02:33 基于用户的协同过滤算法数据集及实现代码\ml-100k\u5.test
文件 1792501 2001-03-09 02:34 基于用户的协同过滤算法数据集及实现代码\ml-100k\ua.ba
文件 186672 2001-03-09 02:34 基于用户的协同过滤算法数据集及实现代码\ml-100k\ua.test
文件 1792476 2001-03-09 02:34 基于用户的协同过滤算法数据集及实现代码\ml-100k\ub.ba
文件 186697 2001-03-09 02:34 基于用户的协同过滤算法数据集及实现代码\ml-100k\ub.test
文件 5060 2017-02-18 15:39 基于用户的协同过滤算法数据集及实现代码\userCFbyMyself.py
评论
共有 条评论