推荐系统-协同过滤之电影推荐

毕设分享 基于协同过滤的电影推荐系统 今天学长向大家分享一个毕业设计项目基于协同过滤的电影推荐系统🧿 项目分享:见文末!🧿 项目分享:见文末! 阅读详情

 

Introduction

This example demonstrates Collaborative filtering using the Movielens dataset(https://www.kaggle.com/c/movielens-100k) to recommend movies to users. The MovieLens ratings dataset lists the ratings given by a set of users to a set of movies. Our goal is to be able to predict ratings for movies a user has not yet watched. The movies with the highest predicted ratings can then be recommended to the user.

模型构建步骤:

  1. Map user ID to a "user vector" via an embedding matrix
  2. Map movie ID to a "movie vector" via an embedding matrix
  3. Compute the dot product between the user vector and movie vector, to obtain the a match score between the user and the movie (predicted rating).
  4. Train the embeddings via gradient descent using all known user-movie pairs.

参考(References):

import pandas as pd
import numpy as np
from zipfile import ZipFile
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from pathlib import Path
import matplotlib.pyplot as plt

第一步,下载数据集并预处理

# Download the actual data from http://files.grouplens.org/datasets/movielens/ml-latest-small.zip"
# Use the ratings.csv file
movielens_data_file_url = (
    "http://files.grouplens.org/datasets/movielens/ml-latest-small.zip"
)
movielens_zipped_file = keras.utils.get_file(
    "ml-latest-small.zip", movielens_data_file_url, extract=False
)
keras_datasets_path = Path(movielens_zipped_file).parents[0]
movielens_dir = keras_datasets_path / "ml-latest-small"

# Only extract the data the first time the script is run.
if not movielens_dir.exists():
    with ZipFile(movielens_zipped_file, "r") as zip:
        # Extract files
        print("Extracting all the files now...")
        zip.extractall(path=keras_datasets_path)
        print("Done!")

ratings_file = movielens_dir / "ratings.csv"
df = pd.read_csv(ratings_file)

首先,需要执行一些预处理,将用户和电影编码为int.

user_ids = df["userId"].unique().tolist()
user2user_encoded = {x: i for i, x in enumerate(user_ids)}
userencoded2user = {i: x for i, x in enumerate(user_ids)}
movie_ids = df["movieId"].unique().tolist()
movie2movie_encoded = {x: i for i, x in enumerate(movie_ids)}
movie_encoded2movie = {i: x for i, x in enumerate(movie_ids)}
df["user"] = df["userId"].map(user2user_encoded)
df["movie"] = df["movieId"].map(movie2movie_encoded)

num_users = len(user2user_encoded)
num_movies = len(movie_encoded2movie)
df["rating"] = df["rating"].values.astype(np.float32)
# min and max ratings will be used to normalize the ratings later
min_rating = min(df["rating"])
max_rating = max(df["rating"])

print(
    "Number of users: {}, Number of Movies: {}, Min rating: {}, Max rating: {}".format(
        num_users, num_movies, min_rating, max_rating
    )
)
Number of users: 610, Number of Movies: 9724, Min rating: 0.5, Max rating: 5.0

准备数据训练与验证数据

df = df.sample(frac=1, random_state=42)
x = df[["user", "movie"]].values
# Normalize the targets between 0 and 1. Makes it easy to train.
y = df["rating"].apply(lambda x: (x - min_rating) / (max_rating - min_rating)).values
# Assuming training on 90% of the data and validating on 10%.
train_indices = int(0.9 * df.shape[0])
x_train, x_val, y_train, y_val = (
    x[:train_indices],
    x[train_indices:],
    y[:train_indices],
    y[train_indices:],
)

创建模型

把user和movies嵌入到50维向量中。

模型通过user.movie的点积计算一个分值S,然后再加上每个电影、用户的Bias.

分值S通过sigmoid函数归一化到[0,1]

EMBEDDING_SIZE = 50


class RecommenderNet(keras.Model):
    def __init__(self, num_users, num_movies, embedding_size, **kwargs):
        super(RecommenderNet, self).__init__(**kwargs)
        self.num_users = num_users
        self.num_movies = num_movies
        self.embedding_size = embedding_size
        self.user_embedding = layers.Embedding(
            num_users,
            embedding_size,
            embeddings_initializer="he_normal",
            embeddings_regularizer=keras.regularizers.l2(1e-6),
        )
        self.user_bias = layers.Embedding(num_users, 1)
        self.movie_embedding = layers.Embedding(
            num_movies,
            embedding_size,
            embeddings_initializer="he_normal",
            embeddings_regularizer=keras.regularizers.l2(1e-6),
        )
        self.movie_bias = layers.Embedding(num_movies, 1)

    def call(self, inputs):
        user_vector = self.user_embedding(inputs[:, 0])
        user_bias = self.user_bias(inputs[:, 0])
        movie_vector = self.movie_embedding(inputs[:, 1])
        movie_bias = self.movie_bias(inputs[:, 1])
        dot_user_movie = tf.tensordot(user_vector, movie_vector, 2)
        # Add all the components (including bias)
        x = dot_user_movie + user_bias + movie_bias
        # The sigmoid activation forces the rating to between 0 and 1
        return tf.nn.sigmoid(x)


model = RecommenderNet(num_users, num_movies, EMBEDDING_SIZE)
model.compile(
    loss=tf.keras.losses.BinaryCrossentropy(), optimizer=keras.optimizers.Adam(lr=0.001)
)

基于拆分的数据进行训练

history = model.fit(
    x=x_train,
    y=y_train,
    batch_size=64,
    epochs=5,
    verbose=1,
    validation_data=(x_val, y_val),
)
Epoch 1/5
1418/1418 [==============================] - 6s 4ms/step - loss: 0.6368 - val_loss: 0.6206
Epoch 2/5
1418/1418 [==============================] - 7s 5ms/step - loss: 0.6131 - val_loss: 0.6176
Epoch 3/5
1418/1418 [==============================] - 6s 4ms/step - loss: 0.6083 - val_loss: 0.6146
Epoch 4/5
1418/1418 [==============================] - 6s 4ms/step - loss: 0.6072 - val_loss: 0.6131
Epoch 5/5
1418/1418 [==============================] - 6s 4ms/step - loss: 0.6075 - val_loss: 0.6150

画出训练与验证loss

plt.plot(history.history["loss"])
plt.plot(history.history["val_loss"])
plt.title("model loss")
plt.ylabel("loss")
plt.xlabel("epoch")
plt.legend(["train", "test"], loc="upper left")
plt.show()

loss图如下:

collaborative_filtering_movielens_14_0.png


下面展示推荐给用户的 10 movie结果 

movie_df = pd.read_csv(movielens_dir / "movies.csv")

# Let us get a user and see the top recommendations.
user_id = df.userId.sample(1).iloc[0]
movies_watched_by_user = df[df.userId == user_id]
movies_not_watched = movie_df[
    ~movie_df["movieId"].isin(movies_watched_by_user.movieId.values)
]["movieId"]
movies_not_watched = list(
    set(movies_not_watched).intersection(set(movie2movie_encoded.keys()))
)
movies_not_watched = [[movie2movie_encoded.get(x)] for x in movies_not_watched]
user_encoder = user2user_encoded.get(user_id)
user_movie_array = np.hstack(
    ([[user_id]] * len(movies_not_watched), movies_not_watched)
)
ratings = model.predict(user_movie_array).flatten()
top_ratings_indices = ratings.argsort()[-10:][::-1]
recommended_movie_ids = [
    movie_encoded2movie.get(movies_not_watched[x][0]) for x in top_ratings_indices
]

print("Showing recommendations for user: {}".format(user_id))
print("====" * 9)
print("Movies with high ratings from user")
print("----" * 8)
top_movies_user = (
    movies_watched_by_user.sort_values(by="rating", ascending=False)
    .head(5)
    .movieId.values
)
movie_df_rows = movie_df[movie_df["movieId"].isin(top_movies_user)]
for row in movie_df_rows.itertuples():
    print(row.title, ":", row.genres)

print("----" * 8)
print("Top 10 movie recommendations")
print("----" * 8)
recommended_movies = movie_df[movie_df["movieId"].isin(recommended_movie_ids)]
for row in recommended_movies.itertuples():
    print(row.title, ":", row.genres)

 结果如下:

Showing recommendations for user: 474
====================================
Movies with high ratings from user
--------------------------------
Fugitive, The (1993) : Thriller
Remains of the Day, The (1993) : Drama|Romance
West Side Story (1961) : Drama|Musical|Romance
X2: X-Men United (2003) : Action|Adventure|Sci-Fi|Thriller
Spider-Man 2 (2004) : Action|Adventure|Sci-Fi|IMAX
--------------------------------
Top 10 movie recommendations
--------------------------------
Dazed and Confused (1993) : Comedy
Ghost in the Shell (Kôkaku kidôtai) (1995) : Animation|Sci-Fi
Drugstore Cowboy (1989) : Crime|Drama
Road Warrior, The (Mad Max 2) (1981) : Action|Adventure|Sci-Fi|Thriller
Dark Knight, The (2008) : Action|Crime|Drama|IMAX
Inglourious Basterds (2009) : Action|Drama|War
Up (2009) : Adventure|Animation|Children|Drama
Dark Knight Rises, The (2012) : Action|Adventure|Crime|IMAX
Star Wars: Episode VII - The Force Awakens (2015) : Action|Adventure|Fantasy|Sci-Fi|IMAX
Thor: Ragnarok (2017) : Action|Adventure|Sci-Fi
Python推荐系统学习笔记(1)------基于用户协同过滤算法的电影推荐系统 Python推荐系统学习笔记(1)------基于用户协同过滤算法的电影推荐系统 本周张老师在课上向我们介绍了推荐系统的相关知识点,推荐系统,顾名思义,就是利用用户的历史数据来预测用户的行为兴趣从而为减少用户的搜寻成本。无论是在日常生活中的商场购物还是在互联网上的x宝购物等时,我们总能发现我们总在被推荐商品,日常我们可能都不会太注意这样子的细节,可能并不能算是特别清楚推荐给我们的东西是否真正符合我... 阅读详情

相关推荐

python基于用户画像和协同过滤实现电影推荐系统

1、概要 传统电影推荐系统大多使用协同过滤算法实现电影推荐,主要实现机理是通过用户评分及用户观影历史数据抽象为多维向量利用欧式距离或其他向量计算公式实现推荐,本文中将采用常用的机器学习算法Kmeans聚类算法+协同过滤算法+word2vec搜索推荐模型多模型多维度实现电影推荐系统,系统主要使用python语言进行开发,使用django网站web开发框架实现,数据库使用mysql 2、算法介绍 Kmeans聚类模型通过用户多维度多特征的信息:用户性别,年龄,地域,角色(学生、上班族

拼命小李博客 4312

推荐算法学习记录2.2——kaggle数据集的动漫电影数据集推荐算法实践——基于内容的推荐算法、协同过滤推荐

这种方法通过分析用户的历史行为和偏好,找出具有相似兴趣的用户群体,然后推荐他们喜欢的物品或内容。协同过滤是一种常见的推荐系统技术,它基于用户的历史行为(例如评分、点击、购买等)来预测用户可能感兴趣的物品。协同过滤主要有两种类型:基于用户的协同过滤和基于物品的协同过滤。它可以直接利用物品的内容特征进行推荐,适用于内容较为丰富的场景。冷启动问题是指在推荐系统中,无法为新用户或新物品提供高质量的推荐。

qq_44117805的博客 2028

数据挖掘实战-基于内容协同过滤算法的电影推荐系统

本研究通过构建并优化基于内容协同过滤算法的电影推荐系统,成功实现了对用户个性化电影推荐需求的精准满足。实验结果表明,该系统能够结合电影内容特征和用户行为数据,为用户提供更加符合其兴趣和偏好的电影推荐。相较于单一的推荐方法,该系统展现出了更高的推荐准确性和用户满意度,从而验证了内容协同过滤算法在电影推荐系统中的有效性和优越性。

m0_64336780的博客 1万+

movielens推荐系统_入门推荐系统,你不应该错过的知识清单

【编者按】本账号为第四范式智能推荐产品先荐的官方知乎账号。本账号立足于计算机领域,特别是人工智能相关的前沿研究,旨在把更多与人工智能相关的知识分享给公众,从专业的角度促进公众对人工智能的理解;同时也希望为人工智能相关人员提供一个讨论、交流、学习的开放平台,从而早日让每个人都享受到人工智能创造的价值。推荐系统目前已是学术界相当火热的研究方向。很多同学、研究者想要入门推荐系统,但苦于该领域相关资料太多...

weixin_39664995的博客 411

movie:基于协同过滤算法的电影推荐系统

movie 基于协同过滤算法的电影推荐系统 运行方式 1.创建一个application.properties文件,配置相关数据库信息,主要内容如下: hibernate.dialect=org.hibernate.dialect.MySQLDialect driverClassName=com.mysql.jdbc.Driver validationQuery=SELECT 1 jdbc_url=jdbc:mysql://your_ip/movie?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull jdbc_username=username jdbc_password=password hibernate.hbm2ddl.auto=update hibernate.show_sql=tr

【QGIS】PyCharm集成pyqgis的processing工具箱:环境配置与初始化实战

本文详细介绍了如何在PyCharm中配置QGIS的Python环境并成功集成其强大的Processing工具箱。文章核心解决了独立环境下导入processing模块失败、算法无法调用等常见难题,通过手动添加插件路径和执行关键初始化步骤,实现了在PyCharm中丝滑调用QGIS地理处理算法,从而将复杂的空间分析流程自动化。

weixin_28831399的博客 390

python导出协同过滤结果_【Python】推荐系统入门之协同过滤

[TOC]协同过滤介绍协同过滤包括基于物品的协同过滤和基于用户的协同过滤两种不同方式。基于物品的协同过滤:给用户推荐与他之前购买物品相似的其他物品。基于用户的协同过滤:给用户推荐与他兴趣相似的其他用户购买的物品理解相似度在上面简单的介绍了协同过滤的概率,我们发现无论是基于物品的协同过滤还是基于用户的协同过滤,都包含一个共同的关键词,就是相似度。相似度衡量了用户与用户之间,物品与物品之间的相似程度。...

weixin_28049429的博客 322

【浅读论文-红外和可见光图像融合-CNN】Infrared and Visible Image Fusion using a Deep Learning Framework

1.这篇是2018年ICPR会议上发表的一篇文章1。博主个人觉得这算比较早期在VIF(红外光和可见光图像融合)中加入了深度学习这一模型的论文。2.这篇文章并不是完全使用深度学习的模型,模型主体在图像分解和融合仍然采用传统的方法,只有其中一个分支在特征提取和重建方面用到了VGG网络。3.论文地址4.代码地址本文提出了基于深度学习框架的一种新算法。本文提出使用下述论文中Image fusion with guided filtering2中的分解方法将源图像分解为基本部分和细节内容。

一枚博鼠的博客 1708

数据挖掘-matlab实现基于MovieLens数据集的协同过滤电影推荐系统

下载地址:https://github.com/13952522076/CollaborativeFiltering 希望大家共同学习,不过下载的话请给我个小星星(右上角的star点一下)哦,毕竟也是花费了时间精力的呢,会不断更新哒。。。

马旭的专栏 8397

从Unitree B2W到四足机器人:用Isaac Lab构建强化学习奖励函数的5个实战技巧

本文分享了在Isaac Lab仿真环境中,为Unitree B2W等四足机器人设计强化学习奖励函数的5个核心实战技巧。内容涵盖奖励函数的结构化组合、轮腿混合机器人的适配策略、课程学习的动态调整、域随机化增强鲁棒性以及高效的调试可视化方法,旨在帮助开发者构建更稳定、高效的机器人运动策略。

lg888的博客 1065

AI驱动全栈开发实战:基于Spec与Codex的规格驱动开发指南

1. 先搞清楚“AI重构前端全栈”到底在解决什么实际问题 最近很多人在聊“AI重构前端全栈”,听起来像是又一个营销概念。但如果你真的拆开看,它核心解决的是一个非常具体且痛苦的问题: 一个开发者,如何从零开始,系统性地、不跑偏地完成一个完整项目,并且保证代码质量和架构一致性。 传统开发流程里,产品经理出PRD,前后端开会对齐,前端画页面,后端写接口,测试再介入。这个过程沟通成本高,文档容易过时,新人上手慢。而“AI重构”的思路,是试图用一套 规范化的指令(Spec) 来驱动AI(比如Codex这类模型)生成代

weixin_30596023的博客 459

Python实现基于内容的协同过滤推荐算法构建电影推荐系统

Python实现基于内容的协同过滤推荐算法构建电影推荐系统

张陈亚的博客 5121

安鸾渗透测试平台-CTF系列-bash

工具Xshell 公网VPS接收反弹shell Xshell新手的下载及安装教程(超详细)_新手程序员攀爬之路的博客-优快云博客_xshell使用教程 Xshell连接后 #!/bin/bash cat ${0} while : do echo "$" read input output=`$input` 显示了一个文件,不过咋做呢?这里可能考察的是linux的语法 方法 输入bash 获得shell cat ${0} while : do .

AAAAAAAAAAAA66的博客 2689

基于协同过滤的电影推荐系统

在完成上述步骤后,我们的电影推荐系统已经基本成型。缓存用户相似度和推荐结果,减少计算开销使用异步任务队列(如Celery)来处理耗时的推荐计算提供更加个性化的推荐,结合用户行为数据本项目展示了如何利用协同过滤技术构建一个基本的电影推荐系统。通过不断的迭代和优化,我们可以逐步提升系统的推荐准确性和用户体验。如果你对推荐系统感兴趣,欢迎继续探索更为复杂的算法和实现。

qq_36224726的博客 2189

手把手教你用ADIsimCLK和GUI搞定HMC7044时钟配置(附避坑指南)

本文详细解析了HMC7044时钟芯片的配置方法,通过ADIsimCLK和HMC7044 Configuration GUI工具,从频率规划到硬件验证全流程实战演示。特别针对PLL模式选择、分频链配置等易错环节,提供量产验证的配置模板和实测数据,帮助工程师快速掌握高性能时钟解决方案。

weixin_30755393的博客 794

MAC 青花瓷(Charles)爪机HTTPS 抓包

前段时间跟之前的产品小姐姐聊天,小姐姐说开发让她抓包帮忙看下数据,然而自己又不会,那就来写一篇简易版的教程 冲冲冲! 手上只有mac电脑跟iPhone手机,只做苹果手机的抓包,android7.0以上版本也没法通过正常的抓htts的包,让安卓开发装个后门吧,不是安卓开发并不知道是啥,连上USB之后访问chrome://inspect/#devices就能很简单的抓包 一、准备工具等 青花瓷...

Promise的博客 1613

数据分析——基于用户的协同过滤推荐算法制作电影推荐系统

利用用户对电影的评分和对电影的标签记录,了解用户看电影的喜好,并结合电影的类型,使用基于用户的协同过滤推荐算法制作电影推荐系统,为每位用户推荐他们喜欢的电影。

wslsnyn的博客 3165

Halcon算子知识:optical_flow_mg

光流(Optical Flow)是一种研究图像对齐的算法,一般包括两大类:稀疏光流和稠密光流。稀疏光流就是研究图像中稀疏点的光流,这些点一般是角点;稠密光流则是研究图像中所有点的偏移量。以下介绍halcon的基本光流算子optical_flow_mg的原理方法。该算子计算两个图片的光流法。 二、算子说明 optical_flow_mg(ImageT1, ImageT2 : VectorField : Algorithm, SmoothingSigma, Integration

gongdiwudu的专栏 1万+

Python实现基于用户的协同过滤推荐算法构建电影推荐系统

Python实现基于用户的协同过滤推荐算法构建电影推荐系统

张陈亚的博客 7045

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

毕设 基于协同过滤的电影推荐系统

今天学长向大家分享一个毕业设计项目基于协同过滤的电影推荐系统🧿 项目分享:见文末!🧿 项目分享:见文末!

yunhai66的博客 779

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

毕设项目 基于协同过滤的电影推荐系统

今天学长向大家分享一个毕业设计项目基于协同过滤的电影推荐系统🧿 项目分享:见文末!🧿 项目分享:见文末!

nange12330a的博客 975

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

基于协同过滤算法的电影推荐系统

电影推荐系统(MovieRecommend) 概述 系统流程 如何使用 注意事项 技术细节与改进方向 项目运行教程 基于协同过滤的电影推荐系统运行教程与调试解决方案 一、配置运行环境 二、数据库构建

qq1309399183的博客 881

基于协同过滤算法的电影推荐系统(Python 实现)

本文介绍了如何使用 Python 构建一个基于协同过滤算法的电影推荐系统。通过计算用户和电影之间的相似性,我们可以为用户提供个性化的电影推荐。在本项目中,我们使用了杰尔德相似性(Jaccard Similarity)来计算用户和电影之间的相似度。余弦相似性通过计算两个向量之间的夹角余弦值来衡量相似性,能够直接考虑评分的具体数值,从而更准确地反映用户之间的兴趣相似度或电影之间的内容相似度。同样使用杰尔德相似性计算电影之间的相似度,并生成电影相似性矩阵。按照相似度推荐评分最高的几个进行推荐。

weixin_73592944的博客 1528
上一篇: 如何利用网络技术赚钱的
下一篇: CVA考试解答与交流社区
Debug_Snail
博客等级 码龄12年 96粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值