推荐算法有基于协同的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. centos 7 修改网卡名字

    1.编辑网卡信息 cd /etc/sysconfig/network-scripts/ #进入网卡目录mv ifcfg-en067761 ifcfg-eth0 #重命名网卡 cat ifcfg-eth ...

  2. Java 异常体系(美团面试)

    Java把异常作为一种类,当做对象来处理.所有异常类的基类是Throwable类,两大子类分别是Error和Exception. 系统错误由Java虚拟机抛出,用Error类表示.Error类描述的是 ...

  3. Spring MVC 使用介绍(十三)数据验证 (一)基本介绍

    一.消息处理功能 Spring提供MessageSource接口用于提供消息处理功能: public interface MessageSource { String getMessage(Strin ...

  4. HBuilderX——编译失败:HBuilderX 安装目录不能包括 ( 等特殊字符

    前言 编译小程序的时候报错,原因其实很简单,安装目录的问题! 解决 我安装到了D:\Program Files (x86),放到D盘的根目录下或者D:\Program Files只要不包含一些特殊字符 ...

  5. Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3) D. Barcelonian Distance 几何代数(简单)

    题意:给出一条直线 ax +by+c=0  给出两个整点 (x1,y1) (x2,y2) 只有在x,y坐标至少有一个整点的时 以及   给出的直线才有路径(也就是格子坐标图的线上) 问 两个整点所需要 ...

  6. 自定义的AdBlock过滤规则

    自定义的AdBlock过滤规则 # 屏蔽百度首页的广告流 www.baidu.com##DIV[id="u1"] www.baidu.com##DIV[id="qrcod ...

  7. django rest framework authentication

    身份验证 身份验证是将传入请求与一组识别凭证(例如请求的用户或其签名的令牌)相关联的机制.然后,权限和限制策略可以使用这些凭据来确定请求是否应该被允许. REST framework 提供了许多开箱即 ...

  8. P1451 求细胞数量

    题目描述 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数.(1<=m,n<=100)? 输入输出格式 输 ...

  9. php 两个数组,若键相同,则值合并

    <?php $arr1 = array('9' => '4.08', '10' => '0.10', '11' => '4.08', '12' => '0.01'); $ ...

  10. C# activex开发中 axwebbrowser控件及 IE浏览器设置

    <object type='application/x-vlc-plugin' id='vlc' events='True' codebase='../cab/axvlc.cab' classi ...