当前位置: 首页 > article >正文

【深度学习】Pytorch项目实战-基于协同过滤实现物品推荐系统

一、推荐系统的了解

1. 定义

推荐系统是一个信息过滤系统,旨在为用户提供个性化的内容推荐。它利用用户的历史行为、偏好以及其他相关数据来推测用户可能感兴趣的项目或信息。推荐系统广泛应用于电子商务、社交媒体、流媒体服务等领域,帮助用户发现商品、电影、音乐、文章等。

2. 推荐系统的基本类型

推荐系统主要可以分为以下几类:

2.1 基于内容的推荐(Content-based Filtering)
  • 基于用户过去喜欢的物品的特征,推荐具有相似特征的新物品。
  • 例如,如果用户在看电影时对科幻类电影表现出偏好,系统会推荐其他科幻电影。
  • 使用特征提取技术(如词袋模型、TF-IDF等)来分析物品内容。
2.2 协同过滤推荐(Collaborative Filtering)

基于用户与其他用户之间的互动和偏好,推荐相似用户喜欢的物品。
(1)有两种主要的协同过滤方法:

  • 用户协同过滤:寻找与目标用户相似的用户,推荐这些用户喜爱的物品。
  • 物品协同过滤:寻找与目标物品相似的物品,推荐用户已喜欢的物品。

优点是无需了解物品的具体内容,只需关注用户行为。

2.3 混合推荐(Hybrid Methods):
  • 结合多种推荐方法来产生更准确和强大的推荐结果。
  • 例如,可以结合内容过滤和协同过滤,以弥补各自的不足。

3. 推荐系统在实际应用中面临一些挑战

(1)冷启动问题:新用户或新项目没有足够的数据来生成推荐。
(2)用户隐私:如何在不泄漏用户隐私的情况下收集和使用数据。
(3)多样性与新颖性:避免过于集中于用户过去的偏好,提供更多样化和新颖的推荐。
(4)数据稀疏性:特别是在大规模用户和物品的情况下,数据稀疏会影响推荐质量。

二、推荐系统项目实战

在本例中,使用矩阵分解(Matrix Factorization) 方法来实现协同过滤。这种方法通过将用户-物品交互矩阵分解为两个低维矩阵(用户嵌入和物品嵌入),从而预测用户对未评分物品的偏好。以下是实现步骤:

1. 数据准备

我们需要一个用户-物品交互数据集。例如:
用户 ID
物品 ID
评分(或点击次数)
示例数据:

import pandas as pd
# 创建模拟数据
data = {"user_id": [0, 0, 1, 1, 2, 2, 3, 3],"item_id": [0, 1, 0, 2, 1, 2, 0, 1],"rating": [5, 3, 4, 2, 5, 1, 3, 4]
}
df = pd.DataFrame(data)
print(df)

输出:

   user_id  item_id  rating
0        0        0       5
1        0        1       3
2        1        0       4
3        1        2       2
4        2        1       5
5        2        2       1
6        3        0       3
7        3        1       4

2. 数据预处理

我们需要将用户 ID 和物品 ID 转换为连续的索引,并创建训练数据集。
数据预处理代码:

from torch.utils.data import Dataset, DataLoader
class RatingDataset(Dataset):def __init__(self, df):self.users = df["user_id"].valuesself.items = df["item_id"].valuesself.ratings = df["rating"].valuesdef __len__(self):return len(self.users)def __getitem__(self, idx):return {"user_id": self.users[idx],"item_id": self.items[idx],"rating": self.ratings[idx]}
# 创建数据集和数据加载器
dataset = RatingDataset(df)
dataloader = DataLoader(dataset, batch_size=2, shuffle=True)

3. 模型设计

我们使用矩阵分解方法,将用户和物品映射到低维嵌入空间,并通过点积计算预测评分。
模型代码:

import torch
import torch.nn as nn
class MatrixFactorization(nn.Module):def __init__(self, num_users, num_items, embedding_dim):super(MatrixFactorization, self).__init__()self.user_embedding = nn.Embedding(num_users, embedding_dim)self.item_embedding = nn.Embedding(num_items, embedding_dim)def forward(self, user_ids, item_ids):user_embeds = self.user_embedding(user_ids)item_embeds = self.item_embedding(item_ids)ratings = (user_embeds * item_embeds).sum(dim=1)return ratings

4. 训练模型

定义损失函数和优化器,并训练模型。
训练代码:

# 初始化模型、损失函数和优化器
num_users = df["user_id"].nunique()
num_items = df["item_id"].nunique()
embedding_dim = 8
model = MatrixFactorization(num_users, num_items, embedding_dim)
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
# 训练循环
num_epochs = 10
for epoch in range(num_epochs):total_loss = 0for batch in dataloader:user_ids = batch["user_id"]item_ids = batch["item_id"]ratings = batch["rating"]# 前向传播predicted_ratings = model(user_ids, item_ids)loss = criterion(predicted_ratings, ratings.float())# 反向传播optimizer.zero_grad()loss.backward()optimizer.step()total_loss += loss.item()print(f"Epoch {epoch+1}, Loss: {total_loss:.4f}")

5. 模型评估

我们可以使用测试数据集评估模型性能,或者直接预测用户对未评分物品的偏好。
预测代码:

# 测试预测
test_user_id = torch.tensor([0])  # 用户 ID
test_item_id = torch.tensor([2])  # 物品 ID
predicted_rating = model(test_user_id, test_item_id)
print(f"Predicted rating for user {test_user_id.item()} and item {test_item_id.item()}: {predicted_rating.item():.4f}")

6. 推荐物品

根据预测评分,为用户推荐评分最高的物品。
推荐代码:

def recommend_items(model, user_id, num_items, top_k=3):item_ids = torch.arange(num_items)user_ids = torch.full_like(item_ids, user_id)predicted_ratings = model(user_ids, item_ids)# 获取评分最高的物品top_items = torch.topk(predicted_ratings, top_k).indicesreturn top_items.tolist()
# 为用户 0 推荐物品
recommended_items = recommend_items(model, user_id=0, num_items=num_items, top_k=3)
print(f"Recommended items for user 0: {recommended_items}")

三、总结

3.1 实现推荐系统核心步骤

  • 数据准备:收集用户-物品交互数据。
  • 数据预处理:将数据转换为 PyTorch 数据集。
  • 模型设计:使用矩阵分解方法构建推荐模型。
  • 模型训练:定义损失函数和优化器,训练模型。
  • 模型评估:测试模型性能,预测用户对物品的评分。
  • 推荐物品:根据预测评分生成推荐列表。

通过上述步骤,你可以快速实现一个基于 PyTorch 的推荐系统,并根据需求进一步扩展功能。

3.2 扩展方向

  • 多模态推荐:结合文本、图像等信息提升推荐效果。
  • 深度学习模型:使用神经协同过滤(NeuMF)或 Transformer 模型。
  • 在线学习:支持实时更新用户行为数据。

相关文章:

【深度学习】Pytorch项目实战-基于协同过滤实现物品推荐系统

一、推荐系统的了解 1. 定义 推荐系统是一个信息过滤系统,旨在为用户提供个性化的内容推荐。它利用用户的历史行为、偏好以及其他相关数据来推测用户可能感兴趣的项目或信息。推荐系统广泛应用于电子商务、社交媒体、流媒体服务等领域,帮助用户发现商品…...

空字符串““、空白字符串“ “和 null 三者的区别

空字符串、空白字符串和 null 三者的区别表格: 类型定义示例长度是否有值空字符串字符串长度为 0,但不是 null,即存在一个有效的空字符串对象。""0有值(空值)空白字符串字符串包含空格、制表符等空白字符&a…...

【Pandas】pandas Series sample

Pandas2.2 Series Computations descriptive stats 方法描述Series.align(other[, join, axis, level, …])用于将两个 Series 对齐,使其具有相同的索引Series.case_when(caselist)用于根据条件列表对 Series 中的元素进行条件判断并返回相应的值Series.drop([lab…...

AF3 _build_query_to_hit_index_mapping函数解读

AlphaFold3 中templates模块的_build_query_to_hit_index_mapping函数是将原始查询序列(original_query_sequence)中的索引与hit 序列(hit_sequence)中的索引进行映射。 在蛋白质序列比对(如 HHsearch)中,hit 是与查询序列部分匹配的区域。由于存在缺口(-)和部分比对…...

在mfc中使用自定义三维向量类和计算多个三维向量的平均值

先添加一个普通类, Vector3.h, // Vector3.h: interface for the Vector3 class. // //#if !defined(AFX_VECTOR3_H__53D34D26_95FF_4377_BD54_57F4271918A4__INCLUDED_) #define AFX_VECTOR3_H__53D34D26_95FF_4377_BD54_57F4271918A4__INCLUDED_#if _MSC_VER > 1000 #p…...

UE_C++ —— Container TSet

目录 一,TSet 二,Creating and Filling a Set Editing UPROPERTY TSets 三,Iteration 四,Queries 五,Removal 六,Sorting 七,Operators 八,Slack 九,DefaultKe…...

多线程和并发篇

多线程和并发篇 创建一个对象时底层汇编指令实现步骤(cpu可能会进行指令重排序):一、二、三级缓存的实现:并发编程三要素:线程的五大状态:创建线程的三种方式:线程的特征和状态:Thre…...

【3.5JavaScript】JavaScript字符串对象

文章目录 1.获取字符串长度2.大小写转换3.获取某一个字符4.截取字符串5.替换字符串6.分割字符串7.检索字符串位置8.例题:统计某一个字符的个数 在 JavaScript 中,对象是非常重要的知识点。对象分为两种:一种是 ”自定义对象“,另…...

Apache Flink架构深度解析:任务调度、算子数据同步与TaskSlot资源管理机制

Apache Flink是一个分布式流处理框架,其核心架构设计围绕有界与无界数据流的统一处理能力展开。以下从任务分配、算子数据同步、TaskManager与JobManager的TaskSlot机制三个维度展开详细分析: 一、任务分配机制 Flink的任务分配基于并行度(P…...

路由基本配置

学习目标 • 根据拓扑图进行网络布线。 • 清除启动配置并将路由器重新加载为默认状态。 • 在路由器上执行基本配置任务。 • 配置并激活以太网接口。 • 测试并检验配置。 • 思考网络实施方案并整理成文档。 任务 1:网络布线 使用适当的电缆类型连接网络设备。…...

windows上vscode cmake工程搭建

安装vscode插件: 1.按装fastc(主要是安装MinGW\mingw64比较方便) 2.安装C,cmake,cmake tools插件 3.准备工作完成之后,按F1,选择cmake:Quick Start就可以创建一个cmake工程。 4.设置Cmake: G…...

VUE3+TS+element-plus项目从0开始入门 - 创建项目、认识基本结构

文章目录 写在前面1、创建vue3项目npm create vuelatestnpm i 2、项目结构.vscodevue3结构a、项目树结构b、package.jsonc、tsconfig.jsond、index.htmld、srce、main.tsf、App.vue 写在前面 开前请自行下载vs code、node.js, 在vs code里面安装Vue - Official插件。本文使用的…...

shared_ptr 不析构的问题记录

片段1: 片段2: 你们猜 哪个有问题 ?...

DeepSeek模型量化

技术背景 大语言模型(Large Language Model,LLM),可以通过量化(Quantization)操作来节约内存/显存的使用,并且降低了通讯开销,进而达到加速模型推理的效果。常见的就是把Float16的浮…...

原生稀疏注意力机制(NSA):硬件对齐且可原生训练的稀疏注意力机制-论文阅读

摘要 长上下文建模对于下一代语言模型至关重要,但标准注意力机制的高计算成本带来了巨大的计算挑战。稀疏注意力提供了一种在保持模型能力的同时提高效率的有前途的方向。本文提出了一种名为 NSA(原生可训练稀疏注意力机制) 的方法&#xff…...

从0到1:固件分析

固件分析 0x01 固件提取 1、从厂商官网下载 例如D-link的固件: https://support.dlink.com/resource/products/ 2、代理或镜像设备更新时的流量 发起中间人攻击MITM #启用IP转发功能 echo 1 > /proc/sys/net/ipv4/ip_forward#配置iptables,将目…...

Zookeeper(58)如何在Zookeeper中实现分布式锁?

在 Zookeeper 中实现分布式锁是一种常见的用例。Zookeeper 提供了强一致性、高可用性的分布式协调服务,使得它非常适合用来实现分布式锁。以下是详细的步骤和代码示例,展示如何在 Zookeeper 中实现分布式锁。 1. Zookeeper 分布式锁的基本原理 Zookeep…...

23种设计模式 - 观察者模式

模式定义 观察者模式(Observer Pattern)是一种行为型设计模式,定义了一对多的依赖关系:当一个对象(称为主题)状态变化时,所有依赖它的对象(称为观察者)会自动收到通知并…...

conda、anaconda、pip、pytorch、tensorflow有什么区别?

先画一张图,可以大致看出它们的区别和关联: pytorch、tensorflow都是Python的第三方库,相当于封装的代码工具集库,通过import导入使用。这两个都是深度学习框架,用来搭建AI模型什么的,使用范围非常之广&…...

项目设置内网 IP 访问实现方案

在我们平常的开发工作中,项目开发、测试完成后进行部署上线。比如电商网站、新闻网站、社交网站等,通常对访问不会进行限制。但是像企业内部网站、内部管理系统等,这种系统一般都需要限制访问,比如内网才能访问等。那么一个网站应…...

Vue面试2

1.跨域问题以及如何解决跨域 跨域问题(Cross-Origin Resource Sharing, CORS)是指在浏览器中,当一个资源试图从一个不同的源请求另一个资源时所遇到的限制。这种限制是浏览器为了保护用户安全而实施的一种同源策略(Same-origin p…...

合合信息2025届春季校园招聘全面启动!

世界因你而AI,合合信息2025届春季校园招聘启动! 我们是谁? 我们是一家行业领先的人工智能及大数据科技企业 18年深耕AI领域,C端产品与B端服务布局矩阵完善 9.4亿全球累计用户首次下载量💥 来到这里你能得到什么&a…...

如何利用 Vue 的生命周期钩子进行初始化和清理操作?

一、初始化操作的核心钩子 1. created(选项式API) export default {data() {return { user: null };},created() {// 适合初始化数据、发起非DOM操作请求this.fetchUser();},methods: {async fetchUser() {const response await fetch(/api/user);thi…...

Excell 代码处理

文章目录 Excell 代码处理cvc格式xlsl格式小结 Excell 代码处理 有时候要对excell进行分析,或者数据的导入导出,这个时候如果可以用代码读写分析操作那么会方便很多 cvc格式 CSV(Comma-Separated Values,逗号分隔值)是…...

KMP的next数组构建详解

KMP的next数组构建详解 1. next数组的作用 核心功能:在KMP算法中,当模式串与主串发生不匹配时,next数组决定模式串指针回退的位置,避免无效匹配。 定义:next[i]表示子串s[0...i]的最长公共前后缀长度。例如&#xff…...

Docker 的安全配置与优化(二)

Docker 安全优化策略 (一)多阶段构建优化镜像大小 多阶段构建是 Docker 17.05 版本引入的强大功能,它允许在一个 Dockerfile 中定义多个构建阶段,每个阶段都可以使用不同的基础镜像和依赖项,最终只将必要的文件和依赖…...

shiro代码层面追踪

文章目录 环境漏洞分析硬编码 反序列化Gadget构造 环境 环境搭建:https://blog.csdn.net/qq_44769520/article/details/123476443 漏洞分析 硬编码 shiro是对rememberMe这个cookie进⾏反序列化的时候出现了问题。 相应代码 // // Source code recreated from …...

通信系统中物理层与网络层联系与区别

在通信系统中,物理层和网络层是OSI(开放系统互连)模型中的两个重要层次,分别位于协议栈的最底层和第三层。它们在功能、职责和实现方式上有显著的区别,但同时也在某些方面存在联系。以下是物理层与网络层的联系与区别的…...

虚拟机网络ssh连接失败,没有网络

vscode进行ssh时连接失败,发现是虚拟机没有网络。 虚拟机ping不通www.baidu.com但可以ping通内网 ping 8.8.8.8ping不通。 sudo dhclient -r ens33 sudo dhclient ens33 ip route show可以了。 20250221记录:不知道是不是重启了虚拟机还是咋了&#…...

已知点矩阵的三个顶点坐标、行列数和行列的间距,计算得出剩余所有点的坐标

已知点矩阵的三个顶点坐标、行列数和行列的间距,计算得出剩余所有点的坐标 计算矩阵中每个点的坐标代码实现案例图调用验证 计算矩阵中每个点的坐标 给定左上角、左下角和右上角三个点的坐标,以及矩阵的行数、列数、行间距和列间距,我们可以…...