基于矩阵分解算法的智能Steam游戏AI推荐系统——深度学习算法应用(含python、ipynb工程源码)+数据集(二)

news2024/11/24 14:50:29

目录

  • 前言
  • 总体设计
    • 系统整体结构图
    • 系统流程图
  • 运行环境
  • 模块实现
    • 1. 数据预处理
    • 2. 模型构建
      • 1)定义模型结构
      • 2)优化损失函数
    • 3. 模型训练及保存
      • 1)模型训练
      • 2)模型保存
  • 相关其它博客
  • 工程源代码下载
  • 其它资料下载


在这里插入图片描述

前言

本项目采用了矩阵分解算法,用于对玩家已游玩的数据进行深入分析。它的目标是从众多游戏中筛选出最适合该玩家的游戏,以实现一种相对精准的游戏推荐系统。

首先,项目会收集并分析玩家已经玩过的游戏数据,包括游戏名称、游戏时长、游戏评分等信息。这些数据构成了一个大型的用户-游戏交互矩阵,其中每一行代表一个玩家,每一列代表一个游戏,矩阵中的值表示玩家与游戏之间的交互情况。

接下来,项目运用矩阵分解算法,将用户-游戏这稀疏矩阵用两个小矩阵——特征-游戏矩阵和用户-特征矩阵,进行近似替代。这个分解过程会将玩家和游戏映射到一个潜在的特征空间,从而能够推断出玩家与游戏之间的潜在关系。

一旦模型训练完成,系统可以根据玩家的游戏历史,预测他们可能喜欢的游戏。这种预测是基于玩家与其他玩家的相似性以及游戏与其他游戏的相似性来实现的。因此,系统可以为每个玩家提供个性化的游戏推荐,考虑到他们的游戏偏好和历史行为。

总的来说,本项目的目标是通过矩阵分解和潜在因子模型,提供一种更为精准的游戏推荐系统。这种个性化推荐可以提高玩家的游戏体验,同时也有助于游戏平台提供更好的游戏推广和增加用户黏性。

总体设计

本部分包括系统整体结构图和系统流程图。

系统整体结构图

系统整体结构如图所示。

在这里插入图片描述

系统流程图

系统流程如图所示。

在这里插入图片描述

运行环境

本部分包括 Python 环境、TensorFlow环境、 PyQt5环境。

详见博客:https://blog.csdn.net/qq_31136513/article/details/133148686#_38

模块实现

本项目包括4个模块:数据预处理、模型构建、模型训练及保存、模型测试,下面分别给出各模块的功能介绍及相关代码。

1. 数据预处理

数据集来源于Kaggle,链接地址为https://www.kaggle.com/tamber/steam-video-games,此数据集包含了用户的ID、游戏名称、是否购买或游玩、游戏时长,其中:共包含12393名用户,涉及游戏数量5155款。将数据集置于Jupyter工作路径下的steam-video-games文件夹中。

详见博客:https://blog.csdn.net/qq_31136513/article/details/133148686#1__97

2. 模型构建

数据加载进模型之后,需要定义模型结构,并优化损失函数。

1)定义模型结构

使用矩阵分解算法,将用户-游戏这稀疏矩阵用两个小矩阵——特征-游戏矩阵和用户-特征矩阵,进行近似替代。

tf.reset_default_graph()
#偏好矩阵
pref = tf.placeholder(tf.float32, (n_users, n_games))
#游戏时间矩阵
interactions = tf.placeholder(tf.float32, (n_users, n_games))
user_idx = tf.placeholder(tf.int32, (None))
n_features = 30  #隐藏特征个数设置为30
#X矩阵(用户-隐藏特征)表示用户潜在偏好
X = tf.Variable(tf.truncated_normal([n_users, n_features], mean = 0, 
stddev = 0.05), dtype = tf.float32, name = 'X')
#Y矩阵(游戏-隐藏特征)表示游戏潜在特征
Y = tf.Variable(tf.truncated_normal([n_games, n_features], mean = 0, 
stddev = 0.05), dtype = tf.float32, name = 'Y')
#初始化用户偏差
user_bias = tf.Variable(tf.truncated_normal([n_users, 1], stddev = 0.2))
#将向量连接到用户矩阵
X_plus_bias = tf.concat([X, 
user_bias, 
tf.ones((n_users, 1), dtype = tf.float32)], 
axis = 1)
#初始化游戏偏差
item_bias = tf.Variable(tf.truncated_normal([n_games, 1], stddev = 0.2))
#将向量连接到游戏矩阵
Y_plus_bias = tf.concat([Y,
tf.ones((n_games, 1), dtype = tf.float32),
item_bias],
axis = 1)
#通过矩阵乘积确定结果评分矩阵
pred_pref = tf.matmul(X_plus_bias, Y_plus_bias, transpose_b = True)
#使用游戏时长与alpha参数构造置信度矩阵
conf = 1 + conf_alpha * interactions

2)优化损失函数

L2范数常用于矩阵分解算法的损失函数中。因此,本项目的损失函数也引入了L2范数以避免过拟合现象。使用Adagrad优化器优化模型参数。

相关代码如下:

cost = tf.reduce_sum(tf.multiply(conf, tf.square(tf.subtract(pref, pred_pref))))
l2_sqr = tf.nn.l2_loss(X) + tf.nn.l2_loss(Y) + tf.nn.l2_loss(user_bias) + tf.nn.l2_loss(item_bias)
lambda_c = 0.01
loss = cost + lambda_c * l2_sqr
lr = 0.05
optimize = tf.train.AdagradOptimizer(learning_rate = lr).minimize(loss)

3. 模型训练及保存

由于本项目使用的数据集中,将游戏的DLC (Downloadable Content,后续可下载内容)单独作为另一款游戏列举,因此,在计算准确率时,DLC和游戏本体判定为同一款游戏,同系列的游戏也可以判定为同一款。

相关代码如下:

#精确度计算优化,将游戏本体和DLC合并为同一种游戏
def precision_dlc(recommandations, labels):
    #推荐的游戏按单词划分
    recommandations_split = []
    #实际购买的游戏按单词划分
    labels_split = []
    for label in labels:
        labels_split.append(idx2game[label].split())
    for game in recommandations:
        recommandations_split.append(idx2game[game].split())
    count = 0
    for game in recommandations_split:
        for label in labels_split:
            #当推荐的游戏与实际购买的游戏单词重合度高于阈值判定为同一款游戏
            if(len(set(game)&set(label))/min(len(game),len(label))) > 0.2:
                count += 1
                break
    return float(count / len(recommandations))

推荐的游戏方式为,对用户-游戏矩阵进行排序,选取评分最高的5个游戏作为推荐,计算准确率并返回,相关代码如下:

#从预测的列表中挑选最高的k个
def top_k_precision(pred, mat, k, user_idx):
    precisions = []
    for user in user_idx:
        rec = np.argsort(-pred[user, :])
        #选取推荐评分最高的k个
        top_k = rec[:k]
        labels = mat[user, :].nonzero()[0]
        #计算推荐与实际的准确率并返回
        precision = precision_dlc(top_k, labels)
        precisions.append(precision)
    return np.mean(precisions)

1)模型训练

相关代码如下:

iterations = 500
#绘图用数据:误差、训练集准确率
fig_loss = np.zeros([iterations])
fig_train_precision = np.zeros([iterations])
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(iterations):
        sess.run(optimize, feed_dict = {pref: train_matrix, 
                   interactions: user_game_interactions})
        if i % 10 == 0:
            mod_loss = sess.run(loss, feed_dict = {pref: train_matrix,
                                    interactions: user_game_interactions})
            mod_pred = pred_pref.eval()
            train_precision = top_k_precision(mod_pred, train_matrix, 
k, val_users_idx)
            val_precision = top_k_precision(mod_pred, val_matrix, 
k, val_users_idx)
            print('当前进度:{}...'.format(i),
                 '误差为:{:.2f}...'.format(mod_loss),
                 '训练集上的正确率:{:.3f}...'.format(train_precision),
                 '验证集上的正确率:{:.3f}'.format(val_precision))
        fig_loss[i] = sess.run(loss, feed_dict = {pref: train_matrix,
                                          interactions: user_game_interactions})
        fig_train_precision[i] = top_k_precision(mod_pred, train_matrix, 
k, val_users_idx)
    rec = pred_pref.eval()
    test_precision = top_k_precision(rec, test_matrix, k, test_users_idx)
    print('\n')
    print('模型完成,正确率为:{:.3f}'.format(test_precision))

完成500次训练,每训练10次输出在训练集和验证集上的准确率,如图所示。

在这里插入图片描述

2)模型保存

为方便使用模型,需要将训练得到的结果使用Joblib进行保存,相关代码如下:

#将训练得到的评分矩阵保存
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    joblib.dump(pred_pref.eval(), './Save_data/rec.pkl')

模型保存后,可以方便在PyQt 5或其他项目中使用。

相关其它博客

基于矩阵分解算法的智能Steam游戏AI推荐系统——深度学习算法应用(含python、ipynb工程源码)+数据集(一)

基于矩阵分解算法的智能Steam游戏AI推荐系统——深度学习算法应用(含python、ipynb工程源码)+数据集(三)

基于矩阵分解算法的智能Steam游戏AI推荐系统——深度学习算法应用(含python、ipynb工程源码)+数据集(四)

工程源代码下载

详见本人博客资源下载页


其它资料下载

如果大家想继续了解人工智能相关学习路线和知识体系,欢迎大家翻阅我的另外一篇博客《重磅 | 完备的人工智能AI 学习——基础知识学习路线,所有资料免关注免套路直接网盘下载》
这篇博客参考了Github知名开源平台,AI技术平台以及相关领域专家:Datawhale,ApacheCN,AI有道和黄海广博士等约有近100G相关资料,希望能帮助到所有小伙伴们。

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

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

相关文章

优维低代码实践:图片和搜索

优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维人提供一个技术交流与学习的平台。 优维…

Unity中Shader模板测试使用到的二进制

文章目录 前言(接上一篇文章)一、模板测试公式1、简化版(在ReadMask默认值的情况下)2、完整版 二、二进制的值1、0 和 1组成2、符号3、二进制的与运算4、二进制和十进制转化 三、在Shader中的实际操作 前言(接上一篇文章) Unity中…

JimuReport积木报表 v1.6.2 版本正式发布—开源免费的低代码报表

项目介绍 一款免费的数据可视化报表,含报表和大屏设计,像搭建积木一样在线设计报表!功能涵盖,数据报表、打印设计、图表报表、大屏设计等! Web 版报表设计器,类似于excel操作风格,通过拖拽完成报…

(Tekla Structures二次开发)获取当前模型文件夹路径

代码如下: TSM.Model model new TSM.Model();if(model.GetConnectionStatus()){ModelInfo modelInfo model.GetInfo();MessageBox.Show(modelInfo.ModelPath); // model.CommitChanges();}运行结果如下:

项目文章 | Plant Commun(IF:10.5)发表附属染色体调节植物-真菌互作从寄生到共生转换的分子作用机制

发表单位:中国林业科学院林木遗传育种国家重点实验室/中国林业科学研究院亚热带林业研究所 发表时间:2023年8月9日 期刊:Plant Communications(IF:10.5) 2023年8月9日,中国林业科学院林木遗传…

Postman应用——接口请求和响应(Get和Post请求)

文章目录 新增Request请求Get请求Post请求 Request请求响应Postman响应界面说明请求响应另存为示例(模板)Postman显示的响应数据清空请求响应数据保存到本地文件 这里只讲用的比较多的Get和Post请求方式,也可以遵循restful api接口规范&#…

Centos7部署gitlab

建议服务器配置不低于2C8G 1、安装必要的依赖 sudo yum install -y curl policycoreutils-python openssh-server perl2、配置极狐GitLab 软件源镜像 curl -fsSL https://packages.gitlab.cn/repository/raw/scripts/setup.sh | /bin/bash sudo yum install gitlab-jh -y3、…

Windows下SSH配置多账号

C:\Users\Administrator\.ssh 目录下新建config文件 config文件内容如下 配置了两个账号,举例如下 # github Host github.com HostName github.com IdentityFile ~/.ssh/github_id_rsa PreferredAuthentications publickey# gitee Host gitee.com HostName gitee.…

OR63 删除公共字符

目录 一、题目 二、代码 三、易错 一、题目 删除公共字符_牛客题霸_牛客网 二、代码 #include <iostream> #include <string> using namespace std;int main() {string s1,s2;getline(cin,s1);getline(cin,s2);string s3;int mark 0;//若s1中的字符在s2中不存…

线性调频雷达回波仿真+脉冲压缩仿真

雷达发射的线性调频信号&#xff1a; s ( t ) r e c t ( t τ ) e x p j 2 π f 0 t j π μ t 2 s(t)rect(\frac{t}{\tau})exp{j2\pi f_0tj\pi \mu t^2} s(t)rect(τt​)expj2πf0​tjπμt2 不考虑RCS&#xff0c;假设目标回波的幅度不变&#xff0c;那么目标反射回波可以…

Cpp/Qt-day050921Qt

目录 实现使用数据库的登录注册功能 头文件&#xff1a; registrwidget.h: widget.h: 源文件&#xff1a; registrwidget.c: widget.h: 效果图&#xff1a; 思维导图 实现使用数据库的登录注册功能 头文件&#xff1a; registrwidget.h: #ifndef REGISTRWIDGET_H #de…

爬虫 — 字体反爬

目录 一、安装字体软件 FontCreator二、百度智能云文字识别三、案例一四、案例二五、案例三六、安装 Tesseract1、安装步骤2、配置环境3、使用 Python 识别图片信息 七、案例四 一、安装字体软件 FontCreator 点击下载字体软件 FontCreator 安装包 1、同意协议&#xff0c;点击…

QT--day5

注册 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include<QPushButton> #include<QLineEdit> #include<QLabel> #include <QMessageBox> #include<QString> #include<QSqlDatabase> …

python教程:使用gevent实现高并发并限制最大并发数

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 import time import gevent from gevent.pool import Pool from gevent import monkey # 一&#xff0c;定义最大并发数 p Pool(20) # 二&#xff0c;导入gevent…

Python —— excel文件操作(超详细)

背景 很多公司还是用excel去管理测试用例的&#xff0c;所以为了减少重复繁琐的导出导出工作&#xff0c;学会如何用代码操作excel表格很实用~ 1、读取excel文件基本步骤 1、操作excel的一些库 1、xlrd&#xff1a;读取库&#xff0c;xlwt&#xff1a;写入&#xff0c;现在…

win10 Baichuan2-7B-Chat-4bits 上部署 百川2-7B-对话模型-4bits量化版

搞了两天才搞清楚跑通 好难呢,个人电脑 win10 ,6GB显存 个人感觉 生成速度很慢,数学能力不怎么行 没有ChatGLM2-6B 强,逻辑还行, 要求: 我的部署流程 1.下载模型 ,下载所有文件 然后 放到新建的model目录 https://huggingface.co/baichuan-inc/Baichuan2-7B-Chat-4bits/tr…

力扣刷题-数组-二分查找总结

前言 二分查找的使用前提/一般何时想到使用二分查找&#xff1a;数组为有序数组、数组中重复元素&#xff08;因为一旦有重复元素&#xff0c;使用二分查找法返回的元素下标可能不是唯一的&#xff09; 二分查找的关键 / 不容易写混乱的关键 / 谨记的不变量&#xff1a;区间定…

【大数据之Kafka】十六、Kafka集成外部系统之集成Flume

Flume 是一个在大数据开发中非常常用的组件。可以用于 Kafka 的生产者&#xff0c;也可以用于 Kafka 的消费者。 Flume安装和部署&#xff1a;https://blog.csdn.net/qq_18625571/article/details/131678589?spm1001.2014.3001.5501 1 Flume生产者 &#xff08;1&#xff09…

绿色科技:可持续发展的创新解决方案

标题绿色科技&#xff1a;可持续发展的创新解决方案 摘要引言绿色能源创新1. 太阳能和风能2. 储能技术 可再生资源管理3. 智能农业4. 循环经济 智能城市的未来5. 智能交通6. 城市感知 可持续生活方式7. 可持续建筑8. 智能家居 总结参考资料 博主 默语带您 Go to New World. ✍ …

短视频矩阵系统,短视频矩阵源码技术开发

开发短视频矩阵系统的源码需要以下步骤&#xff1a; 确定系统需求&#xff1a;根据客户的需求&#xff0c;确定系统的功能和特点&#xff0c;例如用户注册登录、视频上传、视频浏览、评论点赞等。 设计系统架构&#xff1a;根据系统需求&#xff0c;设计系统的整体架构&#x…