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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软考高级:系统工程方法(霍尔三维结构、切克兰德方法等)概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

Python+Selenium 自动化 - 开发环境搭建

PythonSelenium 自动化 - 开发环境搭建 一、Python 下载与安装二、Geany 代码编辑工具下载与安装三、代码运行演示 一、Python 下载与安装 Python 官网&#xff1a;https://www.python.org/ 首先在官网下安装包。 建议选择稳定版本&#xff0c;我这里下载的是 3.12.2 版本。 …

C++Qt学习——添加资源文件

目录 1、创建好了文件之后&#xff0c;在左边空白处按下CtrlN&#xff0c;创建Qt 以及Qt Resource File 2、写入名称&#xff0c;点击下一步 3、可以发现已经创建好啦。 4、点击Add Prefix 5、写上前缀&#xff0c;最好加上斜杠 6、选择提前放好的图片或者icon 7、发…

2024最新修复版独立付费进群系统源码全开源

1、修复SQL表 2、修复支付文件 3、修复支付图标不显示 4、修复定位、分销逻辑、抽成逻辑 5、新增支持源支付、易支付的支付接口 6、修复官方微信、支付宝支付接口文件 本来早就可以完工的&#xff0c;被99ai群里的几个傻逼耽搁了&#xff0c;做好自己就行了&#xff0c;这…

Learn OpenGL 09 投光物+多光源

将光投射(Cast)到物体的光源叫做投光物(Light Caster)。 投光物主要分为点光源&#xff0c;聚光灯&#xff0c;平行光。 平行光 当一个光源处于很远的地方时&#xff0c;来自光源的每条光线就会近似于互相平行。不论物体和/或者观察者的位置&#xff0c;看起来好像所有的光都…

C++:vector类

vector的介绍及使用 1. vector 是表示可变大小数组的序列容器。 2. 就像数组一样&#xff0c; vector 也采用的连续存储空间来存储元素。也就是意味着可以采用下标对 vector 的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的…

解锁App推广新姿势:Xinstall二维码信息获取秘籍

在移动互联网时代&#xff0c;App推广已成为各大企业和开发者必不可少的一项工作。而在推广过程中&#xff0c;二维码作为一种便捷的下载和安装方式&#xff0c;被广泛应用于各种场景。然而&#xff0c;如何有效获取并利用这些二维码信息&#xff0c;却成为了一个令人头疼的问题…

AUTOSAR软件配置(3):MCAL下载安装

前言 所有的NXP软件的下载安装都是需要自己在官网去注册账号的 中文的NXP官方网址&#xff1a;恩智浦半导体官方网站 | NXP 半导体 注&#xff1a;本文指导安装教程将以S32K144平台为例展开。 下载 找到下载入口的指引 然后在左侧的导航栏找到AUTOSAR 然后选择4.2版本 在…

Python中的类【详谈】

零.前言&#xff1a; 本文适合对Python有浅浅了解的读者&#xff0c;并不能作为Python入门使用。 一.Python中类的属性、方法 在Python中有变量&#xff0c;有函数&#xff0c;例如下方&#xff1a; def IAmAFunction():print("I am a function")IAmVariable 25…

智能革新:思通数科开源AI平台在保险合同管理中的应用与优化

思通数科开源的多模态AI能力引擎平台是一个强大的工具&#xff0c;它结合了自然语言处理&#xff08;NLP&#xff09;、图像识别和语音识别技术&#xff0c;为企业提供自动化处理和分析文本、音视频和图像数据的能力。这个平台的开源性质意味着它可以被广泛地应用于各种业务场景…

idea Springboot 在线考试管理系统开发mysql数据库web结构java编程计算机网页

一、源码特点 springboot 在线考试管理系统是一套完善的完整信息系统&#xff0c;结合mvc框架和bootstrap完成本系统springboot spring mybatis &#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有…

这个学习Python的神仙网站,后悔没早点发现

Python 作为时下最流行的编程语言&#xff0c;很多初学者都将它作为自学编程的首选。不管是有编程经验的开发者&#xff0c;还是新手小白&#xff0c;在这个 AIGC 时代&#xff0c; Python 都可以带你探索新世界。 入门 Python 绝非难事&#xff0c;但如何让自己坚持学下去是如…

Set cancelled by MemoryScratchSinkOperator

Bug信息 Caused by: com.starrocks.connector.spark.exception.StarrocksInternalException: StarRocks server StarRocks BE{host=10.9.14.39, port=9060} internal failed, status code [CANCELLED] error message is [Set cancelled by MemoryScratchSinkOperator]Bug产生的…

RC522刷卡电路设计及程序

一、RC522刷卡电路组成 基于RC522的刷卡电路如上图所示。该电路组成主要分为三部分&#xff1a; Receiving Circuit&#xff1a;接收电路&#xff0c;接收卡发送的数据。 Filtering Impedence-Transtorm circuit:滤波和阻抗变换电路&#xff0c;抑制高次谐波并优化到读卡器天线…

POS 之 验证者如何才能提议区块

验证者提议区块 验证者帐户提议区块。 验证者帐户由节点运营商(可以是AWS等待云服务商)管理&#xff0c;节点运营商运行验证者软件作为其执行和共识客户端的一部分&#xff0c;并且已经向存款合约中存入了至少 32 个以太币 然而&#xff0c;每个验证者只是偶尔负责提议一个区块…

imagemagick深度系统(deepin)安装

背景&#xff1a; 为了试用MoneyPrinter&#xff0c;需要配置imagemagick软件。但是没有适配深度系统的软件包。需要自己编译后安装。 安装&#xff1a; 下载源码 解压(tar xvfz ImageMagick.tar.gz)后进入目录&#xff08;cd ImageMagick-7.1.1&#xff09;&#xff0c;使用…

第十四届蓝桥杯省赛真题 Java B 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 阶乘求和试题 B: 幸运数字试题 C: 数组分割试题 D: 矩形总面积试题 E: 蜗牛试题 F: 合并区域试题 G : \mathrm{G}: G: 买二赠一试题 H \mathrm{H} H : 合并石子试题 I&#xff1a;最大开支试题 J : \mathrm{J}: J: 魔法阵 发现宝藏 前…

Pytorch学习 day14(模型的验证步骤)

如何利用已经训练好的模型&#xff0c;验证它的结果&#xff0c;步骤如下&#xff1a; 步骤一&#xff1a;加载测试输入并更改为合适尺寸 保存图片到指定文件夹下&#xff0c;注意是否为同级目录注意&#xff1a;返回上一级目录为“…/xxx"有时&#xff0c;我们自己的输…

WRF模型运行教程(ububtu系统)--II.ARWpost安装

一、ARWpost简介 ARWpost 是一个把 WRF 结果转为 GrADS 或 Vis5D 可以辨识的数据格式的软件&#xff0c;就是WRF运行结束以后&#xff0c;把WRF的结果变成咱们平时比较常用的数据格式。 二、下载和安装ARWpos_V3 1.ARWpos_V3安装前准备 # 进入Build_WRF文件夹 cd Build_WRF …

Devin,第一位AI软件工程师

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…