当前位置: 首页 > article >正文

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

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


http://www.kler.cn/a/272376.html

相关文章:

  • C# OpenCvSharp 部署文档矫正,包括文档扭曲/模糊/阴影等情况
  • 54,【4】BUUCTF WEB GYCTF2020Ezsqli
  • Pytorch使用教程(12)-如何进行并行训练?
  • 【华为路由/交换机的ftp文件操作】
  • LeetCode:2266. 统计打字方案数(DP Java)
  • jlatexmath-android如何实现自定义渲染字符
  • 合并两个有序链表
  • RabbitMQ命令行监控命令详解
  • Redis7学习记录(1)
  • 2024-3-17Go语言入门
  • macOS Ventura 13.6.5 (22G621) Boot ISO 原版可引导镜像下载
  • 通俗易懂的Python循环讲解
  • LeetCode Python - 59. 螺旋矩阵 II
  • 使用 GitHub Actions 通过 CI/CD 简化 Flutter 应用程序开发
  • 矩阵中移动的最大次数
  • 基于粒子群算法的分布式电源配电网重构优化matlab仿真
  • 谈谈IC、ASIC、SoC、MPU、MCU、CPU、GPU、DSP、FPGA、CPLD的简介
  • C语言自学笔记8----C语言Switch语句
  • Redis-复制功能
  • Spring web MVC(2)
  • 【STM32 定时器(二)TIM 输入捕获PWM 总结】
  • Redis-2 Redis基础数据类型与基本使用
  • 爱普生晶振发布RTC模块晶振(压电侠)
  • [Mac软件]Adobe Illustrator 2024 28.3 intel/M1/M2/M3矢量图制作软件
  • 【Canvas与艺术】砂落字现
  • LLM(大语言模型)——Springboot集成文心一言、讯飞星火、通义千问、智谱清言