资源简介
这是关于基于用户协同过滤usercf的python代码实现,初学涉及到这方面的朋友可以下载试试,数据时基于movielen上面的,可以自己去官网下载。
代码片段和文件信息
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from numpy import *
import time
from texttable import Texttable
import math
class CF:
def __init__(self movies ratings k=5 n=10):
self.movies = movies
self.ratings = ratings
# 邻居个数
self.k = k
# 推荐个数
self.n = n
# 用户对电影的评分
# 数据格式{‘UserID:用户ID‘:[(MovieID:电影IDRating:用户对电影的评星)]}
self.userDict = {}
# 对某电影评分的用户
# 数据格式:{‘MovieID:电影ID‘[UserID:用户ID]}
# {‘1‘[123..]...}
self.ItemUser = {}
# 邻居的信息
self.neighbors = []
# 推荐列表
self.recommandList = []
self.cost = 0.0
#存储
self.c ={}
self.Item_User = {}
# 基于用户的推荐
# 根据对电影的评分计算用户之间的相似度
def recommendByUser(self userId):
self.formatRate()
# 推荐个数 等于 本身评分电影个数,用户计算准确率
self.n = len(self.userDict[userId])
self.getNearestNeighbor(userId)
self.getrecommandList(userId)
self.getPrecision(userId)
# 第五步:获取推荐列表
def getrecommandList(self userId):
# recommandList = [[neighbor movieID]]
self.recommandList = []
# 建立推荐字典
# self.neighbors = [[dist i(表示neighbors)]]
# recommandDict = {movieID:[neighbor]}
recommandDict = {}
for neighbor in self.neighbors:
#movies = [movieIDRating]
movies = self.userDict[neighbor[1]]
for movie in movies:
if (movie[0] in recommandDict):
recommandDict[movie[0]] += neighbor[0]
else:
recommandDict[movie[0]] = neighbor[0]
# 建立推荐列表
for key in recommandDict:
self.recommandList.append([recommandDict[key] key])
self.recommandList.sort(reverse=True)
# 取出降序后列表前n个推荐电影数的列表
self.recommandList = self.recommandList[:self.n]
# 第一步:将ratings转换为userDict和ItemUser
def formatRate(self):
# userDict 用户对电影的评分
# 数据格式{‘UserID:用户ID‘:[(MovieID:电影IDRating:用户对电影的评星)]}
self.userDict = {}
# ItemUser 对某电影评分的用户
# 数据格式:{‘MovieID:电影ID‘[UserID:用户ID]}
# {‘1‘[123..]...}
self.ItemUser = {}
for i in self.ratings:
# 评分最高为5 除以5 进行数据归一化
temp = (i[1] float(i[2]) / 5)
# 计算userDict {‘1‘:[(15)(25)...]‘2‘:[...]...}
if (i[0] in self.userDict):
self.userDict[i[0]].append(temp)
else:
self.userDict[i[0]] = [temp]
# 计算ItemUser {‘1‘[123..]...}
if (i[1] in self.ItemUser):
self.ItemUser[i[1]].append(i[0])
else:
self.ItemUser[i[1]] = [i[0]]
# 第二步:找到某用户的相邻用户
def getNearestNeighbor(self userId):
neighbors = []
#self.neighbors = [[dist i]]
self.neighbors = []
# 获取userId评分的电影都有那些用户也
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2018-04-29 11:03 UserCF\
文件 8959 2018-03-14 09:13 UserCF\UserCF3.py
- 上一篇:目标跟踪代码
- 下一篇:社区发现算法 加权GN算法的Python实现
评论
共有 条评论