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

主要做三个部分:1、读取数据;2、构建用户与用户的相似度矩阵;3、进行推荐;

查看数据u.data

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

这个文件构建item-用户的倒排表用于构建用户和用户的相似度矩阵,构建用户-item的倒排表用于推荐

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

代码如下

# coding: utf-8

# In[64]:

#读取数据
def read_data(udata,uitem):
    user_movies = {}#item - > user  用于构建相似度矩阵
    user_item = {}#user -> item ->score 最后用于推荐
    movies = {}
    for line in open(udata):
        user,item,score = line.split("\t")[:3]
        user_movies.setdefault(item,{})
        user_movies[item][user] = int(score)
        user_item.setdefault(user,{})
        user_item[user][item]= int(score)
    for line in open(uitem,encoding = "ISO-8859-1"):
        item,name = line.split("|")[:2]
        movies.setdefault(item)
        movies[item] = name
    return user_movies,movies,user_item
# user_movies,movies,user_item = read_data("./data/u.data","./data/u.item")

# In[62]:

import math
#建立用户相似度矩阵
def user_similarity(user_movies):
    C ={}#用于存放相似度矩阵
    N = {}#用于存放每个人评价的电影数
    for item , user_score in user_movies.items():
        for user in user_score.keys():
            N.setdefault(user,0)
            N[user] += 1
            C.setdefault(user,{})
            for user2 in user_score.keys():
                if user == user2:
                    continue
                C[user].setdefault(user2,0)
                C[user][user2] +=1
    W = {}#存放最终的相似度矩阵
    for user,user_score in C.items():
        W.setdefault(user,{})
        for user2,score in user_score.items():
            W[user][user2] =  C[user][user2]/math.sqrt(N[user]*N[user])
    return W
# W=user_similarity(user_movies)

# In[63]:

#
def Recommend(user,user_item,W,N,M):
    rank = {} #存放推荐计算结果
    user=user
    #N 用户相关性最大的前N个用户;
    #M代表推荐最终的M个结果
    for user2,w_score in sorted(W[user].items(),key = lambda x:x[1],reverse = True)[:N]:
        for item,score in sorted(user_item[user2].items()):
            if item in user_item[user].keys():
                continue
            rank.setdefault(item,{})
            rank[item] = w_score*math.log(score)
    return sorted(rank.items(),key = lambda x:x[1],reverse = True)[:M]

# In[65]:

if __name__ == "__main__":
    print ("#导入数据")
    user_movies,movies,user_item = read_data("./data/u.data","./data/u.item")
    print("#计算相似度矩阵")
    W = user_similarity(user_movies)
    print ("#计算推荐结果")
    result = Recommend(",user_item,W,2,10)
    print ("#结果展示")
    print ("你可能会喜欢")
    for line in result:
        print (movies[line[0]])

基于用户的协同过滤电影推荐user-CF python的更多相关文章

  1. 基于用户的协同过滤的电影推荐算法(tensorflow)

    数据集: https://grouplens.org/datasets/movielens/ ml-latest-small 协同过滤算法理论基础 https://blog.csdn.net/u012 ...

  2. 推荐召回--基于用户的协同过滤UserCF

    目录 1. 前言 2. 原理 3. 数据及相似度计算 4. 根据相似度计算结果 5. 相关问题 5.1 如何提炼用户日志数据? 5.2 用户相似度计算很耗时,有什么好的方法? 5.3 有哪些改进措施? ...

  3. Mahout实现基于用户的协同过滤算法

    Mahout中对协同过滤算法进行了封装,看一个简单的基于用户的协同过滤算法. 基于用户:通过用户对物品的偏好程度来计算出用户的在喜好上的近邻,从而根据近邻的喜好推测出用户的喜好并推荐. 图片来源 程序 ...

  4. 【推荐系统实战】:C++实现基于用户的协同过滤(UserCollaborativeFilter)

    好早的时候就打算写这篇文章,可是还是參加阿里大数据竞赛的第一季三月份的时候实验就完毕了.硬生生是拖到了十一假期.自己也是醉了... 找工作不是非常顺利,希望写点东西回想一下知识.然后再攒点人品吧,仅仅 ...

  5. (数据挖掘-入门-3)基于用户的协同过滤之k近邻

    主要内容: 1.k近邻 2.python实现 1.什么是k近邻(KNN) 在入门-1中,简单地实现了基于用户协同过滤的最近邻算法,所谓最近邻,就是找到距离最近或最相似的用户,将他的物品推荐出来. 而这 ...

  6. 案例:Spark基于用户的协同过滤算法

    https://mp.weixin.qq.com/s?__biz=MzA3MDY0NTMxOQ==&mid=2247484291&idx=1&sn=4599b4e31c2190 ...

  7. 基于用户的协同过滤(UserCF)

  8. 基于物品的协同过滤item-CF 之电影推荐 python

    推荐算法有基于协同的Collaboration Filtering:包括 user Based和item Based:基于内容 : Content Based 协同过滤包括基于物品的协同过滤和基于用户 ...

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

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

随机推荐

  1. 为App添加Log日志文件

    using System; using System.Globalization; using System.IO; using System.Text; using System.Windows.F ...

  2. golang核心Goroutine和channel

    一.Goroutine 1.介绍 goroutine简介 goroutine是go语言中最为NB的设计,也是其魅力所在,goroutine的本质是协程,是实现并行计算的核心.goroutine使用方式 ...

  3. Making every developer more productive with Visual Studio 2019

    Today, in the Microsoft Connect(); 2018 keynote, Scott Guthrie announced the availability of Visual ...

  4. python之单例模式、栈、队列和有序字典

    一.单例模式 import time import threading class Singleton(object): lock = threading.RLock() # 定义一把锁 __inst ...

  5. ubuntu14.04按照mysql5.7

    1.安装mysql5.5 https://www.cnblogs.com/zhuyp1015/p/3561470.html https://www.cnblogs.com/ruofengzhishan ...

  6. 浅析 Scala 构造器

    2019-04-15 关键字:Scala 主构造器.Scala 辅助构造器.Scala 构造器的区别 本篇文章系笔者根据当前所掌握知识对 Scala 构造器的一些心得总结,不保证文章所述内容的绝对.完 ...

  7. git常用命令介绍

    一,仓库 1. git init    把当前目录变成git可管理得仓库,也就是初始化仓库 2. git add 文件名            在仓库中添加新文件 3. git commit -m & ...

  8. MongoDB官网配置项目整理

    MongoDB的配置文件共有10个项目: systemLog:processManagement:net:security:storage:operationProfiling:replication ...

  9. 在vue中关于element UI 中表格实现下载功能,表头添加按钮,和点击事件失效的解决办法。

    因为在element 中表格是使用el-table的形式通过数据来支撑结构,所以,表格的样式没有自己写的灵活,所以有了没法添加按钮的烦恼.下面是解决的方法. 准备工作: 一.下载npm安装包两个 1. ...

  10. 解决liblapack.so.3: cannot open shared object file: No such file or directory报错

    关于这种类型的报错通常的解决方式有两个: 方法一.查找系统哪儿有liblapack.so.3这个文件 find /lib -name liblapack.so.3 如果lib找不到这个文件,请换其他路 ...