秒懂算法 | 粗精迁移排序算法

简介: 迁移排序(transfer to rank, ToR)是一种简单有效的算法,包含浏览和评分两个阶段。它首先使用用户的浏览行为数据进行全局偏好学习,然后利用评分行为数据来进一步优化候选物品列表。ToR模型虽然在一定程度上模拟了用户的购物过程,但忽略了用户在购买选择上的差异,也就是说,某些用户虽然给物品打了高分,但他们不一定会购买该物品。为了解决此问题,粗精迁移排序(coarse-to-fine transfer to rank, CoFiToR)将用户购物过程进一步细分为三个阶段,即浏览阶段(E阶段)、评分阶段(S阶段)和购买阶段(P阶段)

640.jpg

迁移排序(transfer to rank, ToR)是一种简单有效的算法,包含浏览和评分两个阶段。它首先使用用户的浏览行为数据进行全局偏好学习,然后利用评分行为数据来进一步优化候选物品列表。ToR模型虽然在一定程度上模拟了用户的购物过程,但忽略了用户在购买选择上的差异,也就是说,某些用户虽然给物品打了高分,但他们不一定会购买该物品。为了解决此问题,粗精迁移排序(coarse-to-fine transfer to rank, CoFiToR)将用户购物过程进一步细分为三个阶段,即浏览阶段(E阶段)、评分阶段(S阶段)和购买阶段(P阶段),对应于三个具体问题:

(1)用户是否会浏览一个物品?

(2)用户浏览一个物品后,会给它评多少分?

(3)用户最终是否会购买该物品?

01、算法流程

CoFiToR的算法流程如算法1所示。它包含三个阶段,不同阶段之间通过候选物品列表来实现知识的共享和迁移。需要说明的是,CoFiToR的三个阶段是相对独立的,因此,每个阶段的模型可以根据实际需要进行更改,阶段的数量也可以灵活增减。

算法1 CoFiToR算法

640.png

02、代码实现

CoFiToR的算法代码采用Java语言编写,工具是JDK 1.8和代码编辑器Eclipse。它具有三个阶段,第一阶段采用加强版本的BPR算法,其中采样、对评分进行归一化和计算损失函数的代码如下:

public static void train() throws IOException
  {
    for (int iter = 0; iter < num_iterations; iter++) {
      for (int iter2 = 0; iter2 < num_train; iter2++) {
        // 随机采样一个(u,i,r_ui)三元组
        int idx = (int) Math.floor(Math.random() * num_train);
        int u = indexUserTrain[idx];
        int i = indexItemTrain[idx];
        float rating = indexRatingTrain[idx];
        
        // 对评分进行归一化
        float r_ui = 0f;
        if(rtype == 5){
          int loc = (int)rating;
          r_ui = rating_weight[loc];
        }
        else if(rtype == 10){
          int loc = (int)(rating*2);
          r_ui = rating_weight[loc];
        }

        // 获取训练集中用户u的评分记录
Map<Integer, Float> Item_Rating = TrainData.get(u);
        int j = i;
        while (true) {
          // 随机采样一个物品j
          j = (int) Math.floor(Math.random() * m) + 1;
          // 判断物品j是否是负样本
          if (ItemSetTrain.contains(j) && !Item_Rating.containsKey(j))
          {
            break;
          } else {
            continue;
          }
        }
        
        // 计算损失函数
        float r_uij = biasV[i] - biasV[j];
        for (int f = 0; f < d; f++) {
          r_uij += U[u][f] * (V[i][f] - V[j][f]);
        }
        float EXP_r_uij = (float) Math.pow(Math.E, r_uij);
        float loss_uij = -1f / (1f + EXP_r_uij);
      }
    }
  }

第二阶段采用PMF算法,其中采样和计算损失函数的代码如下:

public static void train()
  {
    for (int iter = 0; iter < num_iterations; iter++) {
      for (int iter_rand = 0; iter_rand < num_train_target; iter_rand++) {
        // 随机采样一个(u,i,r_ui)三元组
        int rand_case = (int) Math.floor(Math.random() * num_train_target);
        int userID = indexUserTrain[rand_case];
        int itemID = indexItemTrain[rand_case];
        float rating = ratingTrain[rand_case];
        
        // 计算预测公式和误差
        float pred = 0;
        float err = 0;
        for (int f = 0; f < d; f++) {
          pred += U[userID][f] * V[itemID][f];
        }
        pred += g_avg + biasU[userID] + biasV[itemID];
        err = rating - pred;
      }
    }
  }

第三阶段采用原始的BPR算法,可以参考第一阶段的代码实现。

目录
相关文章
|
边缘计算 算法 计算机视觉
寻求算法模型迁移技术协助
yolo模型(目标检测、关键点检测)向边缘计算装置(瑞芯微、比特大陆等平台)进行迁移量化时,做到精度损失最低、帧率保持最优。
|
3月前
|
机器学习/深度学习 算法 计算机视觉
【图像去噪】基于进化算法——自组织迁移算法(SOMA)的图像去噪研究(Matlab代码实现)
【图像去噪】基于进化算法——自组织迁移算法(SOMA)的图像去噪研究(Matlab代码实现)
101 0
|
4月前
|
存储 搜索推荐 算法
加密算法、排序算法、字符串处理及搜索算法详解
本文涵盖四大类核心技术知识。加密算法部分介绍了对称加密(如 AES)、非对称加密(如 RSA)、哈希摘要(如 SHA-2)、签名算法的特点及密码存储方案(加盐、BCrypt 等)。 排序算法部分分类讲解了比较排序(冒泡、选择、插入、归并、快排、堆排序)和非比较排序(计数、桶、基数排序)的时间复杂度、适用场景及实现思路,强调混合排序的工业应用。 字符串处理部分包括字符串反转的双指针法,及项目中用正则进行表单校验、网页爬取、日志处理的实例。 搜索算法部分详解了二分查找的实现(双指针与中间索引计算)和回溯算法的概念(递归 + 剪枝),以 N 皇后问题为例说明回溯应用。内容全面覆盖算法原理与实践
182 0
|
9月前
|
存储 搜索推荐 算法
算法系列之排序算法-堆排序
堆排序(Heap Sort)是一种基于堆数据结构的比较排序算法。它的时间复杂度为 $O(nlogn)$,并且是一种原地排序算法(即不需要额外的存储空间)。堆排序的核心思想是利用堆的性质来维护一个最大堆或最小堆,然后逐步将堆顶元素(最大值或最小值)取出,放到数组的末尾,最终得到一个有序的数组。
251 8
算法系列之排序算法-堆排序
|
8月前
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
算法 搜索推荐 测试技术
【调度算法】快速非支配排序算法
【调度算法】快速非支配排序算法
277 3
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
527 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
搜索推荐 算法
数据结构与算法学习十四:常用排序算法总结和对比
关于常用排序算法的总结和对比,包括稳定性、内排序、外排序、时间复杂度和空间复杂度等术语的解释。
163 0
数据结构与算法学习十四:常用排序算法总结和对比
|
机器学习/深度学习 搜索推荐 算法
探索数据结构:初入算法之经典排序算法
探索数据结构:初入算法之经典排序算法
114 0
|
算法 搜索推荐
支付宝商业化广告算法问题之基于pretrain—>finetune范式的知识迁移中,finetune阶段全参数训练与部分参数训练的效果如何比较
支付宝商业化广告算法问题之基于pretrain—>finetune范式的知识迁移中,finetune阶段全参数训练与部分参数训练的效果如何比较
151 0