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

news2024/11/25 4:41:52

目录

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


在这里插入图片描述

前言

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

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

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

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

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

总体设计

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

系统整体结构图

系统整体结构如图所示。

在这里插入图片描述

系统流程图

系统流程如图所示。

在这里插入图片描述

运行环境

本部分包括 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)定义模型结构

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

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

2)优化损失函数

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

详见博客:https://blog.csdn.net/qq_31136513/article/details/133151049#2_91

3. 模型训练及保存

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

详见博客:https://blog.csdn.net/qq_31136513/article/details/133151049#3__105

1)模型训练

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

2)模型保存

为方便使用模型,需要将训练得到的结果使用Joblib进行保存。

详见博客:https://blog.csdn.net/qq_31136513/article/details/133151049#2_187

4. 模型应用

一是制作页面的布局,获取并检查输入的数据;二是将获取的数据-与之前保存的模型进行匹配达到应用效果。

1)制作页面

相关操作如下:

(1)使用代码绘制页面的基础布局,创建Recommandation类。

class Recommandation(QWidget):
#初始化
    def __init__(self):
        super().__init__()
        self.initUI()
#初始化布局
    def initUI(self):
        #设置界面的初始位置和大小
        self.setGeometry(600,200,450,550)
        #窗口名
        self.setWindowTitle('steam游戏推荐')
        #设置组件,以下为标签
        self.lb1 = QLabel('请输入游戏名:',self)
        #这是所在位置
        self.lb1.move(20,20)
        self.lb2 = QLabel('请输入游戏名:',self)
        self.lb2.move(20,80)
        self.lb3 = QLabel('请输入游戏名:',self)
        self.lb3.move(20,140)
        self.lb4 = QLabel('请输入游戏名:',self)
        self.lb4.move(20,200)
        self.lb5 = QLabel('请输入游戏名:',self)
        self.lb5.move(20,260)
        #以下为下拉输入框的创建
        self.combobox1 = QComboBox(self, minimumWidth=200)
        self.combobox1.move(100,20)
        self.combobox1.setEditable(True)
        self.combobox2 = QComboBox(self, minimumWidth=200)
        self.combobox2.move(100,80)
        self.combobox2.setEditable(True)
        self.combobox3 = QComboBox(self, minimumWidth=200)
        self.combobox3.move(100,140)
        self.combobox3.setEditable(True)
        self.combobox4 = QComboBox(self, minimumWidth=200)
        self.combobox4.move(100,200)
        self.combobox4.setEditable(True)
        self.combobox5 = QComboBox(self, minimumWidth=200)
        self.combobox5.move(100,260)
        self.combobox5.setEditable(True)
        #以下为输入的按键设置
        self.bt1 = QPushButton('请输入游戏时间',self)
        self.bt1.move(330,20)
        self.bt2 = QPushButton('请输入游戏时间',self)
        self.bt2.move(330,80)
        self.bt3 = QPushButton('请输入游戏时间',self)
        self.bt3.move(330,140)
        self.bt4 = QPushButton('请输入游戏时间',self)
        self.bt4.move(330,200)
        self.bt5 = QPushButton('请输入游戏时间',self)
        self.bt5.move(330,260)
        #推荐按钮
        self.bt=QPushButton('推荐开始',self)
        self.bt.move(20,400)
        #初始化下拉输入框
        self.init_combobox()
        #连接按键与槽
        self.bt1.clicked.connect(self.timeDialog)
        self.bt2.clicked.connect(self.timeDialog)
        self.bt3.clicked.connect(self.timeDialog)
        self.bt4.clicked.connect(self.timeDialog)
        self.bt5.clicked.connect(self.timeDialog)
        #连接推荐
        self.bt.clicked.connect(self.recommand) 

connect()是Qt特有的信号与槽机制,槽接收到信号进行处理。在这里使用了clicked 作为信号,单击按键会发出信号。

(2)初始化下拉输入框,将gamelist输入进下拉框的菜单,以及添加自动补全机能。

#初始化下拉输入框
def init_combobox(self):
    #增加选项元素
    for i in range(len(gamelist)):
        self.combobox1.addItem(gamelist[i])
        self.combobox2.addItem(gamelist[i])
        self.combobox3.addItem(gamelist[i])
        self.combobox4.addItem(gamelist[i])
        self.combobox5.addItem(gamelist[i])
    self.combobox1.setCurrentIndex(-1)
    self.combobox2.setCurrentIndex(-1)
    self.combobox3.setCurrentIndex(-1)
    self.combobox4.setCurrentIndex(-1)
    self.combobox5.setCurrentIndex(-1)
    #增加自动补全
    self.completer = QCompleter(gamelist)
    #补全方式
    self.completer.setFilterMode(Qt.MatchStartsWith)
    self.completer.setCompletionMode(QCompleter.PopupCompletion)
    self.combobox1.setCompleter(self.completer)
    self.combobox2.setCompleter(self.completer)
    self.combobox3.setCompleter(self.completer)
    self.combobox4.setCompleter(self.completer)
    self.combobox5.setCompleter(self.completer)

(3)设置槽,同时存储数据

相关操作如下:

    def timeDialog(self):
#获取信号
        sender = self.sender()
        if sender == self.bt1:
                #获取下拉输入框1输入的游戏名
                gamename = self.combobox1.currentText()
                #通过字典game2idx查询获得的游戏名所对应的序列号
                gameid = game2idx.get(gamename)
                #没有序列号的情况,可以理解为未输入正确的游戏名,或者输入为空
                if gameid == None:
                    #这种情况下生成一个MessageBox报错
                    reply = QMessageBox.information(self,'Error','请输入正确的游戏名!', QMessageBox.Close)
                else:
                  #输入正确的情况,将游戏名字、ID,分别记录到一个字典里,方便保存与更改
                    gamedict[1] = gamename
                    idxdict[1] = gameid
                    #弹出一个文本输入框,要求输入对应游戏时长
                    text, ok = QInputDialog.getDouble(self, '游戏时间', '请输入游戏时间:', min = 0.1)
                    #如果输入正确,将时长记录到一个字典中,方便保存与更改
                    if ok:
                        timedict[1] = text
        elif sender == self.bt2:
                gamename = self.combobox2.currentText()
                gameid = game2idx.get(gamename)
                if gameid == None:
                    reply = QMessageBox.information(self,'Error','请输入正确的游戏名!', QMessageBox.Close)
                else:
                    gamedict[2] = gamename
                    idxdict[2] = gameid
                    text, ok = QInputDialog.getDouble(self, '游戏时间', '请输入游戏时间:', min = 0.1)
                    if ok:
                        timedict[2] = text
        elif sender == self.bt3:
                gamename = self.combobox3.currentText()
                gameid = game2idx.get(gamename)
                if gameid == None:
                    reply = QMessageBox.information(self,'Error','请输入正确的游戏名!', QMessageBox.Close)
                else:
                    gamedict[3] = gamename
                    idxdict[3] = gameid
                    text, ok = QInputDialog.getDouble(self, '游戏时间', '请输入游戏时间:', min = 0.1)
                    if ok:
                        timedict[3] = text
        elif sender == self.bt4:
                gamename = self.combobox4.currentText()
                gameid = game2idx.get(gamename)
                if gameid == None:
                    reply = QMessageBox.information(self,'Error','请输入正确的游戏名!', QMessageBox.Close)
                else:
                    gamedict[4] = gamename
                    idxdict[4] = gameid
                    text, ok = QInputDialog.getDouble(self, '游戏时间', '请输入游戏时间:', min = 0.1)
                    if ok:
                        timedict[4] = text
        elif sender == self.bt5:
                gamename = self.combobox5.currentText()
                gameid = game2idx.get(gamename)
                if gameid == None:
                    reply = QMessageBox.information(self,'Error','请输入正确的游戏名!', QMessageBox.Close)
                else:
                    gamedict[5] = gamename
                    idxdict[5] = gameid
                    text, ok = QInputDialog.getDouble(self, '游戏时间', '请输入游戏时间:', min = 0.1)
                    if ok:
                        timedict[5] = text 

(4) 验证数据是否输入完毕,以及准备调用模型

   def recommand(self):
        #验证是否存在没有写入的数据
        c = 0
        for i in range(1,6):
            if gamedict[i] == "NULL":
                c+=1
            if idxdict[i] == "NULL":
                c+=1
            if timedict[i] == "NULL":
                c+=1
        #全部写完的情况
        if c == 0:
            #将字典转化为列表
            usertime = list(timedict.values())
            useridx = list(idxdict.values())
            #调用模型
            allrecidx = UserSimilarity(useridx,usertime)
            #降序排列数据
            rr = np.argsort(-allrecidx)
            #获取排行前五的游戏ID
            top_k = rr[:5]
            #将ID对应的游戏名字输入数组
            for i in top_k:
                recgame.append(idx2game[i])
            #将数组转化为字符串并输出
            reclist = ','.join(recgame)
            reply = QMessageBox.information(self,'推荐的游戏','给您推荐的游戏是'+reclist, QMessageBox.Close)
        #存在没有写完的数据,要求重新写入
        else:
            reply = QMessageBox.information(self,'Error','请输入全部数据!', QMessageBox.Close)

2)模型导入及调用

相关操作如下:

(1)加载当前文件夹下的Save_data模型

game2idx = joblib.load('./Save_data/game2idx.pkl')
idx2game = joblib.load('./Save_data/idx2game.pkl')
rec = joblib.load('./Save_data/rec.pkl')
hours = joblib.load('./Save_data/hours.pkl')
buy = joblib.load('./Save_data/buy.pkl')
users = joblib.load('./Save_data/buyers.pkl')

(2)创建一个用户相似度函数,用于刻画Qt里收集到的数据与训练出的用户相似度最高的数据作为输出

def UserSimilarity(games, game_hours):
    similarity = np.zeros(len(users)) # 用户相似度矩阵
    for i in range(len(users)):
        #计算用户输入的游戏与数据集中每个用户购买游戏的重合度
        coincidence = 0 #重合度,每重合一个游戏加1
        positions = [] #重合游戏在games中的位置
        #获取数据集中的第i个玩家与用户输入的重合情况
        for ii in range(len(games)):
            if games[ii] in np.where(buy[users[i], :] == 1)[0]:
                coincidence += 1
                positions.append(ii)
        #如果没有重合,则相似度为0,跳过
        if coincidence == 0:
            continue
        simi = []
        #将重合的游戏,根据时长和相同游戏的时长差取绝对值,根据e^-x计算出相似度
        for position in positions:
            game = games[position]
            hour = abs(game_hours[position] - hours[users[i], game])
            simi.append(math.exp(-hour))
        #对所有相似度取均值,得到用户与数据集中第i个玩家的相似度similarity[i]
        similarity[i] = sum(simi) / coincidence
    #相似度与玩家—游戏矩阵每一行相乘
    for i in range(len(users)):
        user = users[i]
        rec[user] = rec[user] * similarity[i]
      new_rec = np.zeros(len(rec[0])) # 1*n_games矩阵
    #将玩家—游戏矩阵按列相加,得到用户对每个游戏的喜好程度,即new_rec矩阵
    for i in range(len(new_rec)):
        for user in users:
            new_rec[i] += rec[user][int(i)]
    return new_rec

3)模型应用代码

相关代码如下:

import joblib
import numpy as np
import pandas as pd
import math
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
#读取数据
game2idx = joblib.load('./Save_data/game2idx.pkl')
idx2game = joblib.load('./Save_data/idx2game.pkl')
rec = joblib.load('./Save_data/rec.pkl')
hours = joblib.load('./Save_data/hours.pkl')
buy = joblib.load('./Save_data/buy.pkl')
users = joblib.load('./Save_data/buyers.pkl')
#游戏名称列表
gamelist = list(game2idx)
#游戏数
n_game = len(gamelist)
#传入字典
gamedict = {1:"NULL",2:"NULL",3:"NULL",4:"NULL",5:"NULL"}
timedict = {1:"NULL",2:"NULL",3:"NULL",4:"NULL",5:"NULL"}
idxdict = {1:"NULL",2:"NULL",3:"NULL",4:"NULL",5:"NULL"}
#下面两个是要传递的
usertime=[]
useridx=[]
#下面是返回的推荐游戏
recgame=[]
#相似度推荐
def UserSimilarity(games, game_hours):
    similarity = np.zeros(len(users)) #用户相似度矩阵
    for i in range(len(users)):
        #计算用户输入的游戏与数据集中每个用户购买游戏的重合度
        coincidence = 0 #重合度
        positions = [] #重合游戏在games中的位置
        for ii in range(len(games)):
            if games[ii] in np.where(buy[users[i], :] == 1)[0]:
                coincidence += 1
                positions.append(ii)
        if coincidence == 0:
            continue
        simi = []
        for position in positions:
            game = games[position]
            hour = abs(game_hours[position] - hours[users[i], game])
            simi.append(math.exp(-hour))
        similarity[i] = sum(simi) / coincidence
    #相似度与玩家—游戏矩阵每一行相乘
    for i in range(len(users)):
        user = users[i]
        rec[user] = rec[user] * similarity[i]
        new_rec = np.zeros(len(rec[0])) #1*n_games矩阵
    for i in range(len(new_rec)):
        for user in users:
            new_rec[i] += rec[user][int(i)]
    return new_rec
class Recommandation(QWidget):
    #初始化
    def __init__(self):
        super().__init__()
        self.initUI()
    #初始化布局
    def initUI(self):
        #设置界面的初始位置和大小
        self.setGeometry(600,200,450,550)
        #窗口名
        self.setWindowTitle('steam游戏推荐')
        #设置组件,以下为标签
        self.lb1 = QLabel('请输入游戏名:',self)
        #这是所在位置
        self.lb1.move(20,20)
        self.lb2 = QLabel('请输入游戏名:',self)
        self.lb2.move(20,80)
        self.lb3 = QLabel('请输入游戏名:',self)
        self.lb3.move(20,140)
        self.lb4 = QLabel('请输入游戏名:',self)
        self.lb4.move(20,200)
        self.lb5 = QLabel('请输入游戏名:',self)
        self.lb5.move(20,260)
        #以下为下拉输入框的创建
        self.combobox1 = QComboBox(self, minimumWidth=200)
        self.combobox1.move(100,20)
        self.combobox1.setEditable(True)
        self.combobox2 = QComboBox(self, minimumWidth=200)
        self.combobox2.move(100,80)
        self.combobox2.setEditable(True)
        self.combobox3 = QComboBox(self, minimumWidth=200)
        self.combobox3.move(100,140)
        self.combobox3.setEditable(True)
        self.combobox4 = QComboBox(self, minimumWidth=200)
        self.combobox4.move(100,200)
        self.combobox4.setEditable(True)
         self.combobox5 = QComboBox(self, minimumWidth=200)
        self.combobox5.move(100,260)
        self.combobox5.setEditable(True)
        #以下为输入的按键设置
        self.bt1 = QPushButton('请输入游戏时间',self)
        self.bt1.move(330,20)
        self.bt2 = QPushButton('请输入游戏时间',self)
        self.bt2.move(330,80)
        self.bt3 = QPushButton('请输入游戏时间',self)
        self.bt3.move(330,140)
        self.bt4 = QPushButton('请输入游戏时间',self)
        self.bt4.move(330,200)
        self.bt5 = QPushButton('请输入游戏时间',self)
        self.bt5.move(330,260)
        #推荐按钮
        self.bt=QPushButton('推荐开始',self)
        self.bt.move(20,400)
        #初始化下拉输入框
        self.init_combobox()
        #连接按键与槽
        self.bt1.clicked.connect(self.timeDialog)
        self.bt2.clicked.connect(self.timeDialog)
        self.bt3.clicked.connect(self.timeDialog)
        self.bt4.clicked.connect(self.timeDialog)
        self.bt5.clicked.connect(self.timeDialog)
        #连接推荐
        self.bt.clicked.connect(self.recommand)
        #初始化下拉输入框   
    def init_combobox(self):
        #增加选项元素
        for i in range(len(gamelist)):
            self.combobox1.addItem(gamelist[i])
            self.combobox2.addItem(gamelist[i])
            self.combobox3.addItem(gamelist[i])
            self.combobox4.addItem(gamelist[i])
            self.combobox5.addItem(gamelist[i])
        self.combobox1.setCurrentIndex(-1)
        self.combobox2.setCurrentIndex(-1)
        self.combobox3.setCurrentIndex(-1)
        self.combobox4.setCurrentIndex(-1)
        self.combobox5.setCurrentIndex(-1)
        #增加自动补全
        self.completer = QCompleter(gamelist)
        #补全方式
        self.completer.setFilterMode(Qt.MatchStartsWith)
        self.completer.setCompletionMode(QCompleter.PopupCompletion)
        self.combobox1.setCompleter(self.completer)
        self.combobox2.setCompleter(self.completer)
        self.combobox3.setCompleter(self.completer)
        self.combobox4.setCompleter(self.completer)
        self.combobox5.setCompleter(self.completer)
        def timeDialog(self):
        #获取信号
        sender = self.sender()
        if sender == self.bt1:
                #获取下拉输入框1输入的游戏名
                gamename = self.combobox1.currentText()
                #通过字典game2idx查询获得的游戏名所对应的序列号
                gameid = game2idx.get(gamename)
                #没有序列号的情况,可以理解为未输入正确的游戏名,或者输入为空
                if gameid == None:
                    #这种情况下生成一个MessageBox报错
                    reply = QMessageBox.information(self,'Error','请输入正确的游戏名!', QMessageBox.Close)
                else:
             #输入正确的情况,将游戏名字、ID,分别记录到一个字典里,方便保存与更改
                    gamedict[1] = gamename
                    idxdict[1] = gameid
                    #弹出一个文本输入框,要求输入对应的游戏时长
                    text, ok = QInputDialog.getDouble(self, '游戏时间', '请输入游戏时间:', min = 0.1)
                    #如果输入正确,将时长记录到一个字典中,方便保存与更改
                    if ok:
                        timedict[1] = text
        elif sender == self.bt2:
                gamename = self.combobox2.currentText()
                gameid = game2idx.get(gamename)
                if gameid == None:
                    reply = QMessageBox.information(self,'Error','请输入正确的游戏名!', QMessageBox.Close)
                else:
                    gamedict[2] = gamename
                    idxdict[2] = gameid
                    text, ok = QInputDialog.getDouble(self, '游戏时间', '请输入游戏时间:', min = 0.1)
                    if ok:
                        timedict[2] = text
        elif sender == self.bt3:
                gamename = self.combobox3.currentText()
                gameid = game2idx.get(gamename)
                if gameid == None:
                    reply = QMessageBox.information(self,'Error','请输入正确的游戏名!', QMessageBox.Close)
                else:
                    gamedict[3] = gamename
                    idxdict[3] = gameid
                    text, ok = QInputDialog.getDouble(self, '游戏时间', '请输入游戏时间:', min = 0.1)
                    if ok:
                        timedict[3] = text
        elif sender == self.bt4:
                gamename = self.combobox4.currentText()
                gameid = game2idx.get(gamename)
                if gameid == None:
                    reply = QMessageBox.information(self,'Error','请输入正确的游戏名!', QMessageBox.Close)
                else:
                    gamedict[4] = gamename
                    idxdict[4] = gameid
                    text, ok = QInputDialog.getDouble(self, '游戏时间', '请输入游戏时间:', min = 0.1)
                    if ok:
                        timedict[4] = text
        elif sender == self.bt5:
                gamename = self.combobox5.currentText()
                gameid = game2idx.get(gamename)
                if gameid == None:
                    reply = QMessageBox.information(self,'Error','请输入正确的游戏名!', QMessageBox.Close)
                else:
                    gamedict[5] = gamename
                    idxdict[5] = gameid
                    text, ok = QInputDialog.getDouble(self, '游戏时间', '请输入游戏时间:', min = 0.1)
                    if ok:
                        timedict[5] = text
               def recommand(self):
        #验证是否存在没有写入的数据
        c = 0
        for i in range(1,6):
            if gamedict[i] == "NULL":
                c+=1
            if idxdict[i] == "NULL":
                c+=1
            if timedict[i] == "NULL":
                c+=1
        #全部写完的情况
        if c == 0:
            #将字典转化为列表
            usertime = list(timedict.values())
            useridx = list(idxdict.values())
            #调用模型
            allrecidx = UserSimilarity(useridx,usertime)
            #降序排列数据
            rr = np.argsort(-allrecidx)
            #获取排行前五的游戏ID
            top_k = rr[:5]
            #将ID对应的游戏名字输入数组
            for i in top_k:
                recgame.append(idx2game[i])
            #将数组转化为字符串并输出
            reclist = ','.join(recgame)
            reply = QMessageBox.information(self,'推荐的游戏','给您推荐的游戏是'+reclist, QMessageBox.Close)
        #存在没有写完的数据,要求重新写入
        else:
            reply = QMessageBox.information(self,'Error','请输入全部数据!', QMessageBox.Close)
#主函数
if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = Recommandation()
    w.show()
    sys.exit(app.exec_())

相关其它博客

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

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

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

工程源代码下载

详见本人博客资源下载页


其它资料下载

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

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

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

相关文章

【MySQL】 MySQL的增删改查(进阶)--壹

文章目录 🛫数据库约束🌴约束类型🎋NOT NULL约束🎍UNIQUE:唯一约束🌳DEFAULT:默认值约束🎄PRIMARY KEY:主键约束🍀FOREIGN KEY:外键约束&#x1f…

web:[ACTF2020 新生赛]Include

前提知识 文件包含漏洞 php伪协议 题目 点开题目,页面只显示一个tips,点进去看看 点进去之后 没有别的提示,先看源代码,恩,什么都没有 再看一下点进tips显示的页面,发现url中 flag可能就藏在这个页面中&…

需求是怎么一步一步变态的

最初的需求 需求是处理一些数据,数据例子: 而界面要显示的样子: 看起来不太难,可以分解出需求: 每一列的所有数据要都能参与选择,或者输入当一个参数选中之后,比如选中A选中1,则…

《人人都是提示工程师》读书笔记01.PDF

本书旨在介绍提示(prompt)工程师的工作内容和相关技能。本书首先讲述提示技术的基本工作原理、提示工程师的常用工具、提示技术的基础模式和提示技术的进阶知识(包括零样本提示、少样本提示和思维链提示);然后讲解自然…

uni-app跳转到另一个app

第一步&#xff1a; 首先要知道 app的包名 获取方式如下 第二步&#xff1a; 在第一个 demo1 app 一个页面中需要一个按钮去跳转 方法如下 <template><view class"content"><button click"tz">跳转</button></view> </…

【动态规划刷题 16】最长等差数列 (有难度) 等差数列划分 II - 子序列

1027. 最长等差数列 https://leetcode.cn/problems/longest-arithmetic-subsequence/ 给你一个整数数组 nums&#xff0c;返回 nums 中最长等差子序列的长度。 回想一下&#xff0c;nums 的子序列是一个列表 nums[i1], nums[i2], …, nums[ik] &#xff0c;且 0 < i1 <…

C++之浅拷贝、深拷贝、拷贝构造函数、拷贝赋值运算符、自定义的深拷贝函数应用总结(二百二十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

宝塔重装注意事项

欢迎关注我的公众号&#xff1a;夜说猫&#xff0c;让一个贫穷的程序员不靠打代码也能吃饭~ 前言 宝塔8.0版本&#xff0c;宝塔卸载重装&#xff0c;或者重装Linux系统后重新安装宝塔也适用。 不能上来直接就执行安装宝塔脚本&#xff0c;除非之前没有安装过宝塔。 步骤 1、…

短视频源码php

对于php短视频源码而言&#xff0c;视频质量与用户使用体验息息相关&#xff0c;高质量的视频观感更有利于留下用户。但实际上视频质量很容易受到各种因素的影响&#xff0c;接下来我们分析一下php短视频源码中导致视频出现异常的各种原因吧。 所谓短视频源码的原生开发&#…

华为云云耀云服务器L实例评测|华为云上安装kafka

文章目录 华为云云耀云服务器L实例评测&#xff5c;华为云上安装kafka一、kafka介绍二、华为云主机准备三、kafka安装1. 安装什么版本java2. 安装zookeeper服务3. 使用systemctl 管理启动ZooKeeper服务4. 修改kafka配置5. 使用systemctl 管理启动kafka服务6. 创建一个测试 topi…

Springboot 实践(21)服务熔断机制

在微服务架构中&#xff0c;服务众多&#xff0c;通常会涉及到多个服务层的调用&#xff0c;一旦基础服务发生故障&#xff0c;很可能会导致级联故障&#xff0c;继而造成整个系统不可用&#xff0c;这种现象被称为服务雪崩效应。 服务熔断引入熔断器概念&#xff0c;熔断器如果…

libopenssl 实现私钥加密公钥解密

在需要验证可信来源时&#xff0c;需要用到签名验签。因此&#xff0c;需要使用私钥加密&#xff0c;公钥解密&#xff0c;取得被加密的信息。这就会使用到私钥加密&#xff0c;公钥解密的场景了。 参考&#xff1a; https://github.com/openssl/openssl/issues/20493 https:/…

【Python】Pycharm使用anaconda中的PaddleOCR的虚拟环境 卡在loading package list(保姆级图文)

目录 异常表现&#xff1a;解决方法1. 试着使用pytcharm的http代理&#xff08;很确定没用&#xff0c;无法成功&#xff0c;直接看下一步&#xff09;2. conda换国内源&#xff08;换源后重启&#xff1f;不知道有没有用&#xff0c;不确定是否关键&#xff09;3. 在conda中更…

2023年浙工商MBA新生奖学金名单公布,如何看待?

浙工商MBA项目官方最新公布了2023年的非全日制新生奖学金名单&#xff0c;按照政策约定&#xff0c;共分为特等奖学金1名&#xff0c;一等奖学金10名&#xff0c;二等奖学金15名&#xff0c;三等奖学金30名&#xff0c;额度对应3万、1万、0.8万、0.5万不等&#xff0c;主要名单…

c++ 继承与多态

一、c如何解决菱形继承的问题 例子一 菱形继承问题 #include <iostream> #include <string.h> using namespace std; class Animal { public:int m_Age; }; class Sheep : public Animal {}; class Tuo : public Animal {}; class SheepTuo :public Sheep, publ…

phpstudy脚本编写 和sql注入编写

1.phpstudy编写 2.sql注入编写

一、iMove源码解读:初识

引言&#xff1a;随着低代码思想的不断蔓延&#xff0c;除了大企业&#xff0c;中小企业也尝试构建自己的低代码平台&#xff0c;以期降低开发门槛&#xff0c;提高开发效率&#xff0c;降低生产成本。本文中的iMove是一款面向前端开发者的逻辑编排工具&#xff0c;通过它设计出…

【Java 基础篇】Java线程安全与并发问题详解

多线程编程在Java中是一个常见的需求&#xff0c;它可以提高程序的性能和响应能力。然而&#xff0c;多线程编程也带来了一系列的线程安全与并发问题。在本文中&#xff0c;我们将深入探讨这些问题&#xff0c;以及如何解决它们&#xff0c;适用于Java初学者和基础用户。 什么…

机器学习入门教学——损失函数(交叉熵法)

1、前言 我们在训练神经网络时&#xff0c;最常用到的方法就是梯度下降法。在了解梯度下降法前&#xff0c;我们需要了解什么是损失(代价)函数。所谓求的梯度&#xff0c;就是损失函数的梯度。如果不知道什么是梯度下降的&#xff0c;可以看一下这篇文章&#xff1a;机器学习入…

人工智能的未来:技术与道德的交汇

人工智能的未来&#xff1a;技术与道德的交汇 摘要引言技术的前景1. 机器学习的进展2. 自主智能系统 道德考量3. 数据隐私与安全4. 自主决策的伦理 社会影响5. 就业与教育6. 医疗与健康 总结参考资料 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;…