Spring Boot + Vue的网上商城之基于用户的协同过滤的商品推荐实现

2023-11-17

Spring Boot + Vue的网上商城之基于协同过滤的商品推荐实现

协同过滤算法设计思路

  1. 构建用户-商品评分矩阵:将用户的购买行为和评价记录转化为一个用户-商品评分矩阵,矩阵中的每个元素表示用户对商品的评分。
  2. 计算用户之间的相似度:通过计算用户之间的相似度,找出与目标用户相似的其他用户。
  3. 预测目标用户对未购买商品的评分:根据相似用户的评分和相似度,预测目标用户对未购买商品的评分。
  4. 推荐商品给目标用户:根据预测评分,推荐评分高的商品给目标用户。

简介

当涉及到基于协同过滤的商品推荐系统时,可以使用以下图示来说明其工作原理:

用户评分数据             商品相似度矩阵         推荐结果
   |                          |                  |
   V                          V                  V
+---------+          +-----------------+    +----------------+
| User 1  |          |      Item 1     |    |    Product 1   |
|---------|          |-----------------|    |----------------|
| Item 1  |          |      Item 2     |    |    Product 2   |
| Rating  |          |-----------------|    |----------------|
|   5     |          |      Item 3     |    |    Product 3   |
|---------|          |-----------------|    |----------------|
| Item 2  |          |      Item 4     |    |    Product 4   |
| Rating  |          |-----------------|    |----------------|
|   4     |          |      Item 5     |    |    Product 5   |
|---------|          +-----------------+    +----------------+
| Item 3  |
| Rating  |
|   3     |
|---------|

在这个图示中,我们有一个用户评分数据表,其中包含了用户对不同商品的评分。每个用户和商品都有一个唯一的标识符。

接下来,我们使用这些评分数据来计算商品之间的相似度矩阵。相似度矩阵显示了不同商品之间的相似程度。在这个示例中,我们使用基于协同过滤的方法来计算相似度矩阵。

最后,我们可以使用相似度矩阵来为用户生成推荐结果。推荐结果是根据用户的评分数据和商品之间的相似度计算得出的。在这个示例中,我们展示了一些推荐结果,即推荐给用户的商品列表。

这个图示说明了基于协同过滤的商品推荐系统的工作原理。它涉及到用户评分数据、商品相似度矩阵和推荐结果之间的交互。希望这个图示能够帮助您更好地理解这个推荐系统!
在网上商城中,为用户提供个性化的商品推荐是提高用户购物体验和增加销售额的重要手段。基于协同过滤的商品推荐是一种常用的推荐算法,它通过分析用户的购买行为和评价记录,找出用户之间的相似性,并推荐给用户可能感兴趣的商品。

代码实现

好的,下面对代码进行详细解释:

首先,我们定义了一个名为RatingMatrix的类,用于存储用户对商品的评分信息。这个类包含了一个matrix字段,它是一个Map<Long, Map<Long, Float>>类型的变量,用于存储用户和商品的评分数据。其中,外层的Map的键是用户ID,值是一个内层的Map,内层的Map的键是商品ID,值是评分。

RatingMatrix类提供了以下几个方法:

  • addRating(Long userId, Long productId, Float rating):用于向评分矩阵中添加一条评分记录。
  • getRating(Long userId, Long productId):根据用户ID和商品ID,获取对应的评分。
  • getRatings(Long userId):根据用户ID,获取该用户对所有商品的评分。
  • getUserIds():获取所有用户的ID。
  • getProductIds():获取所有商品的ID。
@Component
public class RatingMatrix {

  private Map<Long, Map<Long, Float>> matrix;

  public RatingMatrix() {
    matrix = new HashMap<>();
  }

  public void addRating(Long userId, Long productId, Float rating) {
    if (!matrix.containsKey(userId)) {
      matrix.put(userId, new HashMap<>());
    }
    matrix.get(userId).put(productId, rating);
  }

  public Float getRating(Long userId, Long productId) {
    if (matrix.containsKey(userId)) {
      return matrix.get(userId).get(productId);
    }
    return null;
  }

  public Map<Long, Float> getRatings(Long userId) {
    if (matrix.containsKey(userId)) {
      return matrix.get(userId);
    }
    return new HashMap<>();
  }

  public Set<Long> getUserIds() {
    return matrix.keySet();
  }

  public Set<Long> getProductIds() {
    Set<Long> productIds = new HashSet<>();
    for (Map<Long, Float> ratings : matrix.values()) {
      productIds.addAll(ratings.keySet());
    }
    return productIds;
  }
}

接下来,我们定义了一个名为CollaborativeFiltering的协同过滤类,它接受一个RatingMatrix对象作为参数。这个类包含了一些用于计算相似度和预测评分的方法。
CollaborativeFiltering类的构造函数接受一个RatingMatrix对象,并将其保存在ratingMatrix字段中。

CollaborativeFiltering类提供了以下几个方法:

  • calculateSimilarity(Map<Long, Float> userRatings, Map<Long, Float> otherUserRatings):计算两个用户之间的相似度。这里使用的是余弦相似度。
  • calculatePredictedRating(Long userId, Long productId, Map<Long, Float> similarities):根据用户之间的相似度,预测目标用户对某个商品的评分。
  • getRecommendedProducts(Long userId):根据用户的评分记录,计算相似度,并推荐评分高的商品给目标用户。

getRecommendedProducts方法中,首先获取目标用户的评分记录和所有商品的ID。然后,计算目标用户与其他用户之间的相似度,并保存在similarities变量中。接下来,遍历所有商品,对于目标用户尚未评分的商品,计算预测评分,并将评分高于4.0的商品添加到推荐列表中。

最后,返回推荐列表。


public class CollaborativeFiltering {

  private RatingMatrix ratingMatrix;

  public CollaborativeFiltering(RatingMatrix ratingMatrix) {
    this.ratingMatrix = ratingMatrix;
  }

  private float calculateSimilarity(Map<Long, Float> userRatings, Map<Long, Float> otherUserRatings) {
    float numerator = 0;
    float denominator1 = 0;
    float denominator2 = 0;

    for (Map.Entry<Long, Float> entry : userRatings.entrySet()) {
      Long productId = entry.getKey();
      Float rating = entry.getValue();

      if (otherUserRatings.containsKey(productId)) {
        Float otherUserRating = otherUserRatings.get(productId);

        numerator += rating * otherUserRating;
        denominator1 += rating * rating;
        denominator2 += otherUserRating * otherUserRating;
      }
    }

    float similarity = numerator / (float) (Math.sqrt(denominator1) * Math.sqrt(denominator2));
    return similarity;
  }

  private float calculatePredictedRating(Long userId, Long productId, Map<Long, Float> similarities) {
    float numerator = 0;
    float denominator = 0;

    for (Map.Entry<Long, Float> entry : similarities.entrySet()) {
      Long otherUserId = entry.getKey();
      Float similarity = entry.getValue();

      Float rating = ratingMatrix.getRating(otherUserId, productId);

      if (rating != null) {
        numerator += similarity * rating;
        denominator += Math.abs(similarity);
      }
    }

    float predictedRating = numerator / denominator;
    return predictedRating;
  }

  public List<Long> getRecommendedProducts(Long userId) {
    Map<Long, Float> userRatings = ratingMatrix.getRatings(userId);
    Set<Long> productIds = ratingMatrix.getProductIds();

    Map<Long, Float> similarities = new HashMap<>();
    for (Long otherUserId : ratingMatrix.getUserIds()) {
      if (!otherUserId.equals(userId)) {
        Map<Long, Float> otherUserRatings = ratingMatrix.getRatings(otherUserId);
        float similarity = calculateSimilarity(userRatings, otherUserRatings);
        similarities.put(otherUserId, similarity);
      }
    }

    List<Long> recommendedProducts = new ArrayList<>();
    for (Long productId : productIds) {
      Float rating = ratingMatrix.getRating(userId, productId);
      if (rating == null) {
        float predictedRating = calculatePredictedRating(userId, productId, similarities);
        if (predictedRating >= 4.0) {
          recommendedProducts.add(productId);
        }
      }
    }

    return recommendedProducts;
  }
}

前端调用

在前端调用基于协同过滤的商品推荐算法时,可以通过以下步骤进行:

  1. 将用户的评分数据传递给后端。前端可以通过用户的行为记录或者用户的评价来获取用户对商品的评分数据。将这些评分数据发送给后端进行处理。

  2. 后端使用基于协同过滤的商品推荐算法来计算推荐结果。后端接收到前端传递的用户评分数据后,可以使用之前提到的RatingMatrixCollaborativeFiltering类来进行计算。首先,将前端传递的评分数据构建成一个RatingMatrix对象,并传递给CollaborativeFiltering类的构造函数。然后,调用getRecommendedProducts方法来获取推荐结果。

  3. 后端将推荐结果返回给前端。后端计算出推荐结果后,将结果返回给前端。可以使用JSON格式将推荐结果返回给前端,前端可以根据返回的结果展示给用户。

需要注意的是,前端和后端之间的数据传递方式可以根据具体情况进行选择,可以使用HTTP请求、WebSocket等方式进行数据传递。

以下是使用Vue框架实现前端调用基于协同过滤的商品推荐算法的示例代码:

<template>
  <div>
    <h1>商品推荐</h1>
    <ul>
      <li v-for="product in recommendedProducts" :key="product.id">
        {{ product.name }}
      </li>
    </ul>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      recommendedProducts: []
    };
  },
  created() {
    // 在组件创建时调用后端接口获取推荐结果
    this.getRecommendations();
  },
  methods: {
    getRecommendations() {
      // 向后端发送用户评分数据
      const ratings = {
        userId: 1,
        ratings: {
          1001: 5,
          1002: 4,
          1003: 3
        }
      };
      axios.post('/api/recommendations', ratings)
        .then(response => {
          this.recommendedProducts = response.data;
        })
        .catch(error => {
          console.error(error);
        });
    }
  }
};
</script>

在上面的代码中,我们使用Vue的单文件组件的形式来实现前端页面。在data中定义了一个recommendedProducts数组,用于保存推荐的商品列表。

created生命周期钩子中调用getRecommendations方法,该方法会向后端发送用户评分数据,并将返回的推荐结果保存在recommendedProducts中。

getRecommendations方法中,我们使用axios库发送POST请求到后端的/api/recommendations接口,传递用户评分数据。成功获取到推荐结果后,将结果赋值给recommendedProducts数组。

需要注意的是,上述代码中的后端接口路径和数据格式是示例,具体根据实际情况进行修改。

希望这段代码能帮助您理解如何在Vue中调用基于协同过滤的商品推荐算法!
总结起来,前端调用基于协同过滤的商品推荐算法的步骤包括传递用户评分数据给后端,后端进行计算并返回推荐结果给前端。具体实现方式可以根据项目需求和技术栈进行选择。

总结

基于协同过滤的商品推荐是一种常用的推荐算法,它通过分析用户的购买行为和评价记录,找出用户之间的相似性,并推荐给用户可能感兴趣的商品。本文介绍了基于协同过滤的商品推荐算法的设计思路,并提供了相关的代码示例。

希望本文对您理解基于协同过滤的商品推荐算法和实现有所帮助,谢谢阅读!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot + Vue的网上商城之基于用户的协同过滤的商品推荐实现 的相关文章

随机推荐

  • FISCO BCOS(五)———部署安装jdk1.8

    1 将下载的jdk1 8 0 162 linux x64 tar gz通过远程连接工具 放入 usr local 目录 然后解压 2 解压 tar zxvf jdk1 8 0 162 linux x64 tar gz 3 切换到jdk1 8
  • 闲聊——集成学习理论(Adaboost,随机森林理论与个人实战中的体会)

    本文通过简单的例子来引出算法本质 同时附上证明过程 目的是让感觉直接看证明推导很难的小伙伴们也能理解集成算法是怎样实现的 集成学习通过构建并结合多个学习器来完成学习任务 可获得比单一学习器更好的泛化性能 目前的集成学习方法大致可分为两类 第
  • 程序员常用十大算法之KMP算法

    程序员常用十大算法之KMP算法 一 应用场景 二 暴力匹配算法 2 1思路分析 2 2代码实现 三 算法介绍 四 KMP算法最佳应用 4 1字符串匹配问题 4 2思路分析图解 代码实现 本文是程序员常用十大算法的第一节 后面的算法总结都在博
  • JSON 驼峰转下划线

    import com fasterxml jackson databind PropertyNamingStrategy PropertyNamingStrategyBase public class MyCamemlToUnderline
  • MAC DOCKER无法ping通容器解决方案

    原因 解决方案 原因 先来看下LINUX的docker架构 docker是在linux内核容器基础上实现的 linux安装docker后 会创建一个为docker0的虚拟网卡 linux宿机与docker容器之间的通信 通过docker0虚
  • 高三计算机教案,2017高三信息技术教学计划

    信息技术是一门操作性和实践性强的课程 应注重培养学生的动手操作实践能力 提高学生的学习兴趣 达到学习的目的 下面是学习啦小编带来关于2017高三信息技术教学计划的内容 希望能让大家有所收获 2017高三信息技术教学计划 一 一 基本情况 1
  • violate关键字---java高并发

    内存模型相关概念 计算机在执行程序时 每条指令都是在CPU中执行的 而执行指令过程中 势必涉及到数据的读取和写入 由于程序运行过程中的临时数据是存放在主存 物理内存 当中的 这时就存在一个问题 由于CPU执行速度很快 而从内存读取数据和向内
  • origin账户申请&&安装使用——画图软件

    账户申请 参考https my originlab com forum topic asp TOPIC ID 22328 学生半年免费版官方网站申请链接 用学校提供的以edu cn结尾的邮箱进行注册 https www originlab
  • const的用法

    const是一个关键字 加在变量前 将其声明为常量 简单来说 就是不希望该变量的值发生改变 因此 它必须在声明该变量时就赋初值 const与指针 如果const加在 符号前面 如 const int p a 或 int const p a
  • PHP性能优化--OPCache

    文章目录 前言 OPcache 介绍 启用 配置项说明 opcache preload预加载文件示例 删除缓存 可视化界面opcache gui 总结 参考资料 前言 随着业务的发展 性能优化成为了不可避免的课题 优化后的业务承载能力可以是
  • sh 脚本异常:/bin/sh^M:bad interpreter: No such file or directory

    权限不够 chmod x examples mnist bb sh 在 Linux 中执行 sh 脚本 异常 bin sh M bad interpreter No such file or directory 这是不同系统编码格式引起的
  • Spring不同类型的注入方式,p-namespace,c-namespace

    spring官网代码示例 1 不同类型的注入方式
  • 数据结构系列——链表linklist

    本期主题 数据结构之 链表 往期链接 数据结构系列 先进先出队列queue 数据结构系列 栈 stack 目录 1 链表定义 2 代码实现链表 1 链表定义 定义 链表由多个结点组成 结点不仅包含值 还包含到下一个结点的信息 所以通过这种方
  • 优惠券秒杀(二)

    原创 L1296686146 冗谪 2023 07 27 18 30 发表于陕西 收录于合集 redis7个 库存超卖问题分析 库存超卖问题其本质就是多个线程操作共享数据产生的线程安全问题 即当一个线程在执行操作共享数据的多条代码的过程中
  • 基于信号量的生产者-消费者

    信号量是进化版的互斥锁 互斥锁只能供一个线程使用 信号量可以供多个线程使用 如果希望在多个线程之间对某对象的部分数据共享 互斥锁无法实现 只能将整个数据锁住 这样导致线程并发性下降 信号量既能保持同步 数据又不混乱 又能提高线程并发 主要函
  • Qt

    Qt 信号和槽之间的连接与使用 重载信号和槽的连接 测试环境 Qt Creator 5 14 2 MinGW 7 3 1 信号和槽 在Qt中 QObject是所有的Qt类的基类 如果想要自己实现一个C 类 并且还需要支持信号和槽 那么需要在
  • 用java计算输入工资计算税收_标准作业

    课后作业 第一章 理论 1 java环境搭建的步骤 2 java语言的简介 3 手写代码实现个人信息的输出 姓名 性别 年龄 家庭地址 爱好 座右铭 上机 分别使用记事本和myeclipse编写java程序实现求学经历的输出并写好每行代码的
  • 医学图像的CT值与像素值总结及转换代码

    目录 一 CT图像的调窗 1 Window width 2 Window level center 二 DICOM文件中窗宽窗位对应字段 三 CT值与像素值转换 线性映射 1 itk snap软件和sitk代码示例 2 Mango软件和ni
  • 协议定制 + Json序列化反序列化

    文章目录 协议定制 Json序列化反序列化 1 再谈 协议 1 1 结构化数据 1 2 序列化和反序列化 2 网络版计算器 2 1 服务端 2 2 协议定制 1 网络发送和读取的正确理解 2 协议定制的问题 2 3 客户端 2 4 代码 3
  • Spring Boot + Vue的网上商城之基于用户的协同过滤的商品推荐实现

    Spring Boot Vue的网上商城之基于协同过滤的商品推荐实现 协同过滤算法设计思路 构建用户 商品评分矩阵 将用户的购买行为和评价记录转化为一个用户 商品评分矩阵 矩阵中的每个元素表示用户对商品的评分 计算用户之间的相似度 通过计算