Java推荐算法——特征加权推荐算法(以申请学校为例)
加权推荐算法
文章目录
- 加权推荐算法
- 1.推荐算法的简单介绍
- 2.加权推荐算法详细介绍
- 3.代码实现
- 4.总结
1.推荐算法的简单介绍
众所周知,推荐算法有很多种,例如:
1.加权推荐:分为简单的特征加权,以及复杂的混合加权。主要是将特征以权重进行计算总和,排序出前几名的数据,即最符合条件的数据,推荐给用户。
2.内容基推荐:这种方法基于物品的特征。系统会分析用户过去喜欢的物品特征,然后找到具有类似特征的其他物品推荐给用户。这种方法依赖于对物品内容的深入理解,比如文本、图像或音频特征。
比如我想买【华为手机】,但是系统中关于华为手机的商品很少,在用户继续浏览的过程中,就会根据华为手机属于【手机】类的这个特征,推荐其他【手机】类型的商品。
3.协同过滤推荐:分为物品基协同过滤和用户基协同过滤。
简单描述一下【用户基协同过滤】。
如果一个用户A喜欢某个物品,那么这个系统会找到与用户A相似的其他用户B,然后将B喜欢的、A还未接触的物品推荐给A。
2.加权推荐算法详细介绍
本次探讨的就是简单的特征加权,以留学申请为例简单描述一下:
比如留学申请的过程中中有几个重要特征参数:所在国家、全球QS排名、专业。
那么当我想选择:{英国,前10,计算机}这样的数据时,一般会怎么查呢?是不是精确查询了?在数据库中找到英国+QS前10+计算机这样的数据返回给用户。

但是在面对数据较少的时候,显示给用户的数据就太少了,比如我上面展示的,只有2条数据符合要求。
那如果我想每次用户搜索完成后,最少都要展示10条数据呢?
这样就需要在精确搜索进行改进了,改为【特征加权推荐】,以国家、专业、QS排名三个为特征,设置权重,对数据库中的数据进行计算,获取前10个得分最高的数据展示。
这样就可以推荐出用户也“可能”喜欢的院校了,比如就推荐出了美国高校的计算机专业。

3.代码实现
实现代码示例如下:
加权推荐的算法部分
首先我们需要准备留学专业的java实体类。
package com.ride.system.domain;import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ride.system.common.core.domain.BaseEntity;/*** 留学专业信息对象 sys_study_abroad**/
public class SysStudyAbroad extends BaseEntity
{private static final long serialVersionUID = 1L;/** 主键 */private Long studyAbroadId;/** 国家 */private String country;/** 专业 */private String major;/** QS排名 */private String qs;// 推荐加权得分private Double score;public Double getScore() {return score;}public void setScore(Double score) {this.score = score;}public String getQs() {return qs;}public void setQs(String qs) {this.qs = qs;}public String getCountry() {return country;}public void setCountry(String country) {this.country = country;}public SysMajor getMajor() {return major;}public void setMajor(SysMajor major) {this.major = major;}
}
接下来,编写推荐算法的函数
/*** 加权平均推荐算法* @param userInput 用户输入* @param majors 留学专业列表,即数据库中全部专业数据* @param weights 权重规则* @return*/
public static List<SysStudyAbroad> weightedRecommendation(SysStudyAbroad userInput, List<SysStudyAbroad> majors, Map<String, Double> weights) {List<SysStudyAbroad> recommendations = new ArrayList<>();for (SysStudyAbroad major : majors) {double score = 0;// 计算每个权重的得分// 如果满足一个要求,则得1分,否则0分。double countrySimilarity = userInput.getCountry().equals(major.getCountry()) ? 1 : 0;double majorSimilarity = userInput.getMajor().equals(major.getMajor()) ? 1 : 0;double qsRankSimilarity = Math.abs(Integer.parseInt(userInput.getQs()) - Integer.parseInt(major.getQs())) >= 0 ? 1: 0;// 加权得分综合score += weights.get("country") * countrySimilarity;score += weights.get("major") * majorSimilarity;score += weights.get("qsRank") * qsRankSimilarity;major.setScore(score);recommendations.add(major);}// 根据加权的得分进行推荐排序recommendations.sort((c1, c2) -> Double.compare(c2.getScore(), c1.getScore()));return recommendations;
}
在需要调用的地方进行调用
/*** 推荐留学专业信息列表** @param sysStudyAbroad 留学专业信息* @return 留学专业信息*/
@Override
public List<SysStudyAbroad> recommend(SysStudyAbroad sysStudyAbroad)
{// 查询数据库专业数据List<SysStudyAbroad> majors = sysStudyAbroadMapper.selectSysStudyAbroadListAll();//设置权重值,国家为0.3,专业为0.5,qs排名为0.2Map<String, Double> weights = new HashMap<>();weights.put("country", 0.3);weights.put("major", 0.5);weights.put("qsRank", 0.2);List<SysStudyAbroad> recommendations = weightedRecommendation(sysStudyAbroad, majors, weights);recommendations = recommendations.subList(0, Math.min(20, recommendations.size()));for (SysStudyAbroad major : recommendations) {System.out.println("国家: " + major.getCountry() + ", 专业: " + major.getMajorId() + ", QS排名: " + major.getQs() + ",权重: " + major.getScore());}return recommendations;
}
用户输入如下

推荐结果如下

4.总结
特征加权推荐算法适用于在用户条件的基础上推荐额外的内容,适用于有2个特征以上的数据结构。
如有问题,欢迎评论区批评指正!❤️
相关文章:
Java推荐算法——特征加权推荐算法(以申请学校为例)
加权推荐算法 文章目录 加权推荐算法1.推荐算法的简单介绍2.加权推荐算法详细介绍3.代码实现4.总结 1.推荐算法的简单介绍 众所周知,推荐算法有很多种,例如: 1.加权推荐:分为简单的特征加权,以及复杂的混合加权。主要…...
探索什么便签软件好用,可以和手机同步的便签软件
在信息技术日新月异的今天,各类数字工具已经成为我们生活与工作的重要助手。便签软件作为一种简单却高效的辅助工具,悄然改变着人们的记录习惯与时间管理方式。而在诸多便签软件中,能够实现手机与电脑同步功能的产品尤显其独特的价值。那么&a…...
字符函数与字符串函数
前言 本次博客可以说内容最为多的一次博客,讲解同样很细致大家好好看看 1字符函数 在讲解字符函数时,大家得了解什么是字符吧 普通字符a b c 1 转义字符 \n 换行‘ \t’ 水平制表符\r回车 大家了解即可 在C语言中字符也可以有分类 所以我们先来看看…...
Kubernetes 项目整体布局 el-container
整体布局整体布局 你可能会去敲不同的项目,有很多种平台。那么其实都是可以复用的。唯一不同的就是main里面的内容是不同的,边框架子都是相同的。其实框架是不怎么变化的,变化的是main里面。 src/layout/Layout.vue 这里需要新增一个页面Lay…...
AI赋能写作:AI大模型高效写作一本通
❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。2022年度博客之星评选TOP 10🏆,Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作…...
unraid docker.img扩容
unraid 弹Docker image disk utilization of 99%,容器下载/更新失败 我的版本是6.11.5,docker.img满了导致容器不能更新,遇到同样问题的可以先用docker命令清除一下仓库(当然不一定能清理出来,我已经清理过只清理出来1G多点&…...
Python 实现1~100之间的偶数求和
result0 for i in range(101):if i%20:result result i print(result) 或者 result0 for i in range(2,101,2):result result i print(result)...
Leetcode 387. First Unique Character in a String
Problem Given a string s, find the first non-repeating character in it and return its index. If it does not exist, return -1. Algorithm Use two lists: one list is used to count the letters in “s”; the other list is the position where the letter first …...
c++ 自己实现一个迭代器
具体代码 /*自定义迭代器的实现 */ #include <iostream> using namespace std; class num {int val; //具体的数字int length; //数字的位数void calculate_length(){if(val/100){ //这个数字只有1位length1;return;}int x10; //这里就是不断重复除直…...
HarmonyOS NEXT应用开发—图片压缩方案
介绍 图片压缩在应用开发中是一个非常常见的需求,特别是在处理用户上传图片时,需要上传指定大小以内的图片。目前图片压缩支持jpeg、webp、png格式。本例中以jpeg图片为例介绍如何通过packing和scale实现图片压缩到目标大小以内。 效果图预览 使用说明…...
深入理解nginx的请求限速模块[下]
目录 3. 源码分析3.1 配置指令3.1.1 limit_req_zone指令3.1.2 limit_req指令3.1.3 limit_req_dry_run指令3.1.4 limit_req_log_level指令3.1.5 limit_req_status指令3.2 模块初始化3.3 请求处理3.3.1 ngx_http_limit_req_handler3.3.1 ngx_http_limit_req_lookup3.3.2 ngx_http…...
王者归位:Kafka控制器组件解析
欢迎来到我的博客,代码的世界里,每一行都是一个故事 王者归位:Kafka控制器组件解析 前言控制器组件简介控制器组件的定义和作用:为什么控制器是分布式系统的核心? 保存了什么数据控制器的指定和切换故障转移控制器故障…...
XmlHttpRequest responseType: ‘stream‘ 图片代理服务器
它是一个存在于原生 XMLHttpRequest 对象中的属性。在 Web API 中,XMLHttpRequest 对象用于发送 HTTP 或 HTTPS 请求到服务器,并接收响应。responseType 属性就是用来指定预期从服务器返回的响应数据的类型。 默认值 responseType的默认值为json&#x…...
手写 UE4中的 TArray
#pragma once #include<iostream> #include<stdexcept> #define CHECK_INDEX_RANGE(Index) if (Index > ElementCount) throw std::out_of_range("索引超出界限")template<typename ElementType> class TArray {typedef unsigned int uint; pri…...
Flink实时写Hudi报NumberFormatException异常
Flink实时写Hudi报NumberFormatException异常 问题描述 在Flink项目中,针对Hudi表 xxxx_table 的 bucket_write 操作由于 java.lang.NumberFormatException 异常而从运行状态切换到失败状态。异常信息显示在解析字符串"ddd7a1ec"为整数时出现了问题。报…...
Dataset与DataLoader、transform
文章目录 1、Dataset2、DataLoader2.1 参数详解2.1.1 num_works2.1.2 pin_memory2.1.3 collate_fn 3、图像增强4、重写transform 1、Dataset 在 PyTorch 中,如果要创建自定义的数据集(Dataset),通常会继承 torch.utils.data.Data…...
海豚调度系列之:认识海豚调度
海豚调度系列之:认识海豚调度 一、海豚调度二、特性三、建议配置四、名次解释 一、海豚调度 Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景,提供了一个可视化操作任务、工作流和全生命周期数据处理过…...
MateBook 14s 2023款 集显 触屏(HKFG-16)原厂Win11系统
HUAWEI华为MateBook14s笔记本电脑2023款原装Windows11,恢复出厂开箱状态系统下载 适用型号:HKFG-XX、HKFG-16、HKFG-32 链接:https://pan.baidu.com/s/1GBPLwucRiIup539Ms2ue0w?pwdfm41 提取码:fm41 原厂系统自带所有驱动、…...
zookeeper快速入门(合集)
zookeeper作为一个分布式协调框架,它的创建就是为了方便或者简化分布式应用的开发。除了服务注册与发现之外,它还能够提供更多的功能,但是对于入门来说,看这一篇就够了。后续会讲zookeeper的架构设计与原理,比如zookee…...
鸿蒙App开发学习 - TypeScript编程语言全面开发教程(上)
背景 根据鸿蒙官方的说明: ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集。因此,在学习ArkTS语言之前&#…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
文件上传漏洞防御全攻略
要全面防范文件上传漏洞,需构建多层防御体系,结合技术验证、存储隔离与权限控制: 🔒 一、基础防护层 前端校验(仅辅助) 通过JavaScript限制文件后缀名(白名单)和大小,提…...
Axure零基础跟我学:展开与收回
亲爱的小伙伴,如有帮助请订阅专栏!跟着老师每课一练,系统学习Axure交互设计课程! Axure产品经理精品视频课https://edu.csdn.net/course/detail/40420 课程主题:Axure菜单展开与收回 课程视频:...
Axure Rp 11 安装、汉化、授权
Axure Rp 11 安装、汉化、授权 1、前言2、汉化2.1、汉化文件下载2.2、windows汉化流程2.3、 macOs汉化流程 3、授权 1、前言 Axure Rp 11官方下载链接:https://www.axure.com/downloadthanks 2、汉化 2.1、汉化文件下载 链接: https://pan.baidu.com/s/18Clf…...
