毕设所有选题:
https://blog.csdn.net/2303_76227485/article/details/131104075
基于Java+Springboot+vue3+协同过滤推荐算法的学习平台(源代码+数据库)250
一、系统介绍
本项目前后端分离(可以改为ssm版本),分为用户、管理员2种角色。
1、用户:
- 注册、登录、课程推荐(使用协同过滤推荐)、公告信息、课程书籍阅读(分章节目录)、课程视频学习(收藏、评论)、在线考试、论坛交流、
- 考试记录、我的收藏、个人信息、密码修改
2、管理员:
- 首页大屏数据统计:用户总数、课程总数、视频类型饼统计、视频柱状图统计
- 课程管理、类型管理、论坛管理、管理员管理、用户管理、轮播图管理、公告管理、试卷管理、试题管理、题库管理、考试管理、考试记录
3、亮点:
使用协同过滤推荐算法推荐课程,基于用户已收藏课程,推荐相似用户后续学习的课程
二、所用技术
后端技术栈:
- Springboot
- mybatisPlus
- Mysql
- Maven
前端技术栈:
- Vue3
- Vue-router
- axios
- elementPlus
- echarts
三、环境介绍
基础环境 :IDEA/eclipse, JDK1.8, Mysql5.7及以上, Maven3.6, node14, navicat
所有项目以及源代码本人均调试运行无问题 可支持远程调试运行
四、页面截图
1、用户:




















2、管理员:





















五、浏览地址
前台地址:http://localhost:8082
- 用户账号密码:zhangsan/123456
后台地址:http://localhost:8081
- 管理员账户密码:admin/admin
六、部署教程
-
使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并执行项目的sql文件
-
使用IDEA/Eclipse导入server_code项目,若为maven项目请选择maven,等待依赖下载完成
-
修改application.yml里面的数据库配置,src/main/java/com/SpringbootSchemaApplication.java启动后端项目
-
vscode或idea打开client_code后台项目
-
在编译器中打开terminal,执行npm install 依赖下载完成后执行 npm run serve,执行成功后会显示访问地址
-
vscode或idea打开manage_code后台项目
-
在编译器中打开terminal,执行npm install 依赖下载完成后执行 npm run serve,执行成功后会显示访问地址
七、协同过滤部分代码
public class UserBasedCollaborativeFiltering {
private Map<String, Map<String, Double>> userRatings;
private Map<String, List<String>> itemUsers;
private Map<String, Integer> userIndex;
private Map<Integer, String> indexUser;
private Long[][] sparseMatrix;
public UserBasedCollaborativeFiltering(Map<String, Map<String, Double>> userRatings) {
this.userRatings = userRatings;
this.itemUsers = new HashMap<>();
this.userIndex = new HashMap<>();//辅助存储每一个用户的用户索引index映射:user->index
this.indexUser = new HashMap<>();//辅助存储每一个索引index对应的用户映射:index->user
// 构建物品-用户倒排表
int keyIndex = 0;
for (String user : userRatings.keySet()) {
Map<String, Double> ratings = userRatings.get(user);
for (String item : ratings.keySet()) {
if (!itemUsers.containsKey(item)) {
itemUsers.put(item, new ArrayList<>());
}
itemUsers.get(item).add(user);
}
//用户ID与稀疏矩阵建立对应关系
this.userIndex.put(user,keyIndex);
this.indexUser.put(keyIndex,user);
keyIndex++;
}
int N = userRatings.size();
this.sparseMatrix=new Long[N][N];//建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】
for(int i=0;i<N;i++){
for(int j=0;j<N;j++)
this.sparseMatrix[i][j]=(long)0;
}
for(String item : itemUsers.keySet()) {
List<String> userList = itemUsers.get(item);
for(String u1 : userList) {
for(String u2 : userList) {
if(u1.equals(u2)){
continue;
}
this.sparseMatrix[this.userIndex.get(u1)][this.userIndex.get(u2)]+=1;
}
}
}
}
public double calculateSimilarity(String user1, String user2) {
//计算用户之间的相似度【余弦相似性】
Integer id1 = this.userIndex.get(user1);
Integer id2 = this.userIndex.get(user2);
if(id1==null || id2==null) return 0.0;
return this.sparseMatrix[id1][id2]/Math.sqrt(userRatings.get(indexUser.get(id1)).size()*userRatings.get(indexUser.get(id2)).size());
}
public List<String> recommendItems(String targetUser, int numRecommendations) {
// 计算目标用户与其他用户的相似度
Map<String, Double> userSimilarities = new HashMap<>();
for (String user : userRatings.keySet()) {
if (!user.equals(targetUser)) {
double similarity = calculateSimilarity(targetUser, user);
userSimilarities.put(user, similarity);
}
}
// 根据相似度进行排序
List<Map.Entry<String, Double>> sortedSimilarities = new ArrayList<>(userSimilarities.entrySet());
sortedSimilarities.sort(Map.Entry.comparingByValue(Comparator.reverseOrder()));
// 选择相似度最高的K个用户
List<String> similarUsers = new ArrayList<>();
for (int i = 0; i < numRecommendations; i++) {
if (i < sortedSimilarities.size()) {
similarUsers.add(sortedSimilarities.get(i).getKey());
} else {
break;
}
}
// 获取相似用户喜欢的物品,并进行推荐
Map<String, Double> recommendations = new HashMap<>();
for (String user : similarUsers) {
Map<String, Double> ratings = userRatings.get(user);
for (String item : ratings.keySet()) {
if (userRatings.get(targetUser)!=null && !userRatings.get(targetUser).containsKey(item)) {
recommendations.put(item, ratings.get(item));
}
}
}
// 排序推荐物品
LinkedHashMap<String, Double> sortedRecommendations = new LinkedHashMap<>(recommendations);
// 取前N个推荐物品
int numItems = Math.min(numRecommendations, sortedRecommendations.size());
sortedRecommendations = sortedRecommendations.entrySet()
.stream()
.sorted((Map.Entry.<String, Double>comparingByValue().reversed())).limit(numItems)
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
List<String> result = new ArrayList<String>();
result.addAll(sortedRecommendations.keySet());
return result;
}
}

1093

被折叠的 条评论
为什么被折叠?



