• 大小: 3KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-02
  • 语言: Python
  • 标签: UserCF  

资源简介

这是关于基于用户协同过滤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

评论

共有 条评论

相关资源