Giter Site home page Giter Site logo

movie_recommender's Introduction

movie_recommender

MovieLens based recommender system.使用MovieLens数据集训练的电影推荐系统。

Author chengstone

e-Mail [email protected]

代码详解请参见文内jupyter notebook和↓↓↓

知乎专栏:https://zhuanlan.zhihu.com/p/32078473

博客:http://blog.csdn.net/chengcheng1394/article/details/78820529

欢迎转发扩散 ^_^

This is a simple recommender system, using Tensorflow 1.0 and python 3.5. With text cnn implement movies recommend:

  • 1.Giving user id and movie id to predict a rating.
  • 2.Recommanding a same Genres's movies.
  • 3.Recommanding your favorites movies.
  • 4.Recommanding Watched the same movie's people who favorites movies.

这是一个简单的推荐系统,使用TensorFlow1.0和Python 3.5开发。

使用文本卷积神经网络,并利用MovieLens数据集完成电影推荐的任务。 实现的推荐功能如下:

  • 1、指定用户和电影进行评分
  • 2、推荐同类型的电影
  • 3、推荐您喜欢的电影
  • 4、看过这个电影的人还看了(喜欢)哪些电影

模型如下:

image

训练的Loss:

image

指定用户和电影进行评分

给用户234,电影1401的评分是:4.27963877

推荐同类型的电影

您看的电影是:[1401 'Ghosts of Mississippi (1996)' 'Drama']

以下是给您的推荐:

3385

[3454 'Whatever It Takes (2000)' 'Comedy|Romance']

707

[716 'Switchblade Sisters (1975)' 'Crime']

2351

[2420 'Karate Kid, The (1984)' 'Drama']

2189

[2258 'Master Ninja I (1984)' 'Action']

2191

[2260 'Wisdom (1986)' 'Action|Crime']

推荐您喜欢的电影

以下是给您的推荐(用户234):

1642

[1688 'Anastasia (1997)' "Animation|Children's|Musical"]

994

[1007 'Apple Dumpling Gang, The (1975)' "Children's|Comedy|Western"]

667

[673 'Space Jam (1996)' "Adventure|Animation|Children's|Comedy|Fantasy"]

1812

[1881 'Quest for Camelot (1998)' "Adventure|Animation|Children's|Fantasy"]

1898

[1967 'Labyrinth (1986)' "Adventure|Children's|Fantasy"]

看过这个电影的人还看了(喜欢)哪些电影

您看的电影是:[1401 'Ghosts of Mississippi (1996)' 'Drama']

喜欢看这个电影的人是:[[5782 'F' 35 0]

[5767 'M' 25 2]

[3936 'F' 35 12]

[3595 'M' 25 0]

[1696 'M' 35 7]

[2728 'M' 35 12]

[763 'M' 18 10]

[4404 'M' 25 1]

[3901 'M' 18 14]

[371 'M' 18 4]

[1855 'M' 18 4]

[2338 'M' 45 17]

[450 'M' 45 1]

[1130 'M' 18 7]

[3035 'F' 25 7]

[100 'M' 35 17]

[567 'M' 35 20]

[5861 'F' 50 1]

[4800 'M' 18 4]

[3281 'M' 25 17]]

喜欢看这个电影的人还喜欢看:

1779

[1848 'Borrowers, The (1997)' "Adventure|Children's|Comedy|Fantasy"]

1244

[1264 'Diva (1981)' 'Action|Drama|Mystery|Romance|Thriller']

1812

[1881 'Quest for Camelot (1998)' "Adventure|Animation|Children's|Fantasy"]

1742

[1805 'Wild Things (1998)' 'Crime|Drama|Mystery|Thriller']

2535

[2604 'Let it Come Down: The Life of Paul Bowles (1998)' 'Documentary']

更多内容请参考代码,Enjoy!

许可

Licensed under the MIT License with the 996ICU License.

movie_recommender's People

Contributors

chengstone 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

movie_recommender's Issues

训练模型

mv_net=mv_network()
mv_net.training(features, targets_values, epochs=5)
这一步为什么训练了两次 并且两次的total parameters 还有差别
这一步没太看懂 希望有时间的话帮忙看下 谢谢了

这个用户id和电影id的嵌入向量和word2vec的嵌入向量不是一回事吧

首先声明我是个新手,以下言论可能有比较离谱的错误:

word2vec的嵌入张量是用上下文 经过softmax 来训练的,你这个模型好像没有经过任何针对上下文的训练呀!我说的就是下面的代码:

def get_user_embedding(uid, user_gender, user_age, user_job):
    with tf.name_scope("user_embedding"):
        uid_embed_matrix = tf.Variable(tf.random_uniform([uid_max, embed_dim], -1, 1), name="uid_embed_matrix")
        uid_embed_layer = tf.nn.embedding_lookup(uid_embed_matrix, uid, name="uid_embed_layer")

如果没有考虑上下文的话,就是普通的基于内容的推荐了对吧,只是使用了大量的嵌入向量来表示原来的特征。

还有就是模型最后能跑出来的结果差不多稳定在0.9左右。RMSE0.9就意味着打分偏差是0.9分。
可是分数上下限不是5分吗?我闭着眼全都预测3分,RMSE也才1.6~1.7左右,打分偏差才1.3呀。
也就是说这个模型的作用就是把偏差从1.3分降到了0.9分,效果可以接受吗?

10月11日:
我看youtube的模型上,把用户的观看记录的嵌入向量取平均放到网络中训练,感觉似乎挺不错的,那种是类似word2vec的,因为它有考虑单个用户的观看记录呀,不过那个思路的网络结构跟你这个完全不一样了。

10月15日:
还有就是epoch的划分,我看你每个epoch好像都是用到了全部的数据,这样后面的epoch的测试集很可能已经在前面epoch的训练集里面了,test的loss越来越低也是肯定的了,这样是作弊吧。

感觉这个模型总体来说不是很美妙。。。。

12月14日:
谢谢楼主的分享!最近又看了一些资料,搞懂了楼主的思路了,这个其实还是走的矩阵分解的路子,最后的用户向量和物品向量有多少维,就代表有多少个隐类!只是采用了更多的特征来表述这个向量,比如用户年龄啊职业啊什么的。因为用户id和物品id的嵌入向量是训练得到的,所以是有意义的!但是我仍然认为楼主每个epoch都对数据进行训练集/测试集的重新划分是不妥的啊,比较合适的我认为应该是挑一些物品和用户记录,满足这两个条件:

  1. 测试集中物品参与过训练集的训练(该物品与其他用户有评分记录)
  2. 测试集中用户参与过训练集的训练(用户与其他物品有过评分记录)
    这样可以训练出相对合理的物品和用户的嵌入向量,最后再从测试集中检验其合理性!这种处理能够模拟预测阶段的情况。

再有就是真实情况下即使遇到没训练过的用户和物品(用户或物品的冷启动)也没有关系,统一用一个0向量或者什么别的东西代替,只用网络中其他特征的部分去预测。

当然冷启动最好的还是不要用这个神经网络模型吧我觉得,最好是走实时推荐的思路,根据用户当时行为去进行推荐!

It will be great if it is a keras version.

Thanks for your model. Do you know if there is a keras model that does the same thing? I am not very familiar with tensoflow. If you add some evaluation metrics, it will be easy to evaluate the model. Anyway, thank you so much for uploading your model.

请问 movie_recommender_tf2.ipynb 是什么样的配置

您好,在尝试使用您的 movie_recommender_tf2.ipynb 文件重现,请问您现在这个文件里面使用的 是什么样的配置的?
因为我发现很多问题好像是版本不一致造成的,例如提醒:'Adam' object has no attribute 'apply_gradients'

关于数据预处理问题

作者您好,拜读您的代码关于电脑Title长度等于15不是很明白,看描述“Genres和Title字段需要将长度统一,这样在神经网络中方便处理。空白部分用‘< PAD >’对应的数字填充”。Genres的长度为18,Title却限制15是出于维度考虑吗或者经验数据呢?

新增用户和新增电影

您好,根据训练出来的用户和电影的特征向量,可以计算相似度来做推荐,但是新增个用户和电影没有,这方面如何处理呢?作者有比较好的思路吗?

我跑通了你的例子,并使用了自己的数据进行预测,但是结果并不理想

我跑通了你的例子,并使用了自己的数据进行预测,但是结果并不理想,举例来说,比如第一个推荐,推荐同类型的物品,这个应该是比较简单的关联推荐,但是推荐出来的物品类型都不一致,然后我回过头来看你的结果(如下),才发现你的推荐就不准确,Drama戏剧类别的,有那么多的戏剧同类的,为什么会推荐动作犯罪类别呢?感觉你的推荐方式有问题,请指教。

推荐同类型的电影
您看的电影是:[1401 'Ghosts of Mississippi (1996)' 'Drama']
以下是给您的推荐:
3385
[3454 'Whatever It Takes (2000)' 'Comedy|Romance']
707
[716 'Switchblade Sisters (1975)' 'Crime']
2351
[2420 'Karate Kid, The (1984)' 'Drama]
2189
[2258 'Master Ninja I (1984)' 'Action']
2191
[2260 'Wisdom (1986)' 'Action|Crime']

训练损失函数哪里的问题

#简单的将用户特征和电影特征做矩阵乘法得到一个预测评分
inference = tf.matmul(user_combine_layer_flat, tf.transpose(movie_combine_layer_flat))

这里得到的是个矩阵,不能直接和Y计算吧

这里应该用点乘吧。
inference = user_combine_layer_flat*movie_combine_layer_flat

关于代码本地有错的问题

line 712, in
get_ipython().run_line_magic('matplotlib', 'inline')
NameError: name 'get_ipython' is not defined

请问这个get_ipython怎么突然冒出来的啊

你好,关于movieID的个数问题

movieID值中间是有空缺的,这个的代码注释写着是求movieID的个数,但是实际上是求movieID的最大值,然后在后面的#电影名单词个数movie_title_max = len(title_set) # 5216,这里又是求电影名的个数,被搞蒙了。所以这里到底是求movieID的个数还是最大值呢?为什么两者都能成立呢?后面的movie_id_embed_matrix = tf.Variable(tf.random_uniform([movie_id_max, embed_dim], -1, 1), name = "movie_id_embed_matrix"),这里会用到这个数值做Embedding啊,希望能解答一下,谢谢。

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.