【深度学习】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 模型。
  • 在线学习:支持实时更新用户行为数据。

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

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

相关文章

python网络安全怎么学 python做网络安全

🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 众所周知,python是近几年比较火的语言之一,它具有简单易懂、免费开源、可移植、可扩展、丰富的第三方库函数等特点,Java需要大…

Ubuntu下mysql主从复制搭建

本文介绍mysql 8.4主从集群的搭建,从单个机器安装到集群的配置,整体走了一遍,希望对大家有帮助。mysql 8.4和之前的版本命令上有些变化,大家用来参考。 0、环境 ubuntu: 22.04mysql:8.4 1、安装mysql 1…

MAC快速本地部署Deepseek (win也可以)

MAC快速本地部署Deepseek (win也可以) 下载安装ollama 地址: https://ollama.com/ Ollama 是一个开源的大型语言模型(LLM)本地运行框架,旨在简化大模型的部署和管理流程,使开发者、研究人员及爱好者能够高效地在本地环境中实验和…

Spring Boot框架总结(超级详细)

前言 本篇文章包含Springboot配置文件解释、热部署、自动装配原理源码级剖析、内嵌tomcat源码级剖析、缓存深入、多环境部署等等,如果能耐心看完,想必会有不少收获。 一、Spring Boot基础应用 Spring Boot特征 概念: 约定优于配置&#…

易基因: ChIP-seq+DRIP-seq揭示AMPK通过调控H3K4me3沉积和R-loop形成以维持基因组稳定性和生殖细胞完整性|NAR

原文:ChIP-seqDRIP-seq揭示AMPK通过调控H3K4me3沉积和R-loop形成以维持基因组稳定性和生殖细胞完整性|NAR 大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 在饥饿等能量胁迫条件下,生物体会通过调整…

uniapp h5端和app端 使用 turn.js

前提:添加页后,添加页与当前页会重叠在一起,不知道为什么,没有找到解决办法 1.h5端 <template><view class"container"><view id"flipbook"><view class"page page1">Page 1</view><view class"page pag…

MySQL数据库(3)—— 表操作

目录 一&#xff0c;创建表 1.1 创建表的SQL 1.2 演示 二&#xff0c;查看表 三&#xff0c;修改表 四&#xff0c;删除表 常用的表操作会涉及到两种SWL语句 DDL&#xff08;Data Definition Language&#xff09;数据定义语言&#xff1a;建表、改表、删表等&#xff0…

【精调】LLaMA-Factory 快速开始4 自定义个一个sharegpt数据集并训练

数据格式说明 LLaMA Factory:微调LLaMA3模型实现角色扮演 数据集 参考 开源模型应用落地-DeepSeek-R1-Distill-Qwen-7B-LoRA微调-LLaMA-Factory-单机单卡-V100(一) 大神给出的数据集的讲解:注册 如

Unity 位图字体

下载Bitmap Font Generator BMFont - AngelCode.com 解压后不用安装直接双击使用 提前设置 1、设置Bit depth为32 Options->Export options 2、清空所选字符 因为我们将在后边导入需要的字符。 Edit->Select all chars 先选择所有字符 Edit->Clear all chars i…

open webui 部署 以及解决,首屏加载缓慢,nginx反向代理访问404,WebSocket后端服务器链接失败等问题

项目地址&#xff1a;GitHub - open-webui/open-webui: User-friendly AI Interface (Supports Ollama, OpenAI API, ...) 选择了docker部署 如果 Ollama 在您的计算机上&#xff0c;请使用以下命令 docker run -d -p 3000:8080 --add-hosthost.docker.internal:host-gatewa…

Servlet概述(Ⅰ)

目录 一、Servlet概述 演示 创建JavaWeb项目&#xff08;2017版本为例&#xff09; 1. 打开 IntelliJ IDEA 2. 选择项目类型 3. 配置框架 二、Servlet初识(熟练) 1.servlet说明 2.Servlet 接口方法 3.创建Servlet 4.JavaWeb请求响应流程 ​编辑 ​编辑 5.servlet…

Spring Cloud — Hystrix 服务隔离、请求缓存及合并

Hystrix 的核心是提供服务容错保护&#xff0c;防止任何单一依赖耗尽整个容器的全部用户线程。使用舱壁隔离模式&#xff0c;对资源或失败单元进行隔离&#xff0c;避免一个服务的失效导致整个系统垮掉&#xff08;雪崩效应&#xff09;。 1 Hystrix监控 Hystrix 提供了对服务…

DeepSeek 助力 Vue 开发:打造丝滑的 键盘快捷键(Keyboard Shortcuts)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

WPS接入deepseek-OfficeAI助手插件下载

功能简介 OfficeAI 助手 是一款免费的智能AI办公工具软件&#xff0c;专为 Microsoft Office 和 WPS 用户打造。 无论你是在寻找如何输入“打勾&#xff08;√&#xff09;符号”的方法&#xff0c;还是想知道“怎么在插入表格前添加文字”&#xff0c;或者“该用哪个公式”&a…

关系数据理论

一、函数依赖 若t1(X)t2(X),必有t1(Y)t2(Y),那么我们称属性组X函数确定属性组Y&#xff0c;或者说Y函数依赖于X。记为X->Y&#xff0c;其中X叫决定因素&#xff0c;Y叫依赖因素。 平凡函数依赖与非平凡函数依赖&#xff1a; 二、1-BCNF 评价关系模式“好坏”的理论标准就…

【C】队列与栈的相互转换

栈与队列是两种特点相反的数据结构&#xff0c;一个特点是后进先出&#xff0c;一个特点是先进先出&#xff0c;但是他们之间是可以相互转换的。 目录 1 用队列实现栈 1&#xff09; 题目解析 2&#xff09; 算法解析 &#xff08;1&#xff09; 结构(MyStack) &#xff…

有向图的强连通分量: Kosaraju算法和Tarjan算法详解

在上一篇文章中, 我们了解了图的最小生成树算法. 本节我们来学习 图的强连通分量(Strongly Connected Component, SCC) 算法. 什么是强连通分量? 在 有向图 中, 若一组节点内的任意两个节点都能通过路径互相到达(例如 A → B A \rightarrow B A→B 且 B → A B \rightarro…

如何为自己的 PDF 文件添加密码?在线加密 PDF 文件其实更简单

随着信息泄露和数据安全问题的日益突出&#xff0c;保护敏感信息变得尤为重要。加密 PDF 文件是一种有效的手段&#xff0c;可以确保只有授权用户才能访问或修改文档内容。本文将详细介绍如何使用 CleverPDF 在线工具为你的 PDF 文件添加密码保护&#xff0c;确保其安全性。 为…

面向机器学习的Java库与平台简介、适用场景、官方网站、社区网址

Java机器学习的库与平台 最近听到有的人说要做机器学习就一定要学Python&#xff0c;我想他们掌握的知识还不够系统、不够全面。本文作者给大家介绍几种常用Java实现的机器学习库&#xff0c;快快收藏加关注吧&#xff5e; Java机器学习库表格 Java机器学习库整理库/平台概念…

Kubernetes 使用 Kube-Prometheus 构建指标监控 +飞书告警

1 介绍 Prometheus Operator 为 Kubernetes 提供了对 Prometheus 机器相关监控组件的本地部署和管理方案&#xff0c;该项目的目的是为了简化和自动化基于 Prometheus 的监控栈配置&#xff0c;主要包括以下几个功能&#xff1a; Kubernetes 自定义资源&#xff1a;使用 Kube…