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

news/2024/10/30 8:56:57/

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.ppmy.cn/news/1543057.html

相关文章

基于uniapp微信小程序的校园二手书交易系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

Flume的安装配置

一、上传解压 tar -zxvf apache-flume-1.9.0-bin.tar.gz -C /usr/local/soft/#***在环境变量中增加如下命令&#xff0c;可以使用 soft 快速切换到 /usr/local/soft***alias softcd /usr/local/soft/ 二、配置环境变量 soft #重命名 mv apache-flume-1.9.0-bin/ flume-1.9.0…

用Python在Excel工作表中添加、修改及删除超链接

在创建Excel工作簿时&#xff0c;内部文档的互链、报告自动化生成或是创建外部资源快速访问路径是比较常见的需求。通过超链接&#xff0c;我们可以将工作表与外部资源、文件或网页无缝连接&#xff0c;提升数据的交互性和可读性。无论是为了快速导航、动态更新内容&#xff0c…

更强的可操作性!Midjourney两大重要功能更新!

​ 2024年10月24日&#xff0c;Midjourney在其官方渠道发布了令人振奋的更新&#xff0c;推出了三项全新功能&#xff0c;全面提升了用户的创作体验。这一升级无疑再次巩固了Midjourney在AI生成图像领域的领先地位。尤其是其中两个主要功能——外部图像编辑功能和图像重新纹理模…

UML外卖系统报告(包含具体需求分析)

1 系统背景 随着互联网技术的快速发展&#xff0c;外卖订餐服务逐渐成为人们生活中的一部分。传统的电话订餐方式面临诸多不便和限制&#xff0c;而基于互联网的外卖订餐系统则提供了更加便捷、快速和高效的订餐服务。这种系统通过将餐厅、顾客和配送人员连接起来&#xff0c;…

Django+Vue全栈开发项目入门(四)

前端和服务端进行接口交互是Web开发中的核心环节&#xff0c;它涉及数据的传输、处理和展示。 接口交互的基本概念 前端&#xff0c;即用户界面层&#xff0c;负责展示数据和接收用户输入&#xff1b;服务端&#xff08;或称为后端&#xff09;&#xff0c;即服务器层&#x…

DIY可视化-uniapp悬浮菜单支持拖动、吸附-代码生成器

在Uniapp中&#xff0c;悬浮菜单支持拖动和吸附功能&#xff0c;可以为用户带来更加灵活和便捷的操作体验。以下是对这两个功能的详细解释&#xff1a; 悬浮菜单支持拖动 提高用户体验&#xff1a;用户可以根据自己的需要&#xff0c;将悬浮菜单拖动到屏幕上的任意位置&#x…

Azure 将文本转换为语音

注意&#xff1a;只需要使用 speech 语音服务&#xff0c;不用Azure OpenAi 环境变量 setx SPEECH_KEY your-key setx SPEECH_REGION your-region 需要安装库 pip install azure-cognitiveservices-speech import os import azure.cognitiveservices.speech as speechsdk#…