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个特征以上的数据结构。

如有问题,欢迎评论区批评指正!❤️

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

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

相关文章

如何让intellij idea支持一个目录多个springtboot或maven项目

一、背景 有的时候&#xff0c;我们希望intellij idea 能像 eclipse 一样有workspace的概念&#xff0c;能在一个workspace目录里面引入多个项目&#xff0c;如&#xff1a; 我们有项目a、项目b&#xff0c;现在的项目几乎都是springboot项目&#xff08;即maven项目&#xf…

MapReduce面试重点

文章目录 1. 简述MapReduce整个流程 1. 简述MapReduce整个流程 数据划分(Input Splitting)&#xff1a;开始时&#xff0c;输入数据被分割成逻辑上的小块&#xff0c;每个块被称为Input Split。 映射(Map)&#xff1a;每个Input Split 由一个或多个Map任务处理&#xff0c;这些…

论文阅读——RSGPT

RSGPT: A Remote Sensing Vision Language Model and Benchmark 贡献&#xff1a;构建了一个高质量的遥感图像描述数据集&#xff08;RSICap&#xff09;和一个名为RSIEval的基准评估数据集&#xff0c;并在新创建的RSICap数据集上开发了基于微调InstructBLIP的遥感生成预训练…

云计算基础(一)

云计算是什么&#xff1f;云&#xff1a;采用看得见摸不着的含义&#xff0c;计算&#xff1a;即处理任务。所以&#xff0c;在看的见摸不着的计算机上进行任务的处理即为云计算。云计算具备了较多的一些特性&#xff0c;比如:代价低、稳定性高、灵活性强、资源使用率高。计算机…

Python学习01 python开发的准备工作 1.Python解释器的下载 2.Pycharm集成开发环境的安装

0.按照步骤&#xff0c;快速进行python的开发准备工作 1. Python解释器的下载 下载地址 https://www.python.org/ 选择对应你的系统的安装包 2.记得勾选这里将python加入你的路径中 3.有如下四个程序表明安装成功 4.点击上图中的第二个程序打开窗口检查解释器能否正常工作 输…

基于OrangePi的智能垃圾桶(全程可实现)

目录 一、阿里云平台垃圾分类接入 二、用C语言调用阿里云Python的接口 1.首先将阿里云自启动 2.封装函数,方便C语言调用 3、用C语言调用 三、香橙派调用摄像头 1) 首先将 USB 摄像头插入到 Orange Pi 开发板的 USB 接口中 2) 然后通过 lsmod 命令可以看到内核自动加载了…

【学习笔记】云原生初步

一、云原生的概念 云原生&#xff08;Cloud Native&#xff09;是一种基于分布部署和统一运管的分布式云&#xff0c;以容器、微服务、DevOps等技术为基础建立的一套云技术产品体系。它是一种新型技术体系&#xff0c;是云计算未来的发展方向。云原生应用程序是针对云平台设计…

uniapp修改头像,选择图片

一、页面效果 二、手机上的效果 使用过的实例&#xff1a; 手机上就会显示类似如下&#xff1a; 三、代码 <view class"cleaner-top" click"chooseImg"><view class"cleaner-avatar"><image :src"imgArr" mode"…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:FlowItem)

瀑布流组件的子组件&#xff0c;用来展示瀑布流具体item。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。仅支持作为Waterflow组件的子组件使用。 子组件 支持单个子组件。 接口 FlowItem() 使…

挑战杯 机器视觉目标检测 - opencv 深度学习

文章目录 0 前言2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 0 前言 &#x1f5…

常用芯片学习——DS3231M芯片

DS3231M RTC实时时钟 芯片介绍 DS3231M是一款低成本、极其精确的 I2C 实时时钟 &#xff08;RTC&#xff09;。该设备集成了电池输入&#xff0c;并在设备主电源中断时保持准确的计时。微型电子机械系统 &#xff08;MEMS&#xff09; 谐振器的集成提高了器件的长期精度&…

Linux常用操作命令(工具)

Linux是一种自由和开放源代码的类UNIX操作系统&#xff0c;其内核由林纳斯托瓦兹在1991年首次发布。Linux操作系统的核心是内核&#xff0c;它负责管理系统的进程、内存、设备驱动程序、文件和网络系统&#xff0c;决定着系统的性能和稳定性。Linux内核由许多组件组成&#xff…

Tomcat Seeion 集群

部署&#xff1a;nginx服务器&#xff1a;11-11&#xff1b;tomcat1:11-3; tomcat2:11-6 nginx服务器11-11做搭建&#xff1a; [rootmcb-11 ~]# systemctl stop firewalld [rootmcb-11 ~]# setenforce 0 [rootmcb-11 ~]# yum install epel-release.noarch -y [rootmcb…

关于 NXP PCA85073A 实时时钟读取数据时出现 IIC 传输失败的原因解析和解决方法

一、前言 对使用 I2C 传输的 RTC 外设 PCA85073&#xff0c;在 I2C 传输过程中若有复位信号输入&#xff0c;则有概率出现 I2C 死锁的状态&#xff0c;即 SCL为高&#xff0c;SDA一直为低的现象。 二、I2C 基本协议 在分析问题出现的原因之前&#xff0c;我…

前端基础篇-深入了解 JavaScript(JSON、BOM、DOM 和事件监听)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 JS - JSON 2.0 JS - BOM 2.1 Window 浏览器窗口对象 2.2 Location 地址栏对象 3.0 JS - DOM 3.1 获取 HTML 元素对象 3.2 调用 Element 对象的属性、方法 4.0 事件…

威联通(QNAP) TS-466C NAS 开箱评测,4盘位NAS,N6005,存储服务器

威联通(QNAP) TS-466C 四盘位NAS (Network Attached Storage:网络附属存储) 开箱评测 之前用的TS-551经过几轮系统升级后明显感觉性能跟不上了&#xff0c;变卡了&#xff0c;所以升级一下&#xff0c;换了TS-466C。 威联通迁移NAS还挺方便的&#xff0c;只有将原先NAS里的硬…

Spring Boot项目怎么从Nacos注册中心上获取其他服务列表信息?

一、前言 在spring boot项目开发过程中&#xff0c;为了进行微服务之间的调用&#xff0c;我们一般会使用注册中心&#xff0c;比如Nacos。假设我们有一个业务需求&#xff0c;应用A需要从Nacos注册中心上获取服务信息进行分析&#xff0c;需要怎么实现呢&#xff1f; 二、开…

数据结构(四)——串的定义和基本操作

四、串 4.1 串的定义和实现 4.1.2 串的定义 串&#xff1a;即字符串&#xff08;String&#xff09;是由零个或多个字符组成的有限序列。例&#xff1a;T‘iPhone 11 Pro Max?’子串&#xff1a;串中任意个连续的字符组成的子序列。 Eg&#xff1a;’iPhon…

蓝桥杯每日一题:血色先锋队

今天浅浅复习巩固一下bfs 答案&#xff1a; #include<iostream> #include<algorithm> #include<cstring>using namespace std; typedef pair<int,int> PII;const int N510; int n,m,a,b; int dist[N][N]; PII q[N*N]; int hh0,tt-1;int dx[]{1,0,-1,…

通信系统架构

本博客地址&#xff1a;https://security.blog.csdn.net/article/details/136785570 一. 通信系统架构基础 1、通信网络主要形式&#xff1a;局域网、广域网、移动通信网。 二. 局域网 2、局域网网络架构通常由计算机、交换机、路由器等设备组成。特点是覆盖地理范围小、数…