机器学习实战15-推荐算法-协同过滤在电影推荐中的应用实践

大家好,我是微学AI,今天给大家介绍一下机器学习实战15-推荐算法-协同过滤在电影推荐中的应用实践。 随着互联网的发展,信息过载问题日益严重,推荐系统应运而生。本文将详细介绍推荐算法在电影推荐领域的应用实践,以及其背后的数学原理。本博客我将介绍推荐系统的背景与应用场景,然后详细阐述推荐算法的数学原理,然后通过一个电影推荐的实例来展示推荐算法的实际应用,利用python代码实现一个案例。
在这里插入图片描述

1. 背景与应用场景

推荐系统是一种信息过滤系统,旨在解决信息过载问题。在电影推荐领域,推荐系统能够根据用户的兴趣和历史行为,为用户推荐可能感兴趣的电影。例如,当用户在电影平台上浏览电影时,推荐系统可以根据用户的观看历史、评分、搜索记录等信息,为用户推荐相似或相关的电影。

2. 推荐算法的数学原理

推荐算法主要分为协同过滤和基于内容的推荐两种方法。下面我们将分别介绍这两种方法的数学原理。

2.1 协同过滤

协同过滤(Collaborative Filtering, CF)是一种基于用户历史行为数据的推荐方法。其基本思想是:如果两个用户在过去的某些项目上表现出相似的兴趣,那么他们在未来的项目上也可能表现出相似的兴趣。协同过滤主要包括用户基于的协同过滤(User-based CF)和物品基于的协同过滤(Item-based CF)两种方法。

2.1.1 用户基于的协同过滤

用户基于的协同过滤通过计算用户之间的相似度,找到与目标用户相似的用户群体,然后根据这些相似用户的兴趣推荐项目。用户之间的相似度可以通过余弦相似度、皮尔逊相关系数等方法计算。假设我们有一个用户-物品评分矩阵 R ∈ R m × n R \in \mathbb{R}^{m \times n} RRm×n,其中 m m m表示用户数, n n n表示物品数, R i j R_{ij} Rij表示用户 i i i对物品 j j j的评分。用户 i i i和用户 j j j之间的余弦相似度可以表示为:
sim ( i , j ) = ∑ k = 1 n R i k ⋅ R j k ∑ k = 1 n R i k 2 ⋅ ∑ k = 1 n R j k 2 \text{sim}(i, j) = \frac{\sum_{k=1}^{n} R_{ik} \cdot R_{jk}}{\sqrt{\sum_{k=1}^{n} R_{ik}^2} \cdot \sqrt{\sum_{k=1}^{n} R_{jk}^2}} sim(i,j)=k=1nRik2 k=1nRjk2 k=1nRikRjk

2.1.2 物品基于的协同过滤

物品基于的协同过滤通过计算物品之间的相似度,找到与目标物品相似的物品群体,然后根据用户对这些相似物品的评分预测用户对目标物品的评分。物品之间的相似度可以通过余弦相似度、调整余弦相似度等方法计算。假设我们有一个物品-用户评分矩阵 R ∈ R n × m R \in \mathbb{R}^{n \times m} RRn×m,物品 i i i和物品 j j j之间的余弦相似度可以表示为:
sim ( i , j ) = ∑ k = 1 m R k i ⋅ R k j ∑ k = 1 m R k i 2 ⋅ ∑ k = 1 m R k j 2 \text{sim}(i, j) = \frac{\sum_{k=1}^{m} R_{ki} \cdot R_{kj}}{\sqrt{\sum_{k=1}^{m} R_{ki}^2} \cdot \sqrt{\sum_{k=1}^{m} R_{kj}^2}} sim(i,j)=k=1mRki2 k=1mRkj2 k=1mRkiRkj

2.2 基于内容的推荐

基于内容的推荐(Content-based Filtering)是一种基于项目特征的推荐方法。其基本思想是:如果用户喜欢某个项目,那么具有相似特征的其他项目也可能受到用户的喜爱。基于内容的推荐主要包括项目特征提取、用户兴趣建模和推荐生成三个步骤。

3. 电影推荐的实例

以电影推荐为例,我们可以将电影的特征分为导演、演员、类型、年代等。假设我们有一个电影-特征矩阵 F ∈ R n × p F \in \mathbb{R}^{n \times p} FRn×p,其中 p p p表示特征数, F i j F_{ij} Fij表示电影 i i i在第 j j j个特征上的取值。根据用户的历史行为,我们可以得到一个用户-特征偏好矩阵 P ∈ R m × p P \in \mathbb{R}^{m \times p} PRm×p,其中 P i j P_{ij} Pij表示用户 i i i对特征 j j j的偏好程度。那么,用户 i i i对电影 j j j的兴趣可以表示为:
兴趣 ( i , j ) = ∑ k = 1 p F j k ⋅ P i k \text{兴趣}(i, j) = \sum_{k=1}^{p} F_{jk} \cdot P_{ik} 兴趣(i,j)=k=1pFjkPik
根据计算得到的兴趣值,我们可以为用户推荐兴趣值最高的电影。

4. 电影推荐的实例代码实现

数据csv样例:movie_data2.csv

user_id,movie_id,rating,title,genre,release_year
1,1,5,"The Shawshank Redemption","Drama",1994
1,2,4,"The Godfather","Crime",1972
1,3,3,"Pulp Fiction","Crime",1994
1,4,2,"Forrest Gump","Drama",1994
2,1,4,"The Shawshank Redemption","Drama",1994
2,2,5,"The Godfather","Crime",1972
2,3,2,"Pulp Fiction","Crime",1994
2,5,4,"The Dark Knight","Action",2008
3,1,5,"The Shawshank Redemption","Drama",1994
3,6,4,"Inception","Sci-Fi",2010
3,7,3,"The Matrix","Sci-Fi",1999
4,2,4,"The Godfather","Crime",1972
4,4,5,"Forrest Gump","Drama",1994
4,5,3,"The Dark Knight","Action",2008
4,6,4,"Inception","Sci-Fi",2010
5,3,3,"Pulp Fiction","Crime",1994
5,7,4,"The Matrix","Sci-Fi",1999
5,8,5,"Fight Club","Drama",1999

实现代码如下:


import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity# 假设df是已经读取的CSV数据,直接运行
df = pd.DataFrame({'user_id': [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3],'movie_id': [1, 2, 3, 4, 1, 2, 3, 5, 1, 6, 7],'rating': [5, 4, 3, 2, 4, 5, 2, 4, 5, 4, 3],'title': ["The Shawshank Redemption", "The Godfather", "Pulp Fiction", "Forrest Gump","The Shawshank Redemption", "The Godfather", "Pulp Fiction", "The Dark Knight","The Shawshank Redemption", "Inception", "The Matrix"],'genre': ["Drama", "Crime", "Crime", "Drama", "Drama", "Crime", "Crime", "Action", "Drama", "Sci-Fi", "Sci-Fi"],'release_year': [1994, 1972, 1994, 1994, 1994, 1972, 1994, 2008, 1994, 2010, 1999]
})
print(df )# 如果是读取movie_data.csv,可以根据以上数据构建出movie_data.csv
# data = pd.read_csv('movie_data.csv')
# df = data
# print(df )# 构建一个用户-电影评分矩阵
user_movie_matrix = df.pivot_table(index='user_id', columns='movie_id', values='rating')# 填充缺失值为0
user_movie_matrix = user_movie_matrix.fillna(0)# 计算余弦相似度
user_similarity = cosine_similarity(user_movie_matrix)# 转换为DataFrame以便查看
user_similarity_df = pd.DataFrame(user_similarity, index=user_movie_matrix.index, columns=user_movie_matrix.index)# 找到与用户1最相似的用户
most_similar_users = user_similarity_df.loc[1].sort_values(ascending=False).index[1:]  # 排除用户自己# 找出这些用户评价较高的电影
recommended_movies = df[(df['user_id'].isin(most_similar_users)) &~(df['movie_id'].isin(df[df['user_id'] == 1]['movie_id']))].groupby('movie_id').mean().sort_values(by='rating', ascending=False)print(recommended_movies)

运行结果:
movie_id
5 2.0 4.0 2008.0
6 3.0 4.0 2010.0
7 3.0 3.0 1999.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/636661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】--- 基础语法(1)

目录 1.变量和表达式2.变量和类型2.1变量是什么2.2变量的语法2.3变量的类型2.3.1整数2.3.2浮点数(小数)2.3.3字符串2.3.4布尔2.3.5其他 2.4为什么要有这么多类型2.5动态类型特征 3.注释3.1注释的语法3.2注释的规范 结语 1.变量和表达式 对python的学习就…

muduo网络库剖析——通道Channel类

muduo网络库剖析——通道Channel类 前情从muduo到my_muduo 概要事件种类channel 框架与细节成员函数细节实现使用方法 源码结尾 前情 从muduo到my_muduo 作为一个宏大的、功能健全的muduo库,考虑的肯定是众多情况是否可以高效满足;而作为学习者&#x…

多线程-Thread类及常见方法

目录 1.什么是Thread类 1.1Thread 的常⻅构造⽅法 1.2 Thread 的⼏个常⻅属性 2.启动⼀个线程 - start() 经典面试题:start 和run 区别 3.中断⼀个线程 方法一: 方法二: 4.等待⼀个线程 - join() 1.什么是Thread类 Thread类是Java编程语言中的一个重…

图像去噪——CTNet网络推理测试(详细图文教程)

目录 一、CTNet二、源码包准备2.1 测试集2.2 模型权重 三、环境准备四、推理测试4.1 配置参数修改4.2 官网测试4.2.1 测试当通道图像4.2.1.1 命令方式测试4.2.1.2 Configuration配置测试4.2.1.3 测试结果 4.2.2 测试彩色图像4.2.2.1 命令方式测试4.2.2.2 Configuration配置测试…

性能优化-HVX架构简介

来自 「发表于知乎专栏《移动端算法优化》」 本文主要介绍Hexagon DSP的HVX技术,旨在通过简单的语言讲清HVX技术。 🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:高性能(HPC)开…

Elasticsearch 入门向使用

文章目录 ElasticSearch简介倒排索引安装(单节点)分词器kibana与Mysql概念上的对比索引库CRUD文档CRUDDSL查询相关性算分Function Score Query自定义算分Boolean Query 搜索结果处理排序分页高亮 数据聚合 aggregations自动补全数据同步集群 ElasticSearch 简介 Elasticsearc…

轻松掌握AI辅助设计微信红包封面并快速过审

【无矶之谈】轻松使用AI设计微信红包封面/动态封面并快速过审 关注本公众号梦无矶测开实录,2024年1月21日之后关注最新的文章,后台回复封面红包,即可免费领取本号专属微信红包封面。(目前我过审的有五个封面,其中一个…

vue项目执行依赖安装(npm i或npm install )报ls-remote -h -t异常

从git拉取的vue项目执行依赖安装时一直报错, 报错如下图:首先,查看了node版本、npm配置的镜像地址均没找到解决办法。 在命令行中直接输入git发现提示于是从网上搜到了一个博文https://blog.csdn.net/weixin_49159364/article/details/118198…

仰暮计划|“每天清晨五六点钟,爷爷早早起床去田地里采摘蔬菜”

★ 我的奶奶出生于1955年,在我眼里是十分伟大的女性。身处在有六个兄弟姐妹的大家庭里,她从小就肩负起了照顾家人的重任。充满朝气的她,在上学和照顾弟弟妹妹之间穿梭。然而,在她将要上小学五年级的时候,文化大革命的爆…

[绍棠] docxtemplater实现纯前端导出word

1.下载需要的依赖 2.util文件夹下创建doc.js文件 doc.js import docxtemplater from docxtemplater import PizZip from pizzip import JSZipUtils from jszip-utils import { saveAs } from file-saver import ImageModule from "docxtemplater-image-module-free"…

力扣hot100 最长有效括号 动态规划

Problem: 32. 最长有效括号 文章目录 思路Code 思路 👨‍🏫 参考题解 Code ⏰ 时间复杂度: O ( n ) O(n) O(n) 🌎 空间复杂度: O ( n ) O(n) O(n) class Solution {public int longestValidParentheses(String s){int n s.length();…

Python武器库开发-武器库篇之Fofa-API使用(四十六)

Python武器库开发-武器库篇之Fofa-API使用(四十六) FOFA(FOcus Observation of Futures Assets)是一款专业的网络资产搜索引擎,旨在帮助企业发现和评估网络上的潜在安全风险。FOFA的基本原理是通过搜索引擎的方式,按照关键词对互…

【Redis】更改redis中的value值

今天继续进步一点点~~ 背景:今天有个前端的同事问我,能不能在Redis中他本人登录公众号的 sessionID 加上一列openID 于是我上网查了一堆在Redis里面的命令,以及不同的客户端怎么输入命令,但是后来问了下同事,他就给我…

PDshell16逆向PostgreSQL 工程显示字段comment备注

现状:当刚逆向成功的表结构是没有原来表结构中的,comment备注如下 然后pd逆向工程的sql已经返回了这个备注的含义 解决方案: 1、设置显示注释列 tools——Display Preferences…如下 勾选-按照下面得方式勾选这三个 复制这里的VBS脚本&a…

OpenVINS学习7——评估工具的简单使用

前言 OpenVINS自带评估工具,这里记录一下使用方法,我是以VIRAL数据集为例,但是目前仍然有问题,发现误差很大,我还没搞明白哪里出了问题。 工具介绍 主要参考 https://docs.openvins.com/eval-error.html https://bl…

Windows和Linux访问不了GitHub的解决方法

一、Windows访问不了GitHub 问题描述 使用Windows访问GitHub时,出现如下情况,显示无法访问。 解决方案: 打开域名查询网站:https://tool.chinaz.com/dns 输入GitHub的域名,点击立即检测。 出现如下页面&#xff0c…

实验五 PLSQL编程

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要&…

git设置代理

git设置代理 git config --global http.proxy 127.0.0.1:7890git查询代理 git config --global http.proxy git取消代理 git config --global --unset http.proxy

【核心复现】基于改进鲸鱼优化算法的微网系统能量优化管理matlab

目录 一、主要内容 1 冷热电联供型微网系统 2 长短期记忆网络(Long Short Term Memory, LSTM) 3 改进鲸鱼优化算法 二、部分代码 三、运行结果 四、下载链接 一、主要内容 该程序为《基于改进鲸鱼优化算法的微网系统能量优化管理》matlab代码,主要内容如下&…

事件驱动架构

请求驱动 服务注册,服务发现,虽然调用地址隐藏了,但是调用stub必须相同。 rpc通信,远程调用。 生产者和消费者要有相同的stub存根。 消费者和生产者的调用接口是耦合的。 事件驱动 核心:上下游不进行通信 中间通过M…