Java 实现协同过滤算法推荐算法

news2024/10/30 13:31:35

1. 什么是协同过滤

协同过滤主要分为两种类型:

  • 基于用户的协同过滤:根据用户之间的相似性推荐物品。例如,如果用户A和用户B的评分相似,那么用户A喜欢的物品也可能会被推荐给用户B。

  • 基于物品的协同过滤:根据物品之间的相似性进行推荐。如果用户对物品X给出了高评分,且物品Y与X相似,那么物品Y会被推荐给用户。

2. 数据准备

在实现协同过滤之前,我们需要准备一个用户-物品评分矩阵。以下是一个简单的示例:

用户/物品物品1物品2物品3物品4
用户A5301
用户B4001
用户C1105
用户D0054

在这个矩阵中,0表示用户没有评分。

3. 基于用户的协同过滤实现

以下是基于用户的协同过滤算法的简单实现:

3.1 计算相似度

我们将使用余弦相似度来计算用户之间的相似度。余弦相似度公式为:

cosine(A,B)=A⋅B∥A∥∥B∥\text{cosine}(A, B) = \frac{A \cdot B}{\|A\| \|B\|}cosine(A,B)=∥A∥∥B∥A⋅B​

3.2 Java 实现代码

import java.util.HashMap;
import java.util.Map;

public class CollaborativeFiltering {

    // 用户评分矩阵
    private static final Map<String, Map<String, Integer>> ratings = new HashMap<>();

    static {
        ratings.put("UserA", Map.of("Item1", 5, "Item2", 3, "Item4", 1));
        ratings.put("UserB", Map.of("Item1", 4, "Item4", 1));
        ratings.put("UserC", Map.of("Item2", 1, "Item4", 5));
        ratings.put("UserD", Map.of("Item3", 5, "Item4", 4));
    }

    // 计算余弦相似度
    private double cosineSimilarity(Map<String, Integer> ratings1, Map<String, Integer> ratings2) {
        double dotProduct = 0.0;
        double normA = 0.0;
        double normB = 0.0;

        for (String item : ratings1.keySet()) {
            if (ratings2.containsKey(item)) {
                dotProduct += ratings1.get(item) * ratings2.get(item);
            }
            normA += Math.pow(ratings1.get(item), 2);
        }

        for (double rating : ratings2.values()) {
            normB += Math.pow(rating, 2);
        }

        normA = Math.sqrt(normA);
        normB = Math.sqrt(normB);

        return (normA == 0 || normB == 0) ? 0 : dotProduct / (normA * normB);
    }

    // 为用户推荐物品
    public Map<String, Double> recommendItems(String user) {
        Map<String, Integer> userRatings = ratings.get(user);
        Map<String, Double> scoreMap = new HashMap<>();

        for (String otherUser : ratings.keySet()) {
            if (!otherUser.equals(user)) {
                double similarity = cosineSimilarity(userRatings, ratings.get(otherUser));

                for (String item : ratings.get(otherUser).keySet()) {
                    if (!userRatings.containsKey(item)) {
                        scoreMap.put(item, scoreMap.getOrDefault(item, 0.0) + similarity * ratings.get(otherUser).get(item));
                    }
                }
            }
        }

        return scoreMap;
    }

    public static void main(String[] args) {
        CollaborativeFiltering cf = new CollaborativeFiltering();
        Map<String, Double> recommendations = cf.recommendItems("UserA");

        System.out.println("推荐物品给 UserA: " + recommendations);
    }
}

代码解释

  1. 用户评分矩阵:使用嵌套的 Map 来存储用户对物品的评分。
  2. 余弦相似度计算:通过 cosineSimilarity 方法计算用户之间的相似度。
  3. 推荐物品:在 recommendItems 方法中,遍历所有用户,计算相似度并为目标用户推荐未评分的物品。

4. 基于物品的协同过滤实现

基于物品的协同过滤类似于用户的实现,但我们需要首先计算物品之间的相似度。

4.1 Java 实现代码

import java.util.HashMap;
import java.util.Map;

public class ItemBasedCollaborativeFiltering {

    private static final Map<String, Map<String, Integer>> ratings = new HashMap<>();

    static {
        ratings.put("UserA", Map.of("Item1", 5, "Item2", 3, "Item4", 1));
        ratings.put("UserB", Map.of("Item1", 4, "Item4", 1));
        ratings.put("UserC", Map.of("Item2", 1, "Item4", 5));
        ratings.put("UserD", Map.of("Item3", 5, "Item4", 4));
    }

    // 计算物品之间的余弦相似度
    private double cosineSimilarity(Map<String, Integer> item1, Map<String, Integer> item2) {
        // 与用户的计算相似
        // 省略相似度计算的具体实现
        return 0.0; // 这里应返回实际计算的相似度
    }

    // 为用户推荐物品
    public Map<String, Double> recommendItems(String user) {
        Map<String, Integer> userRatings = ratings.get(user);
        Map<String, Double> scoreMap = new HashMap<>();

        // 计算物品之间的相似度
        // 省略物品相似度计算和推荐逻辑的实现

        return scoreMap;
    }

    public static void main(String[] args) {
        ItemBasedCollaborativeFiltering ibcf = new ItemBasedCollaborativeFiltering();
        Map<String, Double> recommendations = ibcf.recommendItems("UserA");

        System.out.println("推荐物品给 UserA: " + recommendations);
    }
}

代码解释

  • 基于物品的实现逻辑与用户的类似,只是需要调整相似度计算的方式。
  • 具体实现中需要计算物品评分的相似度,并为用户推荐相似物品。

5. 结论

协同过滤算法是一种强大的推荐技术,能够根据用户的历史行为和评分为用户提供个性化的推荐。在 Java 中实现协同过滤算法需要对用户评分数据进行处理,计算相似度,并生成推荐结果。通过上述示例,可以帮助你理解如何在实际项目中实现协同过滤推荐系统。

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

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

相关文章

OpenCV视觉分析之目标跟踪(4)目标跟踪类TrackerDaSiamRPN的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::TrackerDaSiamRPN 是 OpenCV 中用于目标跟踪的一个类&#xff0c;它实现了 DaSiam RPN&#xff08;Deformable Siamese Region Proposal Net…

雷池社区版配置同步试用

雷池社区版配置同步试用 雷池社区版在 7.0.0 版本引入了多节点配置同步 使用步骤 1. 获取连接命令 在主节点点击成为主节点后&#xff0c;会出现一个地址&#xff0c;该地址用于从节点连接主节点&#xff0c;获取主节点的配置&#xff0c;所以要保障从节点能够连接到主节点…

【动手学电机驱动】 STM32-FOC(1)IHM03 电机控制套件的介绍

STM32-FOC&#xff08;1&#xff09;IHM03 电机控制套件的介绍 STM32-FOC&#xff08;2&#xff09;IHM03 电机控制套件的使用 【动手学电机驱动】 STM32-FOC&#xff08;1&#xff09;IHM03 电机控制套件的介绍 1. IHM03&#xff1a;基于 STM32 的电机控制套件1.1 X-NUCLEO-IH…

技术星河中的璀璨灯塔 —— 青云交的非凡成长之路

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

SpringBoot--入门、创建一个SpringBoot项目、测试

一、IDEA配置maven &#xff08;1&#xff09;下载maven maven下载地址&#xff1a;Maven – Download Apache Maven &#xff08;2&#xff09;解压 解压下载好的文件&#xff1a; 创建一个文件夹maven-repository用来充当本地仓库&#xff1a; &#xff08;3&#xff09;配…

无人机避障——使用三维PCD点云生成的2D栅格地图PGM做路径规划

着重介绍通过对三维 PCD 点云进行处理生成 2D 栅格地图 PGM&#xff0c;而后将该 PGM 地图充分运用到无人系统路径规划之中&#xff0c;使得无人机能够依据此规划合理避开飞行路线上可能出现的障碍物。&#xff08;解决如何使用PGM的问题&#xff09; Hybrid A*算法 参考博客…

Node.js:内置模块

Node.js&#xff1a;内置模块 Node.jsfs模块读取文件写入文件__dirname path模块路径拼接文件名解析 http模块创建服务 Node.js 传统的JavaScript是运行在浏览器的&#xff0c;浏览器就是其运行环境。 浏览器提供了JavaScript的API&#xff0c;以及解析JavaScript的解析引擎&a…

「漏洞复现」浪潮海岳 HCM Cloud download 任意文件读取漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

接雨水

接雨水 ​ 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,…

String的长度有限,而我对你的思念却无限延伸

公主请阅 1. 为什么学习string类&#xff1f;2. string类的常用接口2.1 string类对象的常见构造2.1.1 string 2.2 operator[]2.3 迭代器2.4 auto自动推导数据类型2.5 范围for2.6 迭代器第二层2.7 size和length获取字符串的长度2.8 max_size 获取这个字符串能设置的最大长度2.9 …

Docker Compose一键部署Spring Boot + Vue项目

目录 前提条件 概述 Compose简介 Compose文件 Compose环境 Compose命令 帮助命令 关键命令 Compose部署项目 初始化环境 查看代码文件 sql数据准备 nginx配置文件准备 创建 compose.yaml 一键启动compose多个容器 浏览器访问虚拟机ip:80(可省略默认的80端口) …

【python实操】python小程序之测试报告

引言 python小程序之测试报告 文章目录 引言一、测试报告1.1 概念1.1.1 使用Pytest和Allure生成测试报告1.1.2 使用unittest和HTMLTestRunner生成测试报告1.1.3 总结 1.2 题目1.3 代码1.3 代码解释 二、思考 一、测试报告 1.1 概念 python生成测试报告&#xff0c;常用的方法包…

「Mac畅玩鸿蒙与硬件10」鸿蒙开发环境配置篇10 - 项目实战:计数器应用

本篇将通过一个简单的计数器应用,带你体验鸿蒙开发环境的实际操作流程。本项目主要练习组件的使用、事件响应和状态管理,帮助开发者熟悉基本的应用构建流程。 关键词 计数器应用组件操作事件响应状态管理HarmonyOS 应用开发一、创建计数器项目 1.1 在 DevEco Studio 中新建项…

arcgis pro 3.3.1安装教程

一、获取方式&#xff1a; http://dt4.8tupian.net/2/29913a61b1500.pg3二、软件目录&#xff1a; 三、安装步骤&#xff1a; &#xff08;1&#xff09;安装软件运行环境windowsdesktop-runtime 8.0.4; &#xff08;2&#xff09;选中安装文件arcgispro_33zh_cn_190127.exe&…

线性代数(1)——线性方程组的几何意义

线性代数的基本问题是求解个未知数的个线性方程&#xff1b; 例如&#xff1a;&#xff08;方程1&#xff09;。 在线性代数的第一讲中&#xff0c;我们从Row Picture、Column Picture、Matrix Picture三个角度来看这个问题。 上面的系统是二维的。通过添加第三个变量&#…

【Linux】-常见指令(2)

接上一篇文章【Linux】-常见指令&#xff08;1&#xff09;-CSDN博客&#xff0c;继续介绍linux常用指令。 目录 一、man指令 &#xff1a;查看信息 1、作用 2、手册 二、cp指令&#xff1a;拷贝 1、作用 2、拷贝到同级目录 三、mv指令&#xff1a;剪切 1、作用 2、使用…

[论文阅读]SimCSE: Simple Contrastive Learning of Sentence Embeddings

SimCSE&#xff1a;句子嵌入的简单对比学习 SimCSE: Simple Contrastive Learning of Sentence Embeddings http://arxiv.org/abs/2104.08821 EMNLP 2021 文章介绍了SimCSE&#xff0c;这是一种简单的对比学习框架&#xff0c;采用了自监督来提升模型的句子表示能力 而自监…

(蓝桥杯C/C++)——常用库函数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、 二分查找 1.二分查找的前提 2.binary_ search函数 3.lower_bound和upper_bound 二、排序 1.sort概念 2.sort的用法 3.自定义比较函数 三、全排列 1.next p…

【优先算法】双指针

✨✨欢迎大家来到Celia的博客✨✨ &#x1f389;&#x1f389;创作不易&#xff0c;请点赞关注&#xff0c;多多支持哦&#x1f389;&#x1f389; 所属专栏&#xff1a;优先算法 个人主页&#xff1a;Celias blog~ 目录 ​​​​​​移动零 复写零 快乐数 盛水最多的容器 …

认知战认知作战:认知战驱动引导青年情绪接纳思潮

认知战认知作战&#xff1a;认知战驱动引导青年情绪接纳思潮 认知战认知作战&#xff1a;认知战驱动引导青年情绪接纳思潮 关键词&#xff1a;认知作战,新质生产力,人类命运共同体,认知战,认知域,认知战研究中心,认知战争,认知战战术,认知战战略,认知域作战研究,认知作战,认知…