一个基于更新频率和卡片等级、浏览量的动态推荐排序算法

需求背景

真实场景会更复杂一些,下面抽象出一个简单的示例来举栗子:
比如现在有一个卡片列表,卡片自身有卡片的创建时间卡片等级浏览量几个关键字段。
如果单纯的根据卡片等级去排序,那么很容易导致一些高等级的旧卡片一直霸榜;
按照创建时间去排的话,前面就容易出现一些粗制滥造的卡片;
所以单纯按照某一个字段去排序,效果都不会太好,没办法达成一个动态推荐的目的;
我们最直观的想法就是把这几个因素综合起来,给他们不同的权重,去达到一个综合的排序效果。

数据分析

简单来说,就是希望不同的等级有不同的权重,不同的创建时间有不同的权重,不同的浏览量亦如此,且这些"权重"最后是可以一起算出一个排序参数的。
举个例子,比如首先我们定义的卡片等级分为S A B C D E。
然后需要分析现有的数据分布和一个增长指数。
比如我们可以分析出以下几个指标:

  • 等级增长频率:S、A每年[80-200],每个季度平均有20±,每个季度至少有5个,过去的曲线是线性增长的,随着团队规模和业务比重的增大,预计趋势会保持且增长率会提升
    B每年400左右,每个季度平均有100,至少有40,且都是随着时间上升的
    得出结论,S、A的优质卡片和B的高品级卡片可以占据更大的推荐权重指数
    目前的页大小:60
    目前的浏览量:最多的是几百,平均几十

算法效果预期

  1. 首页都是高质量卡片(尽量都是S、A,最次为B,CDE尽量不出现在前几页)
  2. 前几页的卡片以一定的频率更新,等级越高的卡片,曝光周期和被顶替难度越大,相反则越小;这个顶替程度根据卡片等级的不同,也会有所不同,比如S和A的卡片量较少,所以理论情况下1-2个月内不会被其他等级的卡片更新所覆盖;B的卡片数量较多一些,2个月后逐步开始覆盖2月前的S、A;至于CDE则在B的基础上再顺推3个月左右才会有顶替的可能(除非半年多没有B级别以上的卡片入库,理论上不可能);
  3. 在这个过程中,排序也会受到卡片浏览量一定的影响,但是权重相对少一些,只有达到几百这个数量才会有明显的影响;由于页面上暂时没有展示浏览量的地方,一些特殊情况下可通过指定浏览量来达到个别卡片顺序灵活调整的目的,如置顶等;

算法参数拟定

综合卡片的等级占比、数量、更新频率和增长趋势,不建议采用固定日期的推荐方式,采用更灵活的属性权重方式来推荐卡片
以当前各等级的更新频率、数量、每页的卡片数以及预期达到的效果,初步拟定的指数排布对比表格如下:

统一备用基数示例日期基数周期指数等级步长推荐指数
S1001000276476
A10010010266476
B10010050216476
C100100164112476
D100100174102476
E10010018492476

另外,目前额外加入了浏览量作为一个权重较小的比较参数,根据目前的浏览量的量级和分布,取的模暂时定为20,体现的效果为,卡片等级相同、更新时间相近的两个卡片,浏览量较多的卡片排序可能会更靠前。

举个例子,若不考虑浏览量的话,上面的S级卡片发布后,再过184天,一个E级的卡片才能和它的推荐指数一样。
同理,S级卡片发布10天内,低等级的卡片是无法取代的,10天后,A级卡片就可以超过它。
先上代码,再说解析

代码

public Long getRecommendNum(Long lookNum) throws ParseException {
        SimpleDateFormat dateFormat = new SimpleDateFormat(DatePattern.NORM_DATE_PATTERN);
        Date startDate = dateFormat.parse("2021-10-01");
        if (publishTime == null || grade == null) {
            return 0L;
        }
        // 季度方式
        // int quarter = new BigDecimal(DateUtil.between(startDate, publishTime, DateUnit.DAY)).divide(new BigDecimal("91.25"), 0, RoundingMode.CEILING).intValue();
        // 自然天方式
        int afterDay = new BigDecimal(DateUtil.between(startDate, publishTime, DateUnit.DAY)).setScale(0, RoundingMode.CEILING).intValue();
        Integer gradeStep = GRADE_RECOMMEND_STEP_MAP.get(grade);
        long l1 = 100 + afterDay + gradeStep + lookNum / 20;
        return l1;
    }
public static LinkedHashMap<String, Integer> GRADE_RECOMMEND_STEP_MAP = new LinkedHashMap<String, Integer>(8) {
        {
            put(ASSETS_GRADE_S, 276);
            put(ASSETS_GRADE_A, 266);
            put(ASSETS_GRADE_B, 216);
            put(ASSETS_GRADE_C, 112);
            put(ASSETS_GRADE_D, 102);
            put(ASSETS_GRADE_E, 92);
        }
    };

总结

可以看到这个算法本身的逻辑并不难,它的难点在于如何分析出合理的参数,要基于当前系统的数据情况,未来业务的发展预期和想要达到的推荐效果,来得到算法的参数。

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

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

相关文章

Leetcode-17.04. 消失的数字

面试题 17.04. 消失的数字 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/missing-number-lcci/ 目录 面试题 17.04. 消失的数字 - 力扣&#xff08;LeetCode&#xff09; 题目 解题(注释) 第一种方法 第二种方法 第三种方法 题目 数组nums包含…

【GAMES 101】图形学入门——着色(Shading)

定义&#xff1a;将不同材质内容应用于不同物体对象上的过程。着色只考虑着色点的存在&#xff0c;不考虑其他物体的遮挡等&#xff0c;因此不考虑阴影处理 一些前期内容的定义&#xff1a; 着色点&#xff08;Shading Point&#xff09;观测方向&#xff08;Viewer Directio…

vue 脚手架 创建vue3项目

创建项目 命令&#xff1a;vue create vue-element-plus 选择配置模式&#xff1a;手动选择模式 (上下键回车) 选择配置&#xff08;上下键空格回车&#xff09; 选择代码规范、规则检查和格式化方式: 选择语法检查方式 lint on save (保存就检查) 代码文件中有代码不符合 l…

抄表自动化的实现与优势

1.界定与简述 抄表自动化是一种当代关键技术&#xff0c;致力于取代传统的手动式抄表方法&#xff0c;通过远程数据数据采集解决&#xff0c;完成电力工程、水、气等公用事业电力仪表的全自动载入。这一系统利用先进的感应器、物联网技术(IoT)设备及数据数据分析工具&#xff…

西圣全新磁吸无线充电宝强势上线:打开充电新方式,摆脱续航焦虑

在移动互联时代&#xff0c;智能手机、平板电脑等电子设备已经成为我们生活不可或缺的一部分。但随之而来的是电池续航问题的困扰&#xff0c;用户往往需要在户外、旅途或日常生活中频繁地充电。为了解决这一问题&#xff0c;充电宝作为便携式的移动充电设备&#xff0c;已经成…

leetCode61. 旋转链表

leetCode61. 旋转链表 题目思路&#xff1a;见如图所示 代码展示 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* Li…

触发器的启用和禁用

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 在 Oracle 数据库中&#xff0c;所创建的触发器可以根据情况&#xff0c;灵活修改它的状态&#xff0c;使其有效或者无效&#xff0c;即启用或者禁用。 其语法格式如下所示。…

Mac好用又好看的终端iTerm2 + oh-my-zsh

Mac好用又好看的终端iTerm2 1. iTerm2的下载安装2. oh-my-zsh的安装2.1 官网安装方式2.2 国内镜像源安装方式 3. oh-my-zsh配置3.1 存放主题的路径3.2 存放插件的路径3.3 配置文件路径 1. iTerm2的下载安装 官网下载&#xff1a; iTerm2 2. oh-my-zsh的安装 oh-my-zsh是一…

Spirng 当中 Bean的作用域

Spirng 当中 Bean的作用域 文章目录 Spirng 当中 Bean的作用域每博一文案1. Spring6 当中的 Bean的作用域1.2 singleton 默认1.3 prototype1.4 Spring 中的 bean 标签当中scope 属性其他的值说明1.5 自定义作用域&#xff0c;一个线程一个 Bean 2. 总结:3. 最后&#xff1a; 每…

使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B

2024年4月18日&#xff0c;meta开源了Llama 3大模型[1]&#xff0c;虽然只有8B[2]和70B[3]两个版本&#xff0c;但Llama 3表现出来的强大能力还是让AI大模型界为之震撼了一番&#xff0c;本人亲测Llama3-70B版本的推理能力十分接近于OpenAI的GPT-4[4]&#xff0c;何况还有一个4…

React的路由

1. 什么是前端路由 一个路径 path 对应一个组件 component 当我们在浏览器中访问一个 path 的时候&#xff0c;path 对应的组件会在页面中进行渲染 2. 创建路由开发环境 # 使用CRA创建项目 npm create-react-app react-router-pro# 安装最新的ReactRouter包 npm i react-ro…

人工智慧时代的引擎:揭开机器人核心零部件的奥秘

机器人核心零部件技术现状及趋势 工业机器人是我国制造业的“顶冠明珠”&#xff0c;在机器人核心零部件的研发制造上&#xff0c;我国在很多方面已经接近国际顶尖水平&#xff0c;但一些核心技术仍无法满足复杂高端领域应用需求&#xff0c;如精密减速器的传动精度与寿命间竞争…

「玻尔曾孙」领衔!超辐射原子,重塑全球精准测时——

超辐射原子能够帮助我们以前所未有的精度测量时间。在哥本哈根大学最近的一项研究中&#xff0c;研究人员开发了一种新的测量时间间隔&#xff08;秒&#xff09;的方法&#xff0c;这种方法克服了目前最先进原子钟面临的一些限制。 这一成就有望在多个领域产生深远影响&#x…

C语言进阶|双链表

✈链表的分类 链表的结构非常多样&#xff0c;以下情况组合起来就有8种&#xff08;2x22&#xff09;链表结构: 虽然有这么多的链表的结构&#xff0c;但是我们实际中最常用还是两种结构&#xff1a;单链表和双向带头循环链表 1.无头单向非循环链表&#xff1a;结构简单&…

[iOS]使用CocoaPods发布公开库

1.检查库名是否已被占用 选择库名时&#xff0c;尽量选择具有描述性并且独特的名字&#xff0c;这不仅可以避免命名冲突&#xff0c;还可以帮助用户更好地理解库的用途和功能。 在实际创建和发布 CocoaPods 库之前&#xff0c;确实应该检查库名是否已经被占用&#xff0c;以避…

文献速递:深度学习医学影像心脏疾病检测与诊断---利用深度学习进行动态心脏PET的自动帧间患者运动校正

Title 题目 Automatic Inter-frame Patient Motion Correction for Dynamic Cardiac PET Using Deep Learning 利用深度学习进行动态心脏PET的自动帧间患者运动校正 01 文献速递介绍 OSITRON正电子发射断层扫描&#xff08;PET&#xff09;心肌灌注成像已被证明相较于其他…

基于SkyEye运行Android——应用最为广泛的移动设备操作系统

01.Android简介 Android&#xff08;安卓&#xff09;是一种基于Linux内核&#xff08;不包含GNU组件&#xff09;的开源操作系统&#xff0c;最初由安迪鲁宾开发&#xff0c;主要支持手机。2005年8月由Google收购注资&#xff1b;2007年11月&#xff0c;Google与84家硬件制造…

SpringCloud项目打包的镜像下载成功后docker ps找不到

一、问题&#xff1a; 当我们项目打包发布成镜像时&#xff0c;在docker 下载运行镜像后&#xff0c;docker ps找不到下载的镜像 但是docker ps -a可以查看。打印日志docker logs 容器id 遇到错误信息 "no main manifest attribute, in app.jar"&#xff0c;这意味…

css div块标签内的多个英语单词怎样设置换行

背景&#xff1a; 在<div>标签内&#xff0c;当接口返回的字符串全是英文字母&#xff0c;不会自动换行。 原因&#xff1a;查过相关资料后才知道&#xff0c;只有英文文本才会出现不能自动换行的情况&#xff0c;&#xff08;中文不存在&#xff09;而原因是因为英文文本…
最新文章