基于在校学习平台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,一经查实,立即删除!

相关文章

django后台登录:Forbidden (403) CSRF verification failed.

Djangodockernginxuwsgi部署项目时,项目部署完成后,访问Django admin后台登录时报错: http://xxxx/admin/login/?next/admin/ 请求方法: POST 状态代码: 403 Forbidden 然后百度发现的解决办法如下: http://t.csdnimg.cn/SmSWl…

Kubernetes之CSI详解

如何更好的用好Kubernetes CSI?本文尝试从CSI简介、CSI控制器实现原理、实现示例及最佳实践4方面进行阐述。希望对您有所帮助! 一、Kubernetes CSI 简介 CSI (Container Storage Interface) 是一种标准化的接口,用于在容器编排平台&#xf…

尚品汇-(六)

(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…

GitHub每日最火火火项目(6.24)

modelscope / DiffSynth-Studio: 项目介绍:DiffSynth-Studio 是一个基于扩散模型的音频合成工具,它可以生成各种逼真的音频效果,如乐器演奏、环境声音等。该项目提供了一个易于使用的界面,让用户可以通过简单的操作来创…

市盈率(Price-Earnings Ratio)是什么?股市中还结合哪些指标分析一家公司?

市盈率是什么? 中文版 市盈率(Price-Earnings Ratio, P/E Ratio) 是一种评估公司股票价值的重要财务指标。它是通过将公司的股票价格(Price)除以每股收益(Earnings per Share, EPS)计算得出的…

基于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届毕业的同学们也差不多就要迎来…

快手2019年秋季校园招聘笔试试卷—工程A试卷

a/b 题目描述 求 a/b 的小数表现形式。如果 a 可以整除 b 则不需要小数点。如果是有限小数&#xff0c;则可以直接输出。如果是无限循环小数&#xff0c;则需要把小数循环的部分用"()"括起来。 输入描述 两个整数a和b&#xff0c;其中 0 < a < 1000 000 1…

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

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

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

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

自动驾驶ADAS

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

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

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

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

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

区块链小故事

大灰狼与小白兔 一天兔子妈妈出门了&#xff0c;在大门上安装了一个区块链的门把手&#xff0c;这个门把手只有兔子妈妈、小兔子、以及另一个客人都同意的时候&#xff0c;才会开门&#xff0c;有一天客人a的钥匙丢了&#xff0c;被大灰狼捡到了&#xff0c;大灰狼于是去开门&…

【MySQL】数据库——事务

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

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

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

com.google.flatbuffers序列化原理和java使用场景

简介 FlatBuffers 的主要目标是为序列化和反序列化提供一个高效且灵活的解决方案,同时支持多种语言和平台。 实现原理 FlatBuffers 的实现原理可以概括为以下几个关键点: 序列化与存储: FlatBuffers 使用一种二进制序列化格式,将数据直接存储为平面化的二进制数据缓冲区…

如何使用Python接收电子邮件

哈喽,大家好,我是木头左! 本文将详细介绍如何使用Python接收电子邮件,包括SMTP协议的基本概念、Python邮件库的使用以及实际的代码示例。通过阅读本文,你将能够掌握邮件自动处理的技巧,提高工作效率,同时也可以提升自己的Python编程能力。 SMTP协议简介 SMTP(Simple …

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

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