Java推荐算法——特征加权推荐算法(以申请学校为例)

news2024/12/26 21:32:21

加权推荐算法

文章目录

  • 加权推荐算法
    • 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个特征以上的数据结构。

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

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

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

相关文章

Qt文件读写

做一个简单的文件读写&#xff0c;我们把一个结构体内的数据写入到二进制文件中&#xff0c;并重新读取解析。代码结构如下&#xff1a; 项目名称随便起就好了。main.cpp是主函数&#xff1b;DataHandler实现文件的写与读&#xff0c;还要模拟过程&#xff1b;Definition.h放置…

蚁群算法实现 - 全局路径规划算法

参考博客&#xff1a; &#xff08;1&#xff09;【人工智能】蚁群算法(密恐勿入) &#xff08;2&#xff09;计算智能——蚁群算法 &#xff08;3&#xff09;蚁群算法(实例帮助理解) &#xff08;4&#xff09;【数之道 04】解决最优路径问题的妙招-蚁群ACO算法 &#xff08;…

51单片机—DS18B20温度传感器

目录 一.元件介绍及原理 二&#xff0c;应用&#xff1a;DS18B20读取温度 一.元件介绍及原理 1.元件 2.内部介绍 本次元件使用的是单总线 以下为单总线的介绍 时序结构 操作流程 本次需要使用的是SKIP ROM 跳过&#xff0c; CONVERT T温度变化&#xff0c;READ SCRATCHPAD…

IP对讲终端SV-6002 可以选配POE供电方式

18123651365微信 IP对讲终端SV-6002是一款采用了ARMDSP架构&#xff0c;接收网络音频流&#xff0c;实时解码播放&#xff1b;配置了麦克风输入和扬声器输出&#xff0c;作为网络数字广播的播放终端。主要用于银行、部门机构、酒店等场所的网络广播、网络对讲。 I…

华为PixArt-α:高质量、低成本的文生图模型,训练时长只有SD 1.5的10.8%

2024年3月11日由华为诺亚方舟实验室、大连理工大学和香港大学的研究团队共同开发的PixArt-Σ是一款能够直接生成4K分辨率图像的扩散变换模&#xff08;DiT&#xff09;。PixArt-Σ相比其前作PixArt-α&#xff0c;在图像质量和文本提示对齐方面有了显著提升&#xff0c;展示了从…

Mybatis-xml映射文件与动态SQL

xml映射文件 动态SQL <where><if test"name!null">name like concat(%,#{name},%)</if><if test"username!null">and username#{username}</if></where> <!-- collection&#xff1a;遍历的集合--> <!-- …

CoAP计算机协议,应用于物联网

什么是CoAP协议&#xff1f; CoAP&#xff08;Constrained Application Protocol&#xff0c;受限应用协议&#xff09;是一种专为物联网&#xff08;IoT&#xff09;设备和资源受限网络设计的应用层协议。它的诞生也是由于物联网设备大多都是资源限制型的&#xff0c;比如 CP…

HTML详细教程

文章目录 前言一、快速开发网站最简模板二、HTML标签1.编码2.title3.标题4.div和span5.超链接6.图片7.列表8.表格9.input系列10.下拉框11.多行文本 三、GET方式和POST方式1.GET请求2.POST请求 前言 HTML的全称为超文本标记语言&#xff0c;是一种标记语言&#xff0c;是网站开发…

Spring Boot(六十九):利用Alibaba Druid对数据库密码进行加密

1 Alibaba Druid简介 之前介绍过Alibaba Druid的,章节如下,这里就不介绍了: Spring Boot(六十六):集成Alibaba Druid 连接池 这章使用Alibaba Druid进行数据库密码加密,在上面的代码上进行修改,这章只介绍密码加密的步骤。 目前越来越严的安全等级要求,我们在做产品…

RuoYi-Vue开源项目2-前端登录验证码生成过程分析

前端登录验证码实现过程 生成过程分析 生成过程分析 验证码的生成过程简单概括为&#xff1a;前端登录页面加载时&#xff0c;向后端发送一个请求&#xff0c;返回验证码图片给前端页面展示 前端页面加载触发代码&#xff1a; import { getCodeImg } from "/api/login&q…

JavaWeb请求响应

目录 一请求响应 1.1请求响应概述&#xff1a; 1.2网页接口与发送 1.2.1简单参数传输 1.2.2实体参数 1.2.3数组集合参数 ​编辑1.2.4集合参数 1.2.5日期时间的参数 1.2.6Json参数 1.2.7路径参数 小结 1.3响应请求 二请求响应小demo 源码链接&#xff1a; 一请求响…

愈宠引领宠物大健康生态新时代——打造临床医养与新膳食营养的完美融合

愈宠(VetCurePet)创立于2023年&#xff0c;隶属于中创集宠(深圳)科技有限公司&#xff0c;是一家集研发、生产、销售为一体的综合型现代化企业。愈宠致力于打造宠物大健康生态系统&#xff0c;以临床医养新膳食营养自効愈宠健康&#xff0c;旗下产品涵盖宠物膳食食品烘焙处方粮…

蓝桥杯嵌入式2021年第十二届第二场省赛主观题解析

1 题目 2 解析 /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "adc.h" #include "tim.h" #include "gpio.h"/* Private includes ----------------------------…

sql join

-- 创建事实表 CREATE TABLE product_facts (id INT AUTO_INCREMENT PRIMARY KEY,product_name VARCHAR(255),price DECIMAL(10, 2) );-- 插入数据 INSERT INTO product_facts (product_name, price) VALUES (Product A, 100.00); INSERT INTO product_facts (product_name, pr…

【GPT-SOVITS-03】SOVITS 模块-生成模型解析

说明&#xff1a;该系列文章从本人知乎账号迁入&#xff0c;主要原因是知乎图片附件过于模糊。 知乎专栏地址&#xff1a; 语音生成专栏 系列文章地址&#xff1a; 【GPT-SOVITS-01】源码梳理 【GPT-SOVITS-02】GPT模块解析 【GPT-SOVITS-03】SOVITS 模块-生成模型解析 【G…

分布式搜索引擎(3)

1.数据聚合 **[聚合&#xff08;](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html)[aggregations](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html)[&#xff09;](https://www.ela…

旅游系统-软件与环境

一. 软件 1.Navicat、phpstudy、Idea、Vsode 参考 网盘链接 二.配置文件 1.NodeJS、JDK、Mysql 参考 网盘链接 注意点&#xff1a; 1.Mysql 切记需要环境变量配置 2.数据库密码要好记点的&#xff0c;别乱设 3.环境变量配置的路径要能找到 三.安装运行 1.下载网盘内的软件&am…

html系列:按钮被样式图片挡着了,无法点击怎么办

​ 背景 在开发中会遇到一些奇奇怪怪的需求&#xff0c;比如在按钮上要显示一个样式图片&#xff0c;同时还要能不影响按钮的点击使用&#xff1b;这时候&#xff0c;设置好了样式&#xff0c;按钮无法点击怎么办&#xff1f; 在查阅资料的时候找到了解决方案。 解决方案 …

kafka集群介绍

介绍 kafka是一个高性能、低延迟、分布式的消息传递系统&#xff0c;特点在于实时处理数据。集群由多个成员节点broker组成&#xff0c;每个节点都可以独立处理消息传递和存储任务。 路由策略 发布消息由key、value组成&#xff0c;真正的消息是value&#xff0c;key是标识路…

前端面试题01(css)

前端面试题01&#xff08;css&#xff09; 文章目录 前端面试题01&#xff08;css&#xff09;1、CSS选择器的优先级2、隐藏元素的方法有哪些3、px和rem的区别4、重绘和重排的区别5、水平垂直居中的方式6、CSS的那些属性可以继承7、预处理器 &#x1f389;写在最后 hello hello…