【阿旭机器学习实战】【37】电影推荐系统---基于矩阵分解

news/2024/4/23 17:50:46/文章来源:https://blog.csdn.net/qq_42589613/article/details/129243286

【阿旭机器学习实战】系列文章主要介绍机器学习的各种算法模型及其实战案例,欢迎点赞,关注共同学习交流。

电影推荐系统

目录

  • 电影推荐系统
  • 1. 问题介绍
    • 1.1推荐系统矩阵分解方法介绍
    • 1.2 数据集:ml-100k
  • 2. 推荐系统实现
    • 2.1 定义矩阵分解函数
    • 2.2 基于上述矩阵分解实现电影推荐
    • 默认的SGD方法
    • 用 surpise 内建的基于最近邻的方法做比较
    • 用 surpise 内建的基于 SVD 的方法做比较

1. 问题介绍

使用矩阵分解, 根据用户给短电影的评分数据, 做一个千人千面的个性化推荐系统。

需要安装推荐系统库surprise, 使用如下命令安装: pip install scikit-surprise

1.1推荐系统矩阵分解方法介绍

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 数据集:ml-100k

该数据集包括了943位用户对1682部电影的评分信息(总共100,000),评分也是1-5的整数;

  • u.data文件包含了100,000条评分信息,每条记录的形式:user id | item id | rating | timestamp.(分隔符是一个tab)

2. 推荐系统实现

2.1 定义矩阵分解函数

关注GZH:阿旭算法与机器学习,回复:“电影推荐系统”即可获取本文数据集、源码与项目文档

# 导入 nunpy 和 surprise 辅助库
import numpy as np
import surprise  

注: Surprise库本身没有提供纯粹的矩阵分解的算法, 在这里我们自己实现了基于Alternating Least Squares的矩阵分解, 使用梯度下降法优化;
矩阵分解类MatrixFactorization继承了surprise.AlgoBase, 方便我们使用surpise库提供的其它功能

class MatrixFactorization(surprise.AlgoBase):'''基于矩阵分解的推荐.'''def __init__(self, learning_rate, n_epochs, n_factors, lmd):self.lr = learning_rate  # 梯度下降法的学习率self.n_epochs = n_epochs  # 梯度下降法的迭代次数self.n_factors = n_factors  # 分解的矩阵的秩(rank)self.lmd = lmd # 防止过拟合的正则化的强度def fit(self, trainset):'''通过梯度下降法训练, 得到所有 u_i 和 p_j 的值'''print('Fitting data with SGD...')# 随机初始化 user 和 item 矩阵.u = np.random.normal(0, .1, (trainset.n_users, self.n_factors))p = np.random.normal(0, .1, (trainset.n_items, self.n_factors))# 梯度下降法for _ in range(self.n_epochs):for i, j, r_ij in trainset.all_ratings():err = r_ij - np.dot(u[i], p[j])# 利用梯度调整 u_i 和 p_ju[i] -= -self.lr * err * p[j] + self.lr * self.lmd * u[i]p[j] -= -self.lr * err * u[i] + self.lr * self.lmd * p[j]# 注意: 修正 p_j 时, 按照严格定义, 我们应该使用 u_i 修正之前的值, 但是实际上差别微乎其微self.u, self.p = u, pself.trainset = trainsetdef estimate(self, i, j):'''预测 user i 对 item j 的评分.'''# 如果用户 i 和物品 j 是已知的值, 返回 u_i 和 p_j 的点积# 否则使用全局平均评分rating值(cold start 冷启动问题)if self.trainset.knows_user(i) and self.trainset.knows_item(j):return np.dot(self.u[i], self.p[j])else:return self.trainset.global_mean

2.2 基于上述矩阵分解实现电影推荐

from surprise import BaselineOnly
from surprise import Dataset
from surprise import Reader
from surprise import accuracy
from surprise.model_selection import cross_validate
from surprise.model_selection import train_test_split
import os# 数据文件
file_path = os.path.expanduser('./ml-100k/u.data')
# - u.data文件包含了100,000条评分信息,每条记录的形式:user id | item id | rating | timestamp.(分隔符是一个tab)
# 数据文件的格式如下:
# 'user item rating timestamp', 使用制表符 '\t' 分割, rating值在1-5之间.
reader = Reader(line_format='user item rating timestamp', sep='\t', rating_scale=(1, 5))
data = Dataset.load_from_file(file_path, reader=reader)
# 查看文件内容
import pandas as pd
df = pd.read_csv("./ml-100k/u.data")
df.head()
196\t242\t3\t881250949
0186\t302\t3\t891717742
122\t377\t1\t878887116
2244\t51\t2\t880606923
3166\t346\t1\t886397596
4298\t474\t4\t884182806
df.shape
(99999, 1)

默认的SGD方法

# 将数据随机分为训练和测试数据集
trainset, testset = train_test_split(data, test_size=.25)# 初始化以上定义的矩阵分解类.
algo = MatrixFactorization(learning_rate=.005, n_epochs=60, n_factors=2, lmd = 0.2)# 训练
algo.fit(trainset)# 预测
predictions = algo.test(testset)# 计算平均绝对误差
accuracy.mae(predictions)
Fitting data with SGD...
MAE:  0.7818
0.7817791289983778

用 surpise 内建的基于最近邻的方法做比较

# 使用 surpise 内建的基于最近邻的方法做比较
algo = surprise.KNNBasic()
algo.fit(trainset)
predictions = algo.test(testset)
accuracy.mae(predictions)
Computing the msd similarity matrix...
Done computing similarity matrix.
MAE:  0.7725
0.7724598550399949

用 surpise 内建的基于 SVD 的方法做比较

# 使用 surpise 内建的基于 SVD 的方法做比较
algo = surprise.SVD()
algo.fit(trainset)
predictions = algo.test(testset)
accuracy.mae(predictions)
MAE:  0.7398
0.7397586022054631

如果文章对你有帮助,感谢点赞+关注!

关注下方GZH:阿旭算法与机器学习,回复:“电影推荐系统”即可获取本文数据集、源码与项目文档,欢迎共同学习交流

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

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

相关文章

消息中间件的概念

中间件(middleware)是基础软件的一大类,属于可复用的软件范畴。中间件在操作系统软件,网络和数据库之上,应用软件之下,总的作用是为处于自己上层的应用软件提供运行于开发的环境,帮助用户灵活、高效的开发和集成复杂的…

ICA简介:独立成分分析

1. 简介 您是否曾经遇到过这样一种情况:您试图分析一个复杂且高度相关的数据集,却对信息量感到不知所措?这就是独立成分分析 (ICA) 的用武之地。ICA 是数据分析领域的一项强大技术,可让您分离和识别多元数据集中的底层独立来源。 …

PPP简介,PPP分层体系架构,PPP链路建立过程及PPP的帧格式

PPP(Point-to-Point Protocol)是一种用于在两个网络节点之间传输数据的通信协议。它最初是为在拨号网络上进行拨号连接而开发的,现在已经被广泛应用于各种网络环境中,例如在宽带接入、虚拟专用网(VPN)等场景…

【JAVA】一个项目如何预先加载数据?

这里写目录标题需求实现AutowiredPostConstruct实例CommandLineRunner实例ApplicationListener实例参考需求 一般我们可能会有一些在应用启动时加载资源的需求,局部或者全局使用,让我们来看看都有哪些方式实现。 实现 Autowired 如果是某个类里需求某…

[1]MyBatis+Spring+SpringMVC+SSM整合

一、MyBatis 1、MyBatis简介 1.1、MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下, iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github。…

Vue中如何利用websocket实现实时通讯

首先我们可以先做一个简单的例子来学习一下简单的websocket模拟聊天对话的功能 原理很简单,有点像VUE中的EventBus,用emit和on传来传去 首先我们可以先去自己去用node搭建一个本地服务器 步骤如下 1.新建一个app.js,然后创建pagejson.js文…

【Linux】-- POSIX信号量

目录 POSIX信号量 sem_init - 初始化信号量 sem_destroy - 销毁信号量 sem_wait - 等待信号量(P操作) 基于环形队列的生产消费模型 数据结构 - 环形结构 实现原理 POSIX信号量 #问:什么是信号量? 1. 共享资源 -> 任何一…

【笔记】两台1200PLC进行S7 通信(1)

使用两台1200系列PLC进行S7通信(入门) 文章目录 目录 文章目录 前言 一、通信 1.概念 2.PLC通信 1.串口 2.网口 …

时间颗粒度选择(通过选择时间范围和颗粒度展示选项)

<template><div><el-time-selectplaceholder"起始时间"v-model"startTime":picker-options"startPickerOptions"change"changeStartTime"></el-time-select><el-time-selectplaceholder"结束时间&quo…

想招到实干派程序员?你需要这种面试法

技术招聘中最痛的点其实是不精准。技术面试官或CTO们常常会向我们吐槽&#xff1a; “我经常在想&#xff0c;能不能把我们项目中的代码打印出来&#xff0c;作为候选人的面试题的一部分&#xff1f;” “能不能把一个Bug带上环境&#xff0c;让候选人来试试怎么解决&#xf…

mysql中用逗号隔开的字段作查询用(find_in_set的使用)

mysql中用逗号隔开的字段作查询用(find_in_set的使用) 场景说明 在工作中&#xff0c;经常会遇到一对多的关系。想要在mysql中保存这种关系&#xff0c;一般有两种方式&#xff0c;一种是建立一张中间表&#xff0c;这样一条id就会存在多条记录。或者采用第二种方式&#xff…

【数据结构必会基础】关于树,你所必须知道的亿些概念

目录 1.什么是树 1.1浅显的理解树 1.2 数据结构中树的概念 2.树的各种结构概念 2.1 节点的度 2.2 根节点/叶节点/分支节点 2.3 父节点/子节点 2.4祖先节点/子孙节点 2.5兄弟节点 2.6树的度 2.7节点的层次 2.8森林 3. 如何用代码表示一棵树 3.1链式结构 3.1.1 树节…

Gitea Windows环境下服务搭建

前言&#xff1a;这篇文章没有去分析各大平台的优劣势&#xff0c;仅教学大家搭建一个属于自己的git代码管理器&#xff0c;主要作用在局域网内&#xff0c;办公电脑搭建一个简单的Gitea代码管理器。数据库使用SQLite3&#xff0c;环境是windows10。如果不是这个环境的话&#…

@Import注解的原理

此注解是springboot自动注入的关键注解&#xff0c;所以拿出来单独分析一下。 启动类的run方法跟进去最终找到refresh方法&#xff1b; 这里直接看这个org.springframework.context.support.AbstractApplicationContext#refresh方法即可&#xff0c;它下面有一个方法 invoke…

Node下载阿里OSS存储文件【不知目录结构】

前言&#xff1a;前端传模型ID&#xff0c;后台根据ID去阿里OSS存储下载对应文件&#xff08;不知文件内部层级结构&#xff0c;且OSS只能单个文件下载&#xff09;&#xff0c;打包成zip字节流形式返回给前端下载。 需求分析&#xff1a; 生成OSS文件关系树Node做文件下载存…

kafka(一) 的架构,各概念

Kafka架构 Kafak 总体架构图中包含多个概念&#xff1a; &#xff08;1&#xff09;ZooKeeper&#xff1a;Zookeeper负责保存broker集群元数据&#xff0c;并对控制器进行选举等操作。 &#xff08;2&#xff09;Producer&#xff1a; 生产者负责创建消息&#xff0c;将消息发…

【神经网络】LSTM为什么能缓解梯度消失

1.LSTM的结构 我们先来看一下LSTM的计算公式&#xff1a; 1.遗忘门&#xff1a; 2.输入门&#xff1a; 3.细胞状态 4.输出门 2.LSTM的梯度路径 根据LSTM的计算公式&#xff0c;可以得出LSTM的cell state与、、都存在计算关系&#xff0c;而、、的计算公式又全部都与有关&#x…

RPC异步化原理

深入RPC&#xff0c;更好使用RPC&#xff0c;须从RPC框架整体性能考虑问题。得知道如何提升RPC框架的性能、稳定性、安全性、吞吐量及如何在分布式下快速定位问题。RPC框架如何压榨单机吞吐量&#xff1f; 1 前言 TPS一直上不去&#xff0c;压测时CPU压到40%&#xff5e;50%就…

bug的创建和等级

1.如何合理的创建一个bug 创建bug的要素 &#xff1a;问题的版本&#xff0c;发现问题的环境&#xff0c;发现问题的步骤&#xff0c;预取结果&#xff0c;实际结果。 eg&#xff1a; 1.问题的版本&#xff1a;谷歌浏览器108版本 2.发现问题的环境&#xff1a;windows11家庭版…

CHAPTER 2 CentOS的日志系统(日志工具)

日志工具2.1 rsyslogd(syslogd)2.1.1 介绍2.1.2 语法2.1.3 配置文件syslog.conf2.1.4 syslog.conf的配置规则2.1.5 示例2.2 logrotate2.2.1 介绍2.2.2 配置文件2.2.3 示例一2.2.4 示例二2.3 dmesg2.3.1 命令简介2.3.2 使用示例2.4 关于重启/死机的日志2.4.1 last2.4.2 日志查看…