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

  基于物品的协同过滤算法(ItemCF)的基本思想是:给用户推荐那些和他们之前喜欢的物品相似的物品。 比如,该算法会因为你购买过《Java从入门到精通》而给你推荐《Java并发编程实战》。不过,基于物品的协同过滤算法并不利用物品的内容属性计算物品之间的相似度,二是通过分析用户的行为数据计算物品之间的相似度。该算法认为,物品A和物品B具有很大的相似度是因为喜欢物品A的用户大都也喜欢物品B。

实现代码:

  

# -*- coding=utf-8 -*-
from operator import itemgetter
from texttable import Texttable
from collections import defaultdict
import math

#读取文件
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_dict,movie_dict

#建立物品倒排表,计算物品相似度
def itemCF(user_dict):
    N=dict()
    C=defaultdict(defaultdict)
    W=defaultdict(defaultdict)
    for key in user_dict:
        for i in user_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 in user_dict[key]:
                if i==j:
                    continue
                if j not in C[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 in C.items():
        for j,cij in related_item.items():
            W[i][j]=cij/math.sqrt(N[i]*N[j])
    return W

#结合用户喜好对物品排序
def recommondation(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 in user_dict[user_id]:
                continue
            rank[j]+=score*wj #先找出用户评论过的电影集合,对每一部电影id,假设其中一部电影id1,找出与该电影最相似的K部电影,计算出在id1下用户对每部电影的兴趣度,接着迭代整个用户评论过的电影集合,求加权和,再排序,可推荐出前n部电影,我这里取10部。
    l=sorted(rank.items(),key=itemgetter(1),reverse=True)[0:10]
    return l

#获取电影列表
def getMovieList(item):
    items={}
    f=open(item,"r",encoding = ‘ISO-8859-1‘)
    movie_content=f.readlines()
    f.close()
    for movie in movie_content:
        movieLine=movie.split("|")
        items[int(movieLine[0])]=movieLine[1:]
    # print(items)
    return items

#主程序
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=66
    movieTemp=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 in movieTemp:
        rows.append([user_id,itemTemp[i[0]][0],""])
    table.add_rows(rows)
    print("推荐结果如下:")
    print(table.draw())

  运行结果:

原文地址:https://www.cnblogs.com/qilin20/p/12329290.html

时间: 2024-08-24 13:50:08

基于物品的协同过滤算法ItemCF算法实现的相关文章

推荐算法之基于物品的协同过滤算法

基于物品的协同过滤算法(ItemCF)是业界应用最多的算法,主要思想是利用用户之前有过的行为,给用户推荐和之前物品类似的物品. 基于物品的协同过滤算法主要分为两步: 1)计算物品之间的相似度. 2)依据物品的相似度和用户的历史行为给用户生成推荐列表. 第一步的关键点在于计算物品之间的相似度,这里并不採用基于内容的相似性,而是去计算在喜欢物品i的用户中有多少是喜欢物品j的,这样计算的前提是用户的兴趣爱好通常是比較确定的,不easy变,那么当一个用户对两个物品都喜欢的时候,我们往往能够觉得这两个物品

基于用户和基于物品的协同过滤算法的比较

首先回顾一下,协同过滤算法主要有两种,一种是基于用户的协同过滤算法(UserCF),另一种是基于物品的协同过滤算法(ItemCF). 基于用户的协同过滤算法主要有两步: 1)找到和目标用户兴趣相似的用户集合 2)找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户. 基于物品的协同过滤算法主要有两步: 1)计算物品之间的相似度. 2)根据物品的相似度和用户的历史行为给用户生成推荐列表. 由此可以看出UserCF是推荐用户所在兴趣小组中的热点,更注重社会化,而ItemCF则是根据用

推荐算法之基于物品的协同过滤

基于物品的协同过滤( item-based collaborative filtering )算法是此前业界应用较多的算法.无论是亚马逊网,还是Netflix .Hulu . YouTube ,其推荐算法的基础都是该算法.为行文方便,下文以英文简称ItemCF表示.本文将从其基础算法讲起,一步步进行改进并基于MovieLens 数据集给出代码实现,带你领略这一经典算法的美. 1.基本原理 前面我们简单讲解了一下基于用户的协同过滤推荐(UserCF),并且给出了实现代码.还不了解的朋友可以转到链接

推荐算法简介:基于用户的协同过滤、基于物品的协同过滤、基于内容的推荐

参考来源: https://blog.csdn.net/u011748319/article/details/90269818 1.推荐算法 1.1.协同过滤 协同过滤是目前应用最广泛的推荐算法,它仅仅通过了解用户与物品之间的关系进行推荐,而根本不会考虑到物品本身的属性. 可分成两类: 1.基于用户(user-based)的协同过滤 2.基于商品(item-based)的协同过滤 1.1.1.基于用户的协同过滤 基本思想: 基于用户对物品的偏好找到邻居用户(相似用户),然后将邻居用户(相似用户)

ItemCF_基于物品的协同过滤_MapReduceJava代码实现思路

2017年2月19日, 星期日 ItemCF_基于物品的协同过滤 1.    概念 2.    原理 如何给用户推荐? 给用户推荐他没有买过的物品--103 3.    java代码实现思路 数据集: 第一步:构建物品的同现矩阵 第二步:构建用户的得分矩阵 第三步:同现矩阵*评分矩阵 第四步:拿到最终结果,排序,得到给用户的推荐列表 问题一:物品同现矩阵和用户得分矩阵如何构建? 问题二:矩阵相乘如何来做?   六个MapReduce step1_第一个MapReduce: 目的-->去重去除数据

基于物品的协同过滤(二)

MapReduce实现基于物品的协同过滤: 实现过程中需要执行多个mapreduce任务. 初始数据: u1,i101,5.0 u1,i102,3.0 u1,i103,2.5 u2,i101,2.0 u2,i102,2.5 u2,i103,5.0 u2,i104,2.0 u3,i101,2.0 u3,i104,4.0 u3,i105,4.5 u3,i107,5.0 u4,i101,5.0 u4,i103,3.0 u4,i104,4.5 u4,i106,4.0 u5,i101,4.0 u5,i10

百万用户,八十万商品,如何计算基于物品的协同过滤

问题描述: 数据包含了一百四十万用户对80万商品的打分.要利用基于物品的协同过滤来计算.如果直接两两计算140万维的向量相似度,肯定不行啊. 问题分析: 每个物品的向量虽然是140万维的,但是其实给一个物品打分的用户其实不多,这个矩阵是非常稀疏的.而且根据长尾问题来说,大部分物品只有很少的用户有过评分. 总结来说就是每个物品评分的用户远远小于140万,每个用户评价过的商品远远小于80万.所以我们的问题就转换为如何处理这个稀疏的矩阵. 解决方法: 在计算相似度时,选用了夹角余弦(因为相比于杰卡德,

Mahout分步式程序开发 基于物品的协同过滤ItemCF

阅读导读: 1.简述用Mahout实现协同过滤ItemCF的步骤? 2.如何用API实现Hadoop的各种HDFS命令? 3.Kmeans.java类报错,暂时可以怎么处理? 1. Mahout开发环境介绍 在用Maven构建Mahout项目文章中,我们已经配置好了基于Maven的Mahout的开发环境,我们将继续完成Mahout的分步式的程序开发. 本文的mahout版本为0.8. 开发环境: Win7 64bit Java 1.6.0_45 Maven 3 Eclipse Juno Serv

基于用户的协同过滤

最近在看推荐系统.主要是看<智能web算法>和<推荐系统实战>这两本书.<智能web算法>中推荐系统只花一个章节来讲.<推荐系统实战>整本书都是在讲推荐的内容.有兴趣的朋友可以看看.在此慢慢写下笔记与诸位来宾交流交流 推荐系统应用广泛.推荐的方式也多种多样.比较常用的有三种方式.1.社会化推荐:2.协同过滤推荐:3.基于内容的推荐.而协同过滤推荐又可以分为基于用户的协同过滤推荐(UserCF)和基于物品的协同过滤推荐(ItemCF).本文写的是基于用户的协同