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

yelp数据集上试验SVD,SVDPP,PMF,NMF 推荐算法

SVD、SVD++、PMF 和 NMF 是几种常见的推荐算法,它们主要用于协同过滤和矩阵分解方法来生成个性化推荐。下面是对每种算法的简要介绍:

1. SVD(Singular Value Decomposition)

  • 用途:SVD 是一种矩阵分解技术,通常用于降维和数据压缩。在推荐系统中,SVD 用于分解用户-物品评分矩阵,从而识别潜在的特征。
  • 原理:SVD 将评分矩阵分解为三个矩阵的乘积:用户矩阵、奇异值矩阵和物品矩阵。通过保留前几个最大的奇异值,可以捕捉到用户和物品之间的隐含关系。
  • 优势:能够处理稀疏数据,提取潜在特征,生成个性化推荐。
  • 缺点:对缺失值敏感,且需要较大的计算量。

2. SVD++(SVD Plus Plus)

  • 用途:SVD++ 是对 SVD 的扩展,考虑了用户对未评分物品的潜在偏好。
  • 原理:除了使用传统的 SVD 方法外,SVD++ 还引入了隐式反馈(如用户浏览、点击等行为),将这些信息融入模型中,增强了对用户偏好的捕捉能力。
  • 优势:比传统 SVD 更加准确,能够更好地利用隐式反馈信息,适应性更强。
  • 缺点:模型复杂度增加,训练时间较长。

3. PMF(Probabilistic Matrix Factorization)

  • 用途:PMF 是一种基于概率的矩阵分解方法,用于推荐系统。
  • 原理:PMF 假设用户和物品的特征遵循正态分布,通过最大化似然函数来学习这些特征。与 SVD 不同,PMF 通过引入概率模型来捕捉用户和物品之间的关系。
  • 优势:能够处理缺失值,适应性强,适用于稀疏数据。
  • 缺点:计算复杂度较高,可能需要较长的训练时间。

4. NMF(Non-negative Matrix Factorization)

  • 用途:NMF 是一种非负矩阵分解方法,常用于推荐系统和特征学习。
  • 原理:NMF 将原始评分矩阵分解为两个非负矩阵的乘积,这些非负特征使得模型在解释上更具可解释性。
  • 优势:生成的特征可以更直观地理解,适合处理非负数据(如评分、计数等)。
  • 缺点:可能会收敛到局部最优解,且在稀疏数据上表现不如 SVD 和 PMF。

各个推荐算法具有的特点是

  • SVD:利用矩阵分解捕捉用户和物品的隐含特征。
  • SVD++:在 SVD 的基础上引入隐式反馈,增强推荐精度。
  • PMF:基于概率模型的矩阵分解,适应性强。
  • NMF:非负矩阵分解,生成可解释的特征表示。

安装scikit-surprise

pip install pandas scikit-surprise

使用SVD

import pandas as pd
from surprise import Reader, Dataset, SVD
from surprise.model_selection import train_test_split
from surprise import accuracy
import json# 1. 加载Yelp数据集
# 假设数据文件名为 'yelp_academic_dataset_review.json'
file_path = 'yelp_academic_dataset_review.json'# 加载JSON文件到DataFrame
with open(file_path, 'r') as f:data = [json.loads(line) for line in f]# 将数据转换为pandas DataFrame
df = pd.DataFrame(data)# 2. 选择必要的字段:user_id, business_id, rating
df = df[['user_id', 'business_id', 'stars']]  # 假设评分字段是 'stars'# 3. 数据预处理:将DataFrame转换为适合Surprise库的格式
reader = Reader(rating_scale=(1, 5))  # 假设评分是1到5
dataset = Dataset.load_from_df(df[['user_id', 'business_id', 'stars']], reader)# 4. 划分训练集和测试集
trainset, testset = train_test_split(dataset, test_size=0.2)# 5. 使用SVD训练模型
svd = SVD()
svd.fit(trainset)# 6. 在测试集上进行预测并评估
predictions = svd.test(testset)
print(f'RMSE: {accuracy.rmse(predictions)}')# 7. 获取每个用户的Top-N推荐商家
def get_top_n(predictions, n=10):top_n = {}for uid, iid, true_r, est, _ in predictions:if uid not in top_n:top_n[uid] = []top_n[uid].append((iid, est))# 对每个用户推荐列表按照评分进行排序for uid, user_ratings in top_n.items():user_ratings.sort(key=lambda x: x[1], reverse=True)top_n[uid] = user_ratings[:n]return top_n# 获取推荐结果
top_n = get_top_n(predictions, n=10)# 8. 为特定用户推荐商家
user_id = 'fB3jbHi3m0L2KgGOxBv6uw'  # 替换为目标用户ID
recommended_businesses = top_n.get(user_id, [])
print(f"Top 10 recommended businesses for user {user_id}:")
for business_id, rating in recommended_businesses:print(f"Business ID: {business_id}, Predicted Rating: {rating}")

这个示例假设评分值在1到5之间(即rating_scale=(1, 5)),如果评分范围不同,请修改为适合你的数据集的范围。

运行结果

RMSE: 1.2863
RMSE: 1.2862955370267326
Top 10 recommended businesses for user fB3jbHi3m0L2KgGOxBv6uw

使用 SVD++

import pandas as pd
from surprise import Reader, Dataset, SVDpp
from surprise.model_selection import train_test_split
from surprise import accuracy
import json# 1. 加载Yelp数据集
# 假设数据文件名为 'yelp_academic_dataset_review.json'
file_path = 'yelp_academic_dataset_review.json'# 加载JSON文件到DataFrame
with open(file_path, 'r') as f:data = [json.loads(line) for line in f]# 将数据转换为pandas DataFrame
df = pd.DataFrame(data)# 2. 选择必要的字段:user_id, business_id, rating
df = df[['user_id', 'business_id', 'stars']]  # 假设评分字段是 'stars'# 3. 数据预处理:将DataFrame转换为适合Surprise库的格式
reader = Reader(rating_scale=(1, 5))  # 假设评分是1到5
dataset = Dataset.load_from_df(df[['user_id', 'business_id', 'stars']], reader)# 4. 划分训练集和测试集
trainset, testset = train_test_split(dataset, test_size=0.2)# 5. 使用SVD++训练模型
svdpp = SVDpp()
svdpp.fit(trainset)# 6. 在测试集上进行预测并评估
predictions = svdpp.test(testset)
print(f'RMSE: {accuracy.rmse(predictions)}')# 7. 获取每个用户的Top-N推荐商家
def get_top_n(predictions, n=10):top_n = {}for uid, iid, true_r, est, _ in predictions:if uid not in top_n:top_n[uid] = []top_n[uid].append((iid, est))# 对每个用户推荐列表按照评分进行排序for uid, user_ratings in top_n.items():user_ratings.sort(key=lambda x: x[1], reverse=True)top_n[uid] = user_ratings[:n]return top_n# 获取推荐结果
top_n = get_top_n(predictions, n=10)# 8. 为特定用户推荐商家
user_id = 'fB3jbHi3m0L2KgGOxBv6uw'  # 替换为目标用户ID
recommended_businesses = top_n.get(user_id, [])
print(f"Top 10 recommended businesses for user {user_id}:")
for business_id, rating in recommended_businesses:print(f"Business ID: {business_id}, Predicted Rating: {rating}")

数据集的规模: SVD++SVD复杂,所以如果数据集非常大,可能会需要更长时间进行训练,尤其是在计算资源有限的情况下。

运行结果

RMSE: 1.2947
RMSE: 1.2947410246403837
Top 10 recommended businesses for user fB3jbHi3m0L2KgGOxBv6uw:

使用PMF

PMF 在 Surprise 中实现为 SVD,因此我们可以直接使用 SVD 作为 PMF, 代码参见SVD

使用NMF

import pandas as pd
from surprise import Reader, Dataset, NMF
from surprise.model_selection import train_test_split
from surprise import accuracy
import json# 1. 加载Yelp数据集
# 假设数据文件名为 'yelp_academic_dataset_review.json'
file_path = 'yelp_academic_dataset_review.json'# 加载JSON文件到DataFrame
with open(file_path, 'r') as f:data = [json.loads(line) for line in f]# 将数据转换为pandas DataFrame
df = pd.DataFrame(data)# 2. 选择必要的字段:user_id, business_id, rating
df = df[['user_id', 'business_id', 'stars']]  # 假设评分字段是 'stars'# 3. 数据预处理:将DataFrame转换为适合Surprise库的格式
reader = Reader(rating_scale=(1, 5))  # 假设评分是1到5
dataset = Dataset.load_from_df(df[['user_id', 'business_id', 'stars']], reader)# 4. 划分训练集和测试集
trainset, testset = train_test_split(dataset, test_size=0.2)# 5. 使用NMF(Non-negative Matrix Factorization)进行矩阵分解
nmf = NMF()
nmf.fit(trainset)# 6. 在测试集上进行预测并评估
predictions = nmf.test(testset)
print(f'RMSE: {accuracy.rmse(predictions)}')# 7. 获取每个用户的Top-N推荐商家
def get_top_n(predictions, n=10):top_n = {}for uid, iid, true_r, est, _ in predictions:if uid not in top_n:top_n[uid] = []top_n[uid].append((iid, est))# 对每个用户推荐列表按照评分进行排序for uid, user_ratings in top_n.items():user_ratings.sort(key=lambda x: x[1], reverse=True)top_n[uid] = user_ratings[:n]return top_n# 获取推荐结果
top_n = get_top_n(predictions, n=10)# 8. 为特定用户推荐商家
user_id = 'fB3jbHi3m0L2KgGOxBv6uw'  # 替换为目标用户ID
recommended_businesses = top_n.get(user_id, [])
print(f"Top 10 recommended businesses for user {user_id}:")
for business_id, rating in recommended_businesses:print(f"Business ID: {business_id}, Predicted Rating: {rating}")

NMF与SVD的区别:

  • NMF(非负矩阵分解)不同于SVD(奇异值分解),它强制矩阵的分解结果为非负值。适用于当数据有明显非负约束(例如评分数据)的情况。
  • 如果数据中包含负值,NMF可能无法正常工作,这时可以考虑使用SVD
  • 性能问题: 如果数据集非常大,矩阵分解模型可能需要较长时间训练。可以考虑在大规模数据集上进行性能优化(例如使用并行计算或使用分布式计算框架)。

运行结果

RMSE: 1.4577
RMSE: 1.4577314669222752
Top 10 recommended businesses for user fB3jbHi3m0L2KgGOxBv6uw

相关文章:

yelp数据集上试验SVD,SVDPP,PMF,NMF 推荐算法

SVD、SVD、PMF 和 NMF 是几种常见的推荐算法,它们主要用于协同过滤和矩阵分解方法来生成个性化推荐。下面是对每种算法的简要介绍: 1. SVD(Singular Value Decomposition) 用途:SVD 是一种矩阵分解技术,通…...

计算机视觉常用数据集Cityscapes的介绍、下载、转为YOLO格式进行训练

我在寻找Cityscapes数据集的时候花了一番功夫,因为官网下载需要用公司或学校邮箱邮箱注册账号,等待审核通过后才能进行下载数据集。并且一开始我也并不了解Cityscapes的格式和内容是什么样的,现在我弄明白后写下这篇文章,用于记录…...

Flink和Spark在实时计算方面有何异同

Flink和Spark在实时计算方面既有相似之处,也存在显著的差异。以下是对它们之间异同的详细分析: 一、设计理念与世界观 Flink: 专注于流处理,认为批是流的特例。数据流分为有限流(Bounded)和无限流&#xf…...

纵然千万数据流逝,唯独vector长存

公主请阅 1.vector的一些方法1vector和stringpush_back 插入以及三种遍历数组的方式一些方法vector中的一些常见的方法1. push_back()2. pop_back()3. size()4. clear()5. empty()6. resize()7. insert()8. erase()9. at()10. front和 back()11. data()12. capacity()13. shrin…...

【LeetCode】【算法】739. 每日温度

LeetCode 739. 每日温度 题目描述 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0…...

2025年知识管理新方案:十款前沿知识库搭建工具详解

随着企业信息化和智能化的发展,知识管理已成为提升企业竞争力的关键要素。一个高效的知识库不仅能促进内部沟通,还能展示企业的专业形象。以下是2025年十款前沿知识库搭建工具的详解。 1. HelpLook AI知识库 HelpLook AI知识库是一款专注于为企业提供高…...

WebSocket实现消息实时推送

文章目录 websocket介绍特点工作原理 用websocket实现实时推送引入依赖WebSocket 函数定义变量声明初始化 WebSocket 连接WebSocket 连接的初始化和事件处理连接打开事件接收消息处理连接关闭和重连机制心跳机制使用 WebSocket代码完整显示 websocket介绍 WebSocket 是一种网络…...

flink 内存配置(三):设置JobManager内存

flink 内存配置(一):设置Flink进程内存 flink 内存配置(二):设置TaskManager内存 flink 内存配置(三):设置JobManager内存 flink 内存配置(四)…...

蓝桥杯 Python组-神奇闹钟(datetime库)

神奇闹钟 传送门: 0神奇闹钟 - 蓝桥云课​​​​​​ 问题描述 小蓝发现了一个神奇的闹钟,从纪元时间(1970 年 11 日 00:00:00)开始,每经过 x 分钟,这个闹钟便会触发一次闹铃 (…...

解决阿里云三个月证书过期 免费SSL证书部署教程

相信有上线过自己的网站、小程序经验的同学深有体会,给服务加上 SSL 证书还挺麻烦的,尤其是没有运维经验的同学。本来最省事的方法是买个证书,但是一看价格,还是算了吧,动辄就是几万块一年。作为个人来说,这…...

VBA03-变量

一、什么是变量 变量是一个自定义名称的储存单位,变量是一个载体。 二、代码调试 在代码逐句运行的过程中查看变量的存储内容。 2-1、示例1 2-2、示例 三、变量的数据类型 若是定义的数据类型的变量,存储了超出了她范围的数,则会报溢出。 注…...

docker-ce-stable‘ 下载元数据失败 : Cannot download repomd.xml: Cannot download

看起来你在尝试安装 containerd.io-1.6.32 时遇到了问题,因为 docker-ce-stable 仓库的元数据下载失败。以下是一些可能的解决方案: 1. 检查仓库配置 确保你的 /etc/yum.repos.d/ 目录下的 docker-ce.repo 文件配置正确。你可以尝试手动编辑该文件&…...

C中定义字符串有下列几种形式

字符串常量,char数组,char指针之间的差异 1、字符串常量: 位于一对双括号中的任何字符。双引号里的字符加上编译器自动提供的结束标志\0字符,作为一个字符串存储在内存中。 例如: printf("%s","hello"); /…...

写一个小日历

以下是一个示例&#xff0c;展示了如何创建一个基本的日历 日历 1. HTML 结构 首先&#xff0c;创建一个基本的 HTML 结构&#xff0c;用于展示日历。 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta na…...

【数据库】elasticsearch

1、架构 es会为每个索引创建一定数量的主分片和副本分片。 分片&#xff08;Shard&#xff09;&#xff1a; 将索引数据分割成多个部分&#xff0c;每个部分都是一个独立的索引。 主要目的是实现数据的分布式存储和并行处理&#xff0c;从而提高系统的扩展性和性能。 在创建索…...

Rust 构建 TCP/UDP 网络服务

第四章 异步编程与网络通信 第二节 构建 TCP/UDP 网络服务 在现代应用程序中&#xff0c;网络通信是核心功能之一。本节将重点介绍如何在 Rust 中构建基本的 TCP 和 UDP 网络服务&#xff0c;涵盖实际的代码示例、最佳实践以及最新的技术方案&#xff0c;以帮助开发者掌握网络…...

docker镜像文件导出导入

1. 导出容器&#xff08;包含内部服务&#xff09;为镜像文件&#xff08;docker commit方法&#xff09; 原理&#xff1a;docker commit命令允许你将一个容器的当前状态保存为一个新的镜像。这个新镜像将包含容器内所有的文件系统更改&#xff0c;包括安装的软件、配置文件等…...

ViT面试知识点

文章目录 VITCLIPBlipSAMLSegFast TransformerYOLO系列问题 BatchNorm是对一个batch-size样本内的每个特征做归一化&#xff0c;LayerNorm是对每个样本的所有特征做归一化。 Layer Normalization&#xff08;层归一化&#xff0c;简称LayerNorm&#xff09;是一种在深度学习中…...

ChatGPT 和 RAG(检索增强生成)的区别;ChatGPT 和 RAG 的联系

目录 ChatGPT 和 RAG(检索增强生成)的区别 知识来源与利用方式 回答准确性和可靠性 模型架构和复杂性 适用场景 ChatGPT 和 RAG 的联系 ChatGPT 和 RAG(检索增强生成)的区别 知识来源与利用方式 ChatGPT:是基于大规模预训练的语言模型,知识是在预训练过程中从大量的…...

qt获取本机IP和定位

前言&#xff1a; 在写一个天气预报模块时&#xff0c;需要一个定位功能&#xff0c;在网上翻来翻去才找着&#xff0c;放在这里留着回顾下&#xff0c;也帮下有需要的人 正文&#xff1a; 一开始我想着直接调用百度地图的API来定位&#xff0c; 然后我就想先获取本机IP的方…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

Spring Boot + MyBatis 集成支付宝支付流程

Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例&#xff08;电脑网站支付&#xff09; 1. 添加依赖 <!…...