Coder Social home page Coder Social logo

movielens-recsys's Introduction

MovieLens-RecSys

基于Movielens-1M数据集实现的User Based Collaborative Filtering和Item Based Collaborative Filtering推荐算法

简介

项亮所著的《推荐系统实践》一书是非常优秀的推荐系统入门书籍,但书中只描述了单步的计算如何实现,缺乏一个完整的示例来展示推荐系统从建立数据集到评估模型的整个过程,初学者学起来容易迷茫,因此我基于Movielens 1M数据集分别实现了User Based Collaborative Filtering(以下简称UserCF)和Item Based Collaborative Filtering(以下简称ItemCF)两个算法,包含“切分训练集与测试集-训练模型-推荐-评估”一整套流程,可以帮助初学者更快速地理解推荐系统中的协同过滤算法。

程序最终给出的是Precision、Recall、Coverage、Popularity四项衡量模型质量的指标,而具体的电影推荐结果并未保留,如果需要此部分数据可自行修改代码。

运行

  1. 获取代码

    根据自己使用的Python版本获取相应的分支

    Python 3.x:

    git clone https://github.com/Lockvictor/MovieLens-RecSys.git

    Python 2.x:

    git clone -b python2 https://github.com/Lockvictor/MovieLens-RecSys.git

    如果不使用Git,也可在Github页面上手动选择分支然后下载。

  2. 下载数据集

    下载Movielens 1M数据集ml-1m.zip,并解压到项目MovieLens-RecSys文件夹下

  3. 运行代码

    以UserCF为例,直接在终端运行以下命令即可:

# 部分Linux上会同时存在Python的2和3两个版本,3.x版对应的命令是python3
# Windows用户无论安装的是2或3,命令都是python
python usercf.py
#python3 usercf.py

​ Linux用户的话更推荐下面这个命令:

python usercf.py > run.log 2>&1 &
#python3 usercf.py > run.log 2>&1 &

​ 该命令会让程序在后台运行,可以等待运行结束再查看日志,或者通过tail -f run.log即时查看日志。

注意事项

UserCF算法中,由于用户数量多,生成的相似性矩阵也大,会占用比较多的内存,不过一般电脑都没问题。

ItemCF算法中,每次推荐都需要找出一个用户的所有电影,再为每一部电影找出最相似的电影,运算量比UserCF大,因此推荐的过程比较慢。

movielens-recsys's People

Contributors

fuxuemingzhu avatar lockvictor avatar mohamed3on avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

movielens-recsys's Issues

关于算法的一些问题像您请教

最近在写一个音乐推荐的项目,决定采用协同过滤,目前有几个问题。
1.您的推荐算法是没有建立模型的吧,所以每次推荐都是以所有的评分数据为依托,所以对于每个用户推荐都需要进行100+秒的计算吗?
2.您的推荐算法运行结束时的返回的precision=0.3767 recall=0.0759 coverage=0.3175 popularity=6.9195分别代表什么意思,这些结果是如何计算出来的,为什么这几个结果可以用来表征推荐系统的准确度呢。这个跟实际用户的推荐结果的满意程度有挂钩吗。
3.您的算法中是否应用了一些协同过滤的改进算法,比如矩阵分解?
初学机器学习,请您赐教。

Where do the recommendations go?

I've run the file like you instructed, however, I don't know how to actually use the recommender.
How do I test it? where are the results?

发现慢的位置和优化思路

itemcf:

耗时分析:98.2%的时间在
for related_movie, w in sorted(self.movie_sim_mat[movie].items(), key=itemgetter(1), reverse=True)[0:K]:

usercf:

耗时分析:50.4%的时间在
for v, wuv in sorted(self.user_sim_mat[user].items(), key=itemgetter(1), reverse=True)[0:K]:

总结

至于itemcf为什么那么慢,是因为每一次一个用户到来,你要分析这个用户所有的电影的,然后找出电影对应的top N的电影。
至于usercf为什么相对比较快,是因为每一次一个用户到来,你只需要分析该用户相关的top N的用户,找出集合中的电影就行。

这就是慢的原因。

优化方案:

就是:itemcf 就是传入 movie而不是user,这样就OK了。

个人想法。谢谢作者的代码,写得很棒。

很小的一个改动就能大幅缩短运行时间

源代码给相似性矩阵初始话的位置有误,导致setdefault多次,在大规模for循环计算的时候影响较大。

源代码:

        for movie, users in movie2users.items():
            for u in users:
                for v in users:
                    if u == v:
                        continue
                    usersim_mat.setdefault(u, {})
                    usersim_mat[u].setdefault(v, 0)
                    usersim_mat[u][v] += 1

可以改变成下面的样子,可以大幅加快速度。

        for movie, users in movie2users.items():
            for u in users:
                usersim_mat.setdefault(u, defaultdict(int))
                for v in users:
                    if u == v:
                        continue
                    usersim_mat[u][v] += 1

对UserBasedCF而言,不改动前,运行时间是272.01秒;改动后,运行时间变成了167.19秒。节省了38.6%的整体运行时间。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.