推荐算法有基于协同的Collaboration Filtering:包括 user Based和item Based;基于内容 : Content Based

协同过滤包括基于物品的协同过滤和基于用户的协同过滤,本文基于电影评分数据做基于商品的推荐

查看数据u.data

主要用到前3列分别指 用户编号user_id、电影编号item_id、用户对电影的打分score

这个文件主要用户构建物品的相似度矩阵

ubuntu@ubuntu-2:~/workspace/jupyter_project/recommendation$ head  ./data/u.data
196	242	3	881250949
186	302	3	891717742
22	377	1	878887116
244	51	2	880606923
166	346	1	886397596
298	474	4	884182806
115	265	2	881171488
253	465	5	891628467
305	451	3	886324817
6	86	3	883603013

查看数据u.item

主要用到前两列:第一列是电影id item_id  第二列是电影名称

这个文件主要用于根据预测的推荐结果进行展示

ubuntu@ubuntu-2:~/workspace/jupyter_project/recommendation$ head  ./data/u.item
1|Toy Story (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Toy%20Story%20(1995)|0|0|0|1|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0
2|GoldenEye (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?GoldenEye%20(1995)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0
3|Four Rooms (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Four%20Rooms%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0
4|Get Shorty (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Get%20Shorty%20(1995)|0|1|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0
5|Copycat (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Copycat%20(1995)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|1|0|0
6|Shanghai Triad (Yao a yao yao dao waipo qiao) (1995)|01-Jan-1995||http://us.imdb.com/Title?Yao+a+yao+yao+dao+waipo+qiao+(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0
7|Twelve Monkeys (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Twelve%20Monkeys%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|1|0|0|0
8|Babe (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Babe%20(1995)|0|0|0|0|1|1|0|0|1|0|0|0|0|0|0|0|0|0|0
9|Dead Man Walking (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Dead%20Man%20Walking%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0
10|Richard III (1995)|22-Jan-1996||http://us.imdb.com/M/title-exact?Richard%20III%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0

代码如下

#-*-encoding = utf-8 -*-
import math#读取数据 构建dic[每个人][看过的电影]=分数
def read_data(udata,uitem):
    user_movies={}
    movies={}
    for line in open(udata):
        user_id,movie_id,score = line.split("\t")[0:3]
        user_movies.setdefault(user_id,{})
        user_movies[user_id][movie_id] = int(score)
    for line in open(uitem,encoding = "ISO-8859-1"):
        movie_id,movie_name = line.split("|")[:2]
        movies[movie_id] = movie_name
    return user_movies,movies

#依据dict[每个人][看过的电影] = 分数 构建物品相似度矩阵
def item_similarity(user_movies,k=0):
    user_movies = user_movies
    C={}#存放最终的物品相似度矩阵
    N={}#存放每个电影的评分人数
    for user,item in user_movies.items():
        #print (user,"************************************")
        #print (item,"///////////////////")
        for i in item.keys():
            N.setdefault(i,0)
            N[i]+=1
            C.setdefault(i,{})
            for j in item.keys():
                if i == j :
                    continue
                C[i].setdefault(j,0)
                C[i][j]+=1
    W = {}
    #存放最终的物品余弦相似度矩阵
    for i,related_items in C.items():
        W.setdefault(i,{})
        for j,cij in related_items.items():
            W[i][j] = cij/(math.sqrt(N[i] * N[j]))
    return W

#计算推荐结果 K代表取每一个
def Recommend(user,user_movies,W,K,N):
    rank = {} #存放推荐计算结果
    # action_item = user_movies[user] #存放用户看过的电影,及打分
    action_item = user_movies[user]
    for item,score in action_item.items():
        for j,wj in sorted(W[item].items(),key = lambda x:x[1],reverse=True)[0:5]:
        #j代表用户每一个电影的电影推荐,依据打分的倒排推荐 wj为分数
            if j in action_item: #过滤掉推荐中看过的
                continue
            rank.setdefault(j,0)
            rank[j] += float(score*wj) #每一个电影推荐的分数是  电影用户打分*矩阵相似分数
    return dict(sorted(rank.items(),key = lambda x:x[1],reverse=True)[0:N])
if __name__ == "__main__":#主函数
    #加载数据
    user_movies,movies =read_data("./data/u.data","./data/u.item")
    #计算电影相似度
    W=item_similarity(user_movies)
    #print (W)
    #计算推荐结果
    result = Recommend(",user_movies,W,5,5)
    for i,rating in result.items():
         print (movies[i],rating)

  

基于物品的协同过滤item-CF 之电影推荐 python的更多相关文章

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

    原博文出自于: http://blog.fens.me/hadoop-mahout-mapreduce-itemcf/ 感谢! Posted: Oct 14, 2013 Tags: Hadoopite ...

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

    http://blog.fens.me/hadoop-mahout-mapreduce-itemcf/ Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, ...

  3. 基于物品的协同过滤推荐算法——读“Item-Based Collaborative Filtering Recommendation Algorithms” .

    ligh@local-host$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.3 基于物品的协同过滤推荐算法--读"Item-Based ...

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

    ItemCF_基于物品的协同过滤 1.    概念 2.    原理 如何给用户推荐? 给用户推荐他没有买过的物品--103 3.    java代码实现思路 数据集: 第一步:构建物品的同现矩阵 第 ...

  5. ItemCF_基于物品的协同过滤

    ItemCF_基于物品的协同过滤 1.    概念 2.    原理 如何给用户推荐? 给用户推荐他没有买过的物品--103 3.    java代码实现思路 数据集: 第一步:构建物品的同现矩阵 第 ...

  6. Spark 基于物品的协同过滤算法实现

    J由于 Spark MLlib 中协同过滤算法只提供了基于模型的协同过滤算法,在网上也没有找到有很好的实现,所以尝试自己实现基于物品的协同过滤算法(使用余弦相似度距离) 算法介绍 基于物品的协同过滤算 ...

  7. Music Recommendation System with User-based and Item-based Collaborative Filtering Technique(使用基于用户及基于物品的协同过滤技术的音乐推荐系统)【更新】

    摘要: 大数据催生了互联网,电子商务,也导致了信息过载.信息过载的问题可以由推荐系统来解决.推荐系统可以提供选择新产品(电影,音乐等)的建议.这篇论文介绍了一个音乐推荐系统,它会根据用户的历史行为和口 ...

  8. 基于物品的协同过滤算法(ItemCF)

    最近在学习使用阿里云的推荐引擎时,在使用的过程中用到很多推荐算法,所以就研究了一下,这里主要介绍一种推荐算法—基于物品的协同过滤算法.ItemCF算法不是根据物品内容的属性计算物品之间的相似度,而是通 ...

  9. 基于物品的协同过滤ItemCF的mapreduce实现

    文章的UML图比较好看..... 原文链接:www.cnblogs.com/anny-1980/articles/3519555.html 基于物品的协同过滤ItemCF 数据集字段: 1.  Use ...

随机推荐

  1. python3中的 zip()函数 和python2中的 zip()函数 的区别

    python3中的 zip()函数 和python2中的 zip()函数 的区别: 描述: zip() 函数用于将可迭代对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象. ...

  2. [模板] tarjan/联通分量/dfs树

    //to update 边的分类 有向图边分为四类: 树边, 前向边, 返祖边(后向边), 横叉边. 上图: 判定 有向图 对图进行dfs, 不考虑已经遍历过的点, 得到dfs序 \(dfn_i\). ...

  3. [2019.03.21]LF, CR, CRLF and LFCR(?)

    开玩笑的啦,没有LFCR这种沙雕东西 为什么突然想起来写这个呢,是因为先前照着shell画llehs的时候,总报错,改正了以后又因为看不见而在上一篇博客上没有写明,所以过来好好写一写咯. 可以看出报错 ...

  4. HDU1166-ZKW树

    单点修改,区间求和 // // Created by helica on 2018/3/18. // //zkw #include <cstdio> #include <cstrin ...

  5. Hall定理 二分图完美匹配

    充分性证明就先咕了,因为楼主太弱了,有一部分没看懂 霍尔定理内容 二分图G中的两部分顶点组成的集合分别为X, Y(假设有\(\lvert X \rvert \leq \lvert Y \rvert\) ...

  6. setTimeout与setInterval

    setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式. 语法:setTimeout(code/function, milliseconds, param1, param2, ...) ...

  7. 我眼中的Adaboost

    步骤: def buildStump(dataArr,classLabels,D): 1.循环取出数据集中的一个特征(一列)输入 (for:) 2.循环调整阀值threshVal  (for:) 3, ...

  8. 转载:Centos升级gcc

    一.检查centos 里面是否安装了gcc g++ 输入命令:rpm -qa|grep gcc*有看到就出来gcc的东西就是装了没有的话就yum install gcc* -y 二.升级gcc 对于C ...

  9. java eclipse中使用wsdl生成soap 的客户端代码

    项目右键--> new --> other finish完成

  10. 【Unity游戏开发】用C#和Lua实现Unity中的事件分发机制EventDispatcher

    一.简介 最近马三换了一家大公司工作,公司制度规范了一些,因此平时的业余时间多了不少.但是人却懒了下来,最近这一个月都没怎么研究新技术,博客写得也是拖拖拉拉,周六周天就躺尸在家看帖子.看小说,要么就是 ...