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

基于深度学习神经网络协同过滤模型(NCF)的视频推荐系统

测试数据(我是在本地存了个文件,记得修改自己测试数据文件的路径):

User,Video 1,Video 2,Video 3,Video 4,Video 5,Video 6
User1,10,3,,,,
User2,,10,,10,5,1
User3,,,9,,,
User4,6,1,,8,,9
User5,1,,1,,10,4
User6,1,4,1,,10,1
User7,,2,1,2,,8
User8,,,,1,,
User9,1,,10,,3,1

相关库准备:

若直接安装 scikit(如 pip install scikit),会错误安装非官方包(如 scikit 0.0.post1),导致功能缺失或报错。正确安装命令应为 pip install scikit-learn

import pandas as pd
import numpy as np
import tensorflow as tf
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder

调用数据:


# 设置Pandas显示选项:显示所有列且不换行
pd.set_option('display.max_columns', 1000)
pd.set_option('display.width', 1000)# 数据加载与预处理
data = pd.read_csv('data/test-data.csv')  # 读取用户-视频评分数据
print("原始数据预览:")
print(data)  # 打印原始数据便于检查

数据预处理阶段:

1. 保存原始用户ID(第一列)

2. 重置索引为数字序列

3. 将第一列替换为数字索引

user_index = data[data.columns[0]]  # 保存原始用户ID
video_index = data.columns  # 保存视频列名
data = data.reset_index(drop=True)  # 重置索引
data[data.columns[0]] = data.index.astype('int')  # 将用户ID列转为数字索引scaler = 10  # 评分缩放因子 适用于已知评分范围固定(如1-10分制)的简单场景

数据重塑:

将宽格式数据转为长格式(user_id, video_id, rating)

df_long = pd.melt(data, id_vars=[data.columns[0]],  # 保留用户ID列ignore_index=True,  # 忽略原始索引var_name='video_id',  # 视频ID列名value_name='rate').dropna()  # 删除缺失值
df_long.columns = ['user_id', 'video_id', 'rating']  # 重命名列
df_long['rating'] = df_long['rating'] / scaler  # 评分归一化
df_long['user_id'] = df_long['user_id'].apply(lambda x: user_index[x])  # 恢复原始用户IDdataset = df_long  # 最终数据集

将用户ID和视频ID转换为模型可处理的数字标签:

user_encoder = LabelEncoder()  # 用户ID编码器  
video_encoder = LabelEncoder()  # 视频ID编码器
dataset['user_id'] = user_encoder.fit_transform(dataset['user_id'])
dataset['video_id'] = video_encoder.fit_transform(dataset['video_id'])# 使用全部数据作为训练集(未划分测试集)
train = dataset

超参设置及选择嵌入维度

num_users = len(dataset['user_id'].unique())  # 唯一用户数量
num_videos = len(dataset['video_id'].unique())  # 唯一视频数量
# embedding_dim = 32  # 嵌入层维度
embedding_dim = 64  # 嵌入层维度

基本准备阶段结束,进入模型配置:

神经网络协同过滤模型架构:

1. 输入层:分别接收用户ID和视频ID

2. 嵌入层:将ID映射为稠密向量

3. 特征融合:连接两个嵌入向量

4. 全连接层:学习非线性特征交互

5. 输出层:预测评分

# 输入层
inputs_user = tf.keras.layers.Input(shape=(1,), name='user_input')  # 用户ID输入
inputs_video = tf.keras.layers.Input(shape=(1,), name='video_input')  # 视频ID输入# 嵌入层
embedding_user = tf.keras.layers.Embedding(num_users, embedding_dim, name='user_embedding')(inputs_user)
embedding_video = tf.keras.layers.Embedding(num_videos, embedding_dim, name='video_embedding')(inputs_video)# 特征融合层 Concatenate优势- 保留更多特征信息便于后续全连接层学习复杂交互
merged = tf.keras.layers.Concatenate(name='concat_embeddings')([embedding_user, embedding_video])
merged = tf.keras.layers.Flatten(name='flatten_features')(merged)# 全连接层
dense = tf.keras.layers.Dense(64, activation='relu', name='dense_1')(merged)
dense = tf.keras.layers.Dense(32, activation='relu', name='dense_2')(dense)
output = tf.keras.layers.Dense(1, activation='sigmoid', name='output')(dense)# 模型编译 mse对异常值敏感
model = tf.keras.Model(inputs=[inputs_user, inputs_video], outputs=output)
model.compile(optimizer='adam', loss='mse', metrics=['mae'])

开始训练模型:

print("\n开始模型训练...")
model.fit([train['user_id'].values, train['video_id'].values],train['rating'].values,batch_size=64,epochs=100,verbose=0,# validation_split=0.1,
)

应用模型进行评分:


result_df = {}
for user_i in range(1, 10):user = f'User{user_i}'result_df[user] = {}for video_i in range(1, 7):    video = f'Video {video_i}'# 编码用户和视频IDpred_user_id = user_encoder.transform([user])pred_video_id = video_encoder.transform([video])# 进行预测result = model.predict(x=[pred_user_id, pred_video_id], verbose=0)result_df[user][video] = result[0][0]  # 保存预测结果

转换结果格式并输出:

# 结果后处理
result_df = pd.DataFrame(result_df).T  # 转为DataFrame格式
result_df *= scaler  # 反归一化恢复原始评分范围print("\n预测结果矩阵:")
print(result_df)

本地输出打印成功展示:

http://www.dtcms.com/a/405930.html

相关文章:

  • 网站建立时间软件开发5个过程
  • 【微实验】激光测径系列(六)MATLAB 实现 CCD 图像像素与实际距离标定
  • 设计模式之代理模式-骆驼与巴巴羊的故事
  • Linux安全机制--系统层安全机制
  • 大模型之bert变种
  • 华为HCIE认证-“天花板”级考试的难度解析
  • 【网络协议】数字签名与证书
  • LinkedList模拟实现
  • 如何自己做淘宝网站网页设计策划
  • 神奇的位运算——力扣136.只出现一次的数字
  • 【征文计划】深度剖析 Rokid SLAM 算法:从传感器融合到空间重建的完整技术链路
  • Pygame中实现图像旋转效果-高级2-2
  • 高新苏州网站建设wordpress首页等待画面
  • 两学一做知识问答网站施工企业招标领导小组组长的职责
  • Spring AI:RAG函数调用
  • 基于Amazon S3设置AWS Transfer Family Web 应用程序
  • 稳石氢能出席AEM电解水学术与产业化论坛,大标方AEM制氢设备批量化生产荣获技术卓越奖。
  • 渲染 Python 中用 LaTeX 语法定义的数学公式 - 例子
  • 菊风金融智能双录:为金融业务合规与信任保驾护航
  • Debian安装PVE
  • 云计算实验2——CentOS中zookeeper的安装
  • 网络管理实验1:ASN.1软件应用
  • 前端开发用什么工具?前端开发工具推荐清单、实用对比与我的使用心得
  • 做亚马逊有什么网站可以借鉴大连城市建设档案馆官方网站
  • 协议不通,数据何通?耐达讯自动化Modbus TCP与Profibus网关技术破解建筑自动化最大瓶颈
  • 新零售模式下仓储变化与发展趋势
  • Stable Video Diffusion:将潜在视频扩散模型扩展到大规模数据集——论文阅读
  • [linux仓库]解剖ELF:从文件头到进程地址空间的完美映射
  • Lisp 与 C# 交互中,类型码(TypeCode)的映射关系
  • Java基础(十四):枚举类详解