基于python深度学习技术矩阵分解的推荐系统,通过学习隐含特征,实现推荐

实现了一个基于矩阵分解的推荐系统,用于预测用户对电影的评分。具体来说,该程序通过TensorFlow构建和训练一个模型,来学习用户和电影之间的隐含特征,并根据这些特征预测评分。以下是代码的主要功能和步骤的详细描述:

1. 数据加载与预处理

  • 数据加载:通过get_data_pd函数从指定路径加载电影评分数据集(CSV文件),并将其存储在Pandas DataFrame中。
  • 用户和电影数量统计:统计数据集中唯一用户和电影的数量,为后续模型的构建提供基础。
def get_data_pd(datapath):with open(datapath, 'r') as f:df = pd.read_csv(f)return dfdf = get_data_pd(datapath)u_num = df.userId.nunique()   # 用户数量
i_num = df.movieId.nunique()  # 电影数量
print("用户有{0}位, 共有电影{1}部".format(u_num, i_num))
df.head()

 

2. 数据集划分

  • 训练集与测试集划分:通过打乱数据集,使数据随机化,接着将90%的数据用于训练,10%用于测试,以评估模型的性能。
def get_data(datapath):df = get_data_pd(datapath)rows = len(df)# 打乱索引df = df.iloc[np.random.permutation(rows)].reset_index(drop=True)# 90%的训练集与10%的测试集split_index = int(rows * 0.9)df_train = df[0:split_index]df_test = df[split_index:].reset_index(drop=True)return df_train, df_testdf_train, df_test = get_data(datapath)

 

3. 模型构建

  • 模型定义:使用TensorFlow定义矩阵分解模型。模型包括用户和电影的嵌入层,以及全局偏置、用户偏置和电影偏置。通过用户和电影的隐含特征向量计算预测评分。
  • 损失函数:定义L2损失函数用于训练,包括预测评分与实际评分之间的差异,以及正则化项以防止过拟合。
def model(user_batch, item_batch, user_num, item_num, dim=5, device="/cpu:0"):with tf.device(device):with tf.variable_scope('lsi', reuse=tf.AUTO_REUSE):bias_global = tf.get_variable("bias_global", shape=[])w_bias_user = tf.get_variable(name="embd_bias_user", shape=[user_num])w_bias_item = tf.get_variable(name="embd_bias_item", shape=[item_num])bias_user = tf.nn.embedding_lookup(w_bias_user, user_batch, name="bias_user")bias_item = tf.nn.embedding_lookup(w_bias_item, item_batch, name="bias_item")w_user = tf.get_variable("embd_user", shape=[user_num, dim],initializer=tf.truncated_normal_initializer(stddev=0.02))w_item = tf.get_variable("embd_item", shape=[item_num, dim],initializer=tf.truncated_normal_initializer(stddev=0.02))embd_user = tf.nn.embedding_lookup(w_user, user_batch, name="embedding_user")embd_item = tf.nn.embedding_lookup(w_item, item_batch, name="embedding_item")with tf.device(device):# 估分 = 矩阵相乘 + 全局偏差 + 用户偏差 + 电影偏差infer = tf.reduce_sum(tf.multiply(embd_user, embd_item), 1)infer = tf.add(infer, bias_global)infer = tf.add(infer, bias_user)infer = tf.add(infer, bias_item, name="svd_inference")regularizer = tf.add(tf.nn.l2_loss(embd_user), tf.nn.l2_loss(embd_item), name="svd_regularizer")return infer, regularizer

 

4. 模型训练

  • 训练过程:在训练过程中,使用样本数据进行多次迭代训练。每次迭代会获取一批用户和电影的评分数据,计算模型的预测评分,并更新模型参数以最小化损失。
  • 输出训练信息:每经过一定的样本批次,打印当前的训练错误和经过的时间,以便监控训练进度。
with tf.Session() as sess:sess.run(init_op)print("%s\t%s\t%s\t%s" % ("Epoch", "Train Error", "Val Error", "Elapsed Time"))errors = deque(maxlen=samples_per_batch)start = time.time()for i in range(max_epochs * samples_per_batch):users, items, rates = (iter_train.userId.values, iter_train.movieId.values, iter_train.rating.values)_, pred_batch = sess.run([train_op, infer], feed_dict={user_batch: users,item_batch: items,rate_batch: rates})pred_batch = clip(pred_batch)if i % samples_per_batch == 0:train_err = np.sqrt(np.mean(errors))end = time.time()print("%02d\t\t\t\t%.3f secs" % (i // samples_per_batch, end - start))start = end

5. 模型保存与恢复

  • 模型保存:训练完成后,模型的权重和结构会被保存,以便后续可以加载和复用。
  • 模型恢复:在后续阶段,可以通过加载保存的模型来进行评分预测,而不需重新训练模型。

6. 评分预测与评估

  • 测试集评估:从测试集中取样本进行评分预测,并与实际评分进行比较,计算均方根误差(RMSE),以评估模型的性能。
  • 结果展示:打印预测评分与实际评分的对比,方便分析模型的准确性。

 

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

C++高级编程(8)

八、标准IO库 1.输入输出流类 1)非格式化输入输出 2)put #include <iostream> #include <string> ​ using namespace std; int main() {string str "123456789";for (int i str.length() - 1; i > 0; i--) {cout.put(str[i]); //从最后一个字符开…

EMC Plus:大电流注入传导抗扰度

大电流注入 &#xff08;BCI&#xff09; 是一种传导射频抗扰度测试&#xff0c;利用电流注入探头将调制信号引入电缆。其目的是复制设备运行环境中预期的电磁干扰 &#xff08;EMI&#xff09; 条件。在这里&#xff0c;我将为您提供一个使用 Ansys EMC Plus 进行大电流注入传…

《Java核心技术 卷I》JFrame组件中显示信息

组件中显示信息 JFrame结构复杂&#xff0c;由四层窗格&#xff0c;其中根窗格、层级窗格和玻璃窗格人们并不太关心&#xff0c;他们要用来组织菜单栏和内容窗格以及实现观感&#xff0c;Swing程序员最关心的是内容窗格(content pane)&#xff0c;添加到窗体的所有组件都会自动…

0x00基础算法 -- 0x01 位运算

资料来源&#xff1a;算法竞赛进阶指南活动 - AcWing 1、进制表示 二进制表示&#xff1a;m位二进制中&#xff0c;通常称最低位为第0位&#xff0c;从右到左以此类推&#xff0c;最高位为第m-1位。 常用十六进制表示的数字&#xff1a; 32位补码int&#xff08;十进制&#xf…

算法求解(C#)-- 寻找包含目标字符串的最短子串算法

1. 引言 在字符串处理中&#xff0c;我们经常需要从一个较长的字符串中找到包含特定目标字符串的最短子串。这个问题在文本搜索、基因序列分析等领域有着广泛的应用。本文将介绍一种高效的算法来解决这个问题。 2. 问题描述 给定一个源字符串 source 和一个目标字符串 targe…

Linux之Chronyd 时间服务器配置(Chronod Time Server Configuration in Linux)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

【Ant Design Pro】如何实现组件的状态保存umi-plugin-keep-alive插件的使用

都知道vuejs里面帮我们实现了一个内置的keep-alive组件&#xff0c;给我们缓存一些组件的状态带来了很大的便利。但是在react中没有自带的实现&#xff0c;可以借助社区的插件umi-plugin-keep-alive来实现这个功能。 实现效果对比 未使用插件&#xff0c;可以看到我们在页面跳…

【数据结构】二叉排序树和平衡二叉树

目录 1. 二叉搜索树&#xff08;BST&#xff09; 1.1 二叉搜索树的定义及特点 1.1.1 定义 1.1.2 特点 1.2 二叉排序树的构造&#xff08;创建&#xff09; 1.2.1 基本思想 1.2.2 算法 1.3 二叉排序树的删除 2. 平衡二叉树&#xff08;AVL&#xff09; 2.1 为什么要用…

C++四种类型转换

C语言提供了四种类型转换 const_cast: 可以去除掉常量属性的类型转换 //const_cast const int a 10; double* p1 (double*)&a;//类型和原来的类型可以不一致&#xff0c;但是不安全 int* p2 const_cast<int*>(&a);//类型和原本的类型必须匹配 //<>中必…

【SPIE出版,往届稳定EI检索】2024智能视觉与数据建模国际学术会议(ICIVD 2024,12月13-15日)

2024智能视觉与数据建模国际学术会议 2024 International Conference on Intelligent Vision and Data modeling (ICIVD 2024) 重要信息 会议官网&#xff1a;www.iccaid.net 2024 International Conference on Intelligent Vision and Data modeling (ICIVD 2024)www.iccaid…

大模型的思维链提示

文章目录 思维链提示的基本形式思维链提示的优化策略关于思维链的进一步讨论思维链提示是一种高级提示策略,旨在增强大语言模型在各类复杂推理任务上的表现。常见的推理任务包括算术推理、常识推理以及符号推理等多种任务。与上下文学习方法仅使用⟨输入,输出⟩二元组来构造提…

JavaScript day01 笔记

一、引入方式 JavaScript 程序不能独立运行&#xff0c;它需要被嵌入 HTML 中&#xff0c;然后浏览器才能执行 JavaScript 代码。通过 script 标签将 JavaScript 代码引入到 HTML 中 1️⃣内部 通过 script 标签包裹 JavaScript 代码&#xff08;一般就写在</script>的…

vue,uniapp,微信小程序解决字符串中出现数字则修改数字样式,以及获取字符串中的数字

简单记录一下&#xff0c;最近遇到的一个新需求&#xff1a;后端返回的是非富文本&#xff0c;只是一串字符串&#xff0c;其中包含了文字和数字&#xff0c;前端需要将出现数字的地方将其加粗或者修改颜色等需求 设计思路&#xff1a;&#xff08;简单做个记录方便以后理解&a…

数据分析:16s差异分析DESeq2 | Corncob | MaAsLin2 | ALDEx2

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍DESeq2原理计算步骤结果Corncob原理计算步骤结果MaAsLin2原理计算步骤结果ALDEx2原理计算步骤结果加载R包数据链接数据预处理微生物数据样本信息提取物种名称过滤零值保留结果读取…

【CSS】标准怪异盒模型

概念 CSS 盒模型本质上是一个盒子&#xff0c;盒子包裹着HTML 元素&#xff0c;盒子由四个属性组成&#xff0c;从内到外分别是&#xff1a;content 内容、padding 内填充、border 边框、外边距 margin 盒模型的分类 W3C 盒子模型(标准盒模型) IE 盒子模型(怪异盒模型) 两种…

C++builder中的人工智能(18):神经网络中的SoftMax函数

在这篇文章中&#xff0c;我们将探讨SoftMax函数在神经网络中的作用&#xff0c;如何在人工神经网络&#xff08;ANN&#xff09;中使用SoftMax函数&#xff0c;以及在AI技术中SoftMax的应用场景。让我们来详细解释这些概念。 SoftMax函数是什么&#xff1f; SoftMax函数是逻辑…

机器学习(七)——集成学习(个体与集成、Boosting、Bagging、随机森林RF、结合策略、多样性增强、多样性度量、Python源码)

目录 关于1 个体与集成2 Boosting3 Bagging与随机森林4 结合策略5 多样性X 案例代码X.1 分类任务-Adaboost-SVMX.1.1 源码X.1.2 数据集&#xff08;鸢尾花数据集&#xff09;X.1.3 模型效果 X.2 分类任务-随机森林RFX.2.1 源码X.2.2 数据集&#xff08;鸢尾花数据集&#xff09…

Matlab轻松烟雾检测

小编经验分享&#xff1a;如何使用Matlab进行烟雾检测 烟雾检测是一项重要的安全技术&#xff0c;它可以帮助我们及时发现火灾风险并采取相应的措施。在这篇文章中&#xff0c;小编将和大家分享如何使用Matlab进行烟雾检测的经验。希望这些经验对大家在实际应用中能够有所帮助…

c语言其实很简单----【数组】

TOC 1.输入10个学生成绩&#xff0c;计算及格人数&#xff0c;平均成绩&#xff0c;总成绩。 #include<stdio.h> int main(){float score[10];int i ,cut;float avar0.0,sum0.0;for(i0;i<10;i)scanf("%f",&score[i]);//输入10个学生的成绩cut0;for(i0…

在 .NET 6.0 中创建用于 CRUD 操作的 Web API

快速概述&#xff1a; 在动态的技术世界中&#xff0c;创建强大的 Web API 已成为开发人员不可或缺的关键技能。这些 API 是促进不同应用程序之间顺畅通信的重要链接&#xff0c;可实现无缝数据检索和操作。本文的重点是在 .NET 6 中为 CRUD 操作创建 Web API。 为了实现这一点…