基于在校学习平台MOOC的选课推荐系统

基于在校学习平台MOOC的选课推荐系统

1、效果

在线demo,点我查看
在这里插入图片描述

2、功能

根据学生于在校学习平台MOOC学习期间的选课记录等相关特征来对学生进行课程推荐。
采用数据挖掘技术,包括BPR、FM、CF,神经网络推荐,用户协同过滤推荐。
用到的数据集来自于XuetangX,数据集的名称为Course Recommendation,该数据中记录了学生于在线学习平台XuetangX上的选课学习记录,包括学生id、时间、课程id、类别id等。
关于数据集的详细介绍可以参照官方说明。
数据集介绍链接如下:http://moocdata.cn/data/course-recommendation。

登录注册,个人中心,冷启动,热门课程,课程推荐,课程分类,可视化,收藏,选修,点赞,评论,评分

3、推荐算法

3.1 导入库

# -*- coding: utf-8 -*-"""
@contact: (微)信 1257309054
@file: test.py
@time: 2024/6/22 12:46
@author: LDC
"""
pip install numpy
pip install pandas
pip install tensorflow

3.2 算法说明

1、从数据库中获取所有选修数据
2、对矩阵进行向量化,便于神经网络学习
3、使用LabelEncoder将字符串标签转换为整数标签
4、划分训练集与测试集
5、创建NCF模型
6、合并 embeddings向量
7、添加全连接层
8、编译模型
9、模型训练
10、模型评估
11、模型保存
12、模型推荐

3.3 全部代码

# -*- coding: utf-8 -*-"""
@contact: 微信 1257309054
@file: recommend_ncf.py
@time: 2024/6/16 22:13
@author: LDC
"""
import os
import django
import joblib
import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from keras.models import load_modelos.environ["DJANGO_SETTINGS_MODULE"] = "course_manager.settings"
django.setup()
from course.models import *def get_all_data():'''从数据库中获取所有物品评分数据[用户特征(点赞,收藏,评论,物品特征(收藏人数,点赞人数,浏览量,评分人数,平均评分)]'''# 定义字典列表user_item_list = []# 从评分表中获取所有课程数据item_rates = RateCourse.objects.all().values('course_id').distinct()# 获取每个用户的评分数据for user in User.objects.all():user_rate = RateCourse.objects.filter(user=user)if not user_rate:# 用户如果没有评分过任何一本课程则跳过循环continuedata = {'User': f'user_{user.id}'}for br in item_rates:item_id = br['course_id']ur = user_rate.filter(course_id=item_id)if ur:data[f'item_{item_id}'] = ur.first().mark  # 对应课程的评分else:data[f'item_{item_id}'] = np.nan  # 设置成空user_item_list.append(data)data_pd = pd.DataFrame.from_records(user_item_list)print(data_pd)return data_pddef get_data_vector(data):'''对矩阵进行向量化,便于神经网络学习'''user_index = data[data.columns[0]]data = data.reset_index(drop=True)data[data.columns[0]] = data.index.astype('int')scaler = 5  # 评分最高为5,把用户的评分归一化到0-1df_vector = pd.melt(data, id_vars=[data.columns[0]],ignore_index=True,var_name='item_id',value_name='rate').dropna()df_vector.columns = ['user_id', 'item_id', 'rating']df_vector['rating'] = df_vector['rating'] / scalerdf_vector['user_id'] = df_vector['user_id'].apply(lambda x: user_index[x])print(df_vector)return df_vectordef evaluation(y_true, y_pred):'''模型评估:获取准确率、精准度、召回率、F1-score值y_true:正确标签y_pred:预测标签'''accuracy = round(classification_report(y_true, y_pred, output_dict=True)['accuracy'], 3)  # 准确率s = classification_report(y_true, y_pred, output_dict=True)['weighted avg']precision = round(s['precision'], 3)  # 精准度recall = round(s['recall'], 3)  # 召回率f1_score = round(s['f1-score'], 3)  # F1-scoreprint('神经网络协同推荐(NCF):准确率是{},精准度是{},召回率是{},F1值是{}'.format(accuracy, precision, recall, f1_score))return accuracy, precision, recall, f1_scoredef get_data_fit(df_vector):'''数据训练,得到模型'''scaler = 5  # 特征标准化:最高分为5,需要归一化到0~1dataset = df_vector  # 已向量化的数据集# 使用LabelEncoder将字符串标签转换为整数标签user_encoder = LabelEncoder()item_encoder = LabelEncoder()dataset['user_id'] = user_encoder.fit_transform(dataset['user_id'])dataset['item_id'] = item_encoder.fit_transform(dataset['item_id'])# Split the dataset into train and test setstrain, test = train_test_split(dataset, test_size=0.2, random_state=42)  # 划分训练集与测试集# train = dataset# Model hyperparametersnum_users = len(dataset['user_id'].unique())num_countries = len(dataset['item_id'].unique())embedding_dim = 64  # 64维向量标识# 创建NCF模型inputs_user = tf.keras.layers.Input(shape=(1,))inputs_item = tf.keras.layers.Input(shape=(1,))embedding_user = tf.keras.layers.Embedding(num_users, embedding_dim)(inputs_user)embedding_item = tf.keras.layers.Embedding(num_countries, embedding_dim)(inputs_item)# 合并 embeddings向量merged = tf.keras.layers.Concatenate()([embedding_user, embedding_item])merged = tf.keras.layers.Flatten()(merged)# 添加全连接层dense = tf.keras.layers.Dense(64, activation='relu')(merged)dense = tf.keras.layers.Dense(32, activation='relu')(dense)output = tf.keras.layers.Dense(1, activation='sigmoid')(dense)# 编译模型model = tf.keras.Model(inputs=[inputs_user, inputs_item], outputs=output)model.compile(optimizer='adam', loss='mse', metrics=['mae'])# 模型训练model.fit([train['user_id'].values, train['item_id'].values],train['rating'].values,batch_size=64,epochs=100,verbose=0,# validation_split=0.1,)item_rates = RateCourse.objects.all().values('course_id').distinct()# 获取每个用户的评分数据result_df = {}for user in User.objects.all():user_rate = RateCourse.objects.filter(user=user)if not user_rate:# 用户如果没有评分过任何一本课程则跳过循环continueuser = f'user_{user.id}'result_df[user] = {}for br in item_rates:item_id = br['course_id']item = f'item_{item_id}'pred_user_id = user_encoder.transform([user])pred_item_id = item_encoder.transform([item])result = model.predict(x=[pred_user_id, pred_item_id], verbose=0)result_df[user][item] = result[0][0]result_df = pd.DataFrame(result_df).Tresult_df *= scalerprint('全部用户预测结果', result_df)# 预测测试集并转成整形列表y_pred_ = np.floor(model.predict(x=[test['user_id'], test['item_id']], verbose=0) * scaler).tolist()y_pred = []for y in y_pred_:y_pred.append(int(y[0]))y_true = (test['rating'] * scaler).tolist()evaluation(y_true, y_pred)  # 模型评估joblib.dump(user_encoder, 'user_encoder.pkl')  # 保存用户标签joblib.dump(item_encoder, 'item_encoder.pkl')  # 保存课程标签model.save('ncf.dat')  # 模型保存def get_ncf_recommend(user_id, n=10):'''# 获取推荐user_id:用户idn:只取前十个推荐结果'''scaler = 5  # 特征标准化:最高分为5,需要归一化到0~1model = load_model('ncf.dat')  # 加载模型# 加载标签user_encoder = joblib.load('user_encoder.pkl')item_encoder = joblib.load('item_encoder.pkl')result_df = {}item_rates = RateCourse.objects.all().values('course_id').distinct()for item in item_rates:item_id = item['course_id']user = f'user_{user_id}'item = f"item_{item_id}"pred_user_id = user_encoder.transform([user])pred_item_id = item_encoder.transform([item])result = model.predict(x=[pred_user_id, pred_item_id], verbose=0)if not RateCourse.objects.filter(user_id=user_id, course_id=item_id):# 过滤掉用户已评分过的result_df[item_id] = result[0][0] * scalerresult_df_sort = sorted(result_df.items(), key=lambda x: x[1], reverse=True)  # 推荐结果按照评分降序排列print('预测结果', result_df_sort)recommend_ids = []for rds in result_df_sort[:n]:recommend_ids.append(rds[0])print(f'前{n}个推荐结果', recommend_ids)return recommend_idsif __name__ == '__main__':data_pd = get_all_data()  # 获取数据df_vector = get_data_vector(data_pd)  # 数据向量化data_recommend = get_data_fit(df_vector)  # 获取数据训练模型user_id = 1recommend_ids = get_ncf_recommend(user_id)  # 获取用户1的推荐结果

4、数据概览

在这里插入图片描述

5、数据导入

流程:
1、保存上一个用户
2、创建学生信息,用户名就是学生编号,密码是123456
3、更新课程序号
4、创建选课记录
5、添加用户喜欢的课程类型
6、更改上一个用户
7、

def import_data(request):with open('data/data.csv', 'r', newline='', encoding='gbk') as fp:reader = csv.reader(fp)user_last = None  # 上一个用户tag_id = []for row in reader:user_id = row[0]if user_id == 'stu_id':continueif not user_last:user_last = user_idusers = User.objects.filter(username=user_id)if not users:user = User.objects.create(username=user_id, password='123456')  # 创建学生信息,用户名就是学生编号,密码是123456else:user = users.first()# 查找课程course_infos = CourseInfo.objects.filter(name=row[3])if not course_infos:continuecourse = course_infos.first()if not course.course_index:course.course_index = row[2] # 更新课程序号course.save()if not UserCourse.objects.filter(user=user, course=course):# 创建选课记录UserCourse.objects.create(user_id=user.id,course_id=course.id,std_id=row[0],course_index=row[2],enroll_time=row[1])course.select_num += 1course.look_num += 1course.save()if user_id != user_last:# 添加用户喜欢的课程类型user_select = UserSelectTypes.objects.filter(user=User.objects.get(username=user_last))if not user_select:user_select = UserSelectTypes.objects.create(user=User.objects.get(username=user_last))else:user_select = user_select.first()for value in tag_id:user_select.category.add(value)user_last = user_id  # 更改上一个用户tag_id = []else:tag_id.append(course.tags_id)print('创建选课记录成功', user_id, row[3])else:course.select_num += 1course.look_num += 1course.save()return HttpResponse('导入成功')

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

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

相关文章

尚品汇-(六)

(1)属性的添加修改 平台属性对象: package com.atguigu.gmall.model.product;import com.atguigu.gmall.model.base.BaseEntity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.Tab…

基于Pytorch框架构建ResNet模型

Pytorch 一、训练模型1.导入资源包2.定义数据预处理3.读取数据 二、定义卷积神经网络1.导入必要的库2.定义名为convolutional_block的卷积块类3.定义了一个名为identity_block的恒等块类4.定义了一个名为Resnet的深度卷积神经网络类 三、创建模型1. 检查GPU设备2. 训练过程 四、…

玄机平台流量特征分析—蚂蚁爱上树

前言 依旧是流量分析,老规矩先看看要求。 步骤1.1 这里要求我们找到admin的密码,ctrlf筛选出product2.php的访问包,因为只有这类型流量包才有东西。其他的流量包都是没啥用的,至于我为啥知道,因为每个类型的流量包我…

地信大四,实习重要吗?怎么找实习岗位?

“地信怎么找实习啊?” “实习三个月以上?暑假只有两个月啊” “什么岗位实习比较有用?” “助理类岗位是做什么?” …… 同学们好啊,不知不觉24年已经是过完一小半了,24届毕业的同学们也差不多就要迎来…

测试工程师如何学习系统架构

面对同一个“知识点”不同的工作角色需要考虑的问题不一样,比如在系统架构中会使用到消息队列功能,系统架构师,开发人员,测试人员,运维人员,需求人员等需要考虑的问题不一样。 系统架构师在考虑消息队列功能…

数电大作业-四输入表决器

(PCB和multisim仿真画的有很大问题,没有VCC输入和GND,没学过直接裸画的,之后会好好看视频学习) 应用背景: 四个评委,三个及以上评委同时按下通过按钮时,选手才能通过。否则不通过。…

自动驾驶ADAS

1 ToF摄像头分类 1.1 ToF原理 类似雷达测距,生成3D点云,或者叫3D贴图。ToF相机的分辨率一般在3万像素左右。ToF距离计算公式如图所示。 Figure 1-1 ToF距离计算公式 D:距离 c:光速 PHI:相位差 fmod:调制频率…

创新指南|品牌电商新策略:五大转型思路与RGM举措

在流量红利过去的背景下,品牌电商面对多渠道运营的难题,如缺乏统盘经营、绩效管理分散、价格战失控、用户体验不足以及流量过度依赖,品牌电商如何有效应对这些挑战,本文从5个维度探讨全渠道电商RGM破局之路,实现品牌的…

pyppeteer模块经常使用的功能,相关操作案例

官方仓库地址:https://github.com/miyakogi/pyppeteer 官方文档地址:API Reference — Pyppeteer 0.0.25 documentation Selenium环境的相关配置比较繁琐,此外,有的网站会对selenium和webdriver进行识别和反爬,因此在…

【MySQL】数据库——事务

一.事务概念 事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行事务是一个不可分割的工作逻辑单元,在数…

【因果推断python】54_效应异质性和非线性带来的挑战2

目录 Continues Treatment and Non Linearity Key Concepts Continues Treatment and Non Linearity 我们只是深入探讨了二元结果增加异质性治疗效果分析难度的一个例子。但这种现象并不局限于市场营销中的转换问题。例如,2021 年,全球成功向公众提供了…

深度学习 --- stanford cs231学习笔记五(训练神经网络的几个重要组成部分之三,权重矩阵的初始化)

权重矩阵的初始化 3,权重矩阵的初始化 深度学习所学习的重点就是要根据损失函数训练权重矩阵中的系数。即便如此,权重函数也不能为空,总是需要初始化为某个值。 3,1 全都初始化为同一个常数可以吗? 首先要简单回顾一下…

仿微信图片查看器`WPF`实现`ListBox` 鼠标滑动批量选中与反选效果

看到微信中,上传图片时的图片查看功能可以通过手指长按并滑动实现多选,于是为解析实现思路,也通过WPF 使用ListBox 实现了一版案例。 参考效果 微信效果如下,支持图片单选和鼠标长按滑动实现批量操作。 WPF模仿效果&#xff1a…

Mysql: SQL-DDL

一.SQL通用语法 1.SQL可以单行或者多行书写,以分号结尾。 2.SQL语句可以使用空格/缩进来增强语句的可读性。 3.MySQL数据库的SQL语句不区分大小写,关键字建议用大写。 4.注释: 单行注释:注释内容或#注释内容(Mysql特有) 多行注释:/*注释内容*/ 二.SQL分类 1.D…

信息学奥赛初赛天天练-34-CSP-J2021完善程序-按位异或、模拟算法、数组模拟环、约瑟夫问题应用

PDF文档公众号回复关键字:20240624 2021 CSP-J 完善程序3 1 完善程序 (单选题 ,每小题3分,共30分) (Josephus问题)有n个人围成一个圈,依次标号0至n-1。从0号开始,依次 0,1,0&#…

0801功率放大问题

3个学时讲一个电路(两个共集共集并联),4个问题,发展线索 丙类放大电路用在高频通讯行业,低频功放是甲类,乙类,甲乙类 PT三极管的损耗 Pv电源提供的功率 现代模电通常使用方法b 只有交流…

用Vue3打造一个交互式营养追踪仪表盘

本文由ScriptEcho平台提供技术支持 项目地址:传送门 使用 Vue.js 构建营养仪表盘卡片 应用场景介绍 营养仪表盘卡片是一个可视化工具,用于跟踪个人的营养摄入情况。它通常包含以下信息: 卡路里摄入目标和进度营养成分(如脂肪…

2024中国·淮安高端人才精英赛北京分站赛首战告捷

“诚意满淮,创赢未来”!6月20-21日,2024中国淮安高端人才精英赛首场分站赛在北京产业创新中心顺利举办。淮安市科技局党组书记、局长胡长青,淮安市委组织部人才处处长沈雪娇,淮安经开区党工委委员、管委会副主任、科技…

C++(part2、3-Linux系统编程+数据库项目):Linux网络云盘

文章目录 一、项目需求分析1.一期:命令行解析(1)cd(用栈管理)、ls、pwd(2)puts、gets(3)mkdir、touch、rmdir、rm 2.二期:密码验证、日志、断点续传、大文件传输(1)密码验证(2)日志(3)断点续传(4)大文件传输 3.三期:用户注册、用户登录、虚拟…

springboot+vue+mybatis穷游管理系统+PPT+论文+讲解+售后

随着现在网络的快速发展,网上管理系统也逐渐快速发展起来,网上管理模式很快融入到了许多企业的之中,随之就产生了“基于vue的穷游管理系统”,这样就让基于vue的穷游管理系统更加方便简单。 对于本基于vue的穷游管理系统的设计来说…