推荐算法有基于协同的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)

  

最新文章

  1. 嵌入式开发板iTOP4412学习开发板
  2. 转:printf打印输出2进制
  3. 【转】 STL中的set容器的一点总结
  4. 反射-Reflect
  5. bzoj1626[Usaco2007 Dec]Building Roads 修建道路
  6. unity4.x for mac破解(含Unity全版本号破解)
  7. Qt plugin系统的几点说明
  8. KoaHub平台基于Node.js开发的Koa的简单包装到请求库的类似接口
  9. tmux配置
  10. 高德地图markers生成和点击
  11. junit测试模板 unit-test
  12. c++ primer第15章这几个例子中的构造函数形式不太理解
  13. monkey常用命令实例
  14. 24 python初学(异常)
  15. 关于Mysql6.0+的时区错乱问题
  16. 关于lower_bound( )和upper_bound( )的常见用法
  17. Linux系统下常用命令
  18. Redux学习(3) ----- 结合React使用
  19. 注册InstallShield
  20. Restful架构学习

热门文章

  1. axios拦截http拦截
  2. ABP拦截器之AuthorizationInterceptor
  3. delphi中响应鼠标进入或离开控件的方法
  4. LODOP获取打印机状态码和状态码含义测试
  5. Mac OSX下安装dlib (Python)
  6. react 生命周期函数介绍
  7. 【CF1157F】Maximum Balanced Circle
  8. java day02 记录
  9. pt-show-grants的用法
  10. 【codeforces 983E】NN country