• 大小: 3.98MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-09-15
  • 语言: Python
  • 标签: 协同过滤  

资源简介

这是我参考网上资料后自己写的基于用户的协同过滤算法,包括算法所用到的数据集及相关代码,基于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.base
     文件      392629  2001-03-09 02:32  基于用户的协同过滤算法数据集及实现代码\ml-100k\u1.test
     文件     1583948  2001-03-09 02:33  基于用户的协同过滤算法数据集及实现代码\ml-100k\u2.base
     文件      395225  2001-03-09 02:33  基于用户的协同过滤算法数据集及实现代码\ml-100k\u2.test
     文件     1582546  2001-03-09 02:33  基于用户的协同过滤算法数据集及实现代码\ml-100k\u3.base
     文件      396627  2001-03-09 02:33  基于用户的协同过滤算法数据集及实现代码\ml-100k\u3.test
     文件     1581878  2001-03-09 02:33  基于用户的协同过滤算法数据集及实现代码\ml-100k\u4.base
     文件      397295  2001-03-09 02:33  基于用户的协同过滤算法数据集及实现代码\ml-100k\u4.test
     文件     1581776  2001-03-09 02:34  基于用户的协同过滤算法数据集及实现代码\ml-100k\u5.base
     文件      397397  2001-03-09 02:33  基于用户的协同过滤算法数据集及实现代码\ml-100k\u5.test
     文件     1792501  2001-03-09 02:34  基于用户的协同过滤算法数据集及实现代码\ml-100k\ua.base
     文件      186672  2001-03-09 02:34  基于用户的协同过滤算法数据集及实现代码\ml-100k\ua.test
     文件     1792476  2001-03-09 02:34  基于用户的协同过滤算法数据集及实现代码\ml-100k\ub.base
     文件      186697  2001-03-09 02:34  基于用户的协同过滤算法数据集及实现代码\ml-100k\ub.test
     文件        5060  2017-02-18 15:39  基于用户的协同过滤算法数据集及实现代码\userCFbyMyself.py

评论

共有 条评论