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

1. 什么是协同过滤

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

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

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

2. 数据准备

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

用户/物品 物品1 物品2 物品3 物品4
用户A 5 3 0 1
用户B 4 0 0 1
用户C 1 1 0 5
用户D 0 0 5 4

在这个矩阵中,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 实现代码

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 实现代码

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 中实现协同过滤算法需要对用户评分数据进行处理,计算相似度,并生成推荐结果。通过上述示例,可以帮助你理解如何在实际项目中实现协同过滤推荐系统。

相关推荐
IT猿手3 小时前
基于强化学习的多算子差分进化路径规划算法QSMODE的机器人路径规划问题研究,提供MATLAB代码
算法·matlab·机器人
千逐-沐风3 小时前
SMU-ACM2026冬训周报3rd
算法
铉铉这波能秀3 小时前
LeetCode Hot100数据结构背景知识之元组(Tuple)Python2026新版
数据结构·python·算法·leetcode·元组·tuple
晚霞的不甘3 小时前
Flutter for OpenHarmony 实现计算几何:Graham Scan 凸包算法的可视化演示
人工智能·算法·flutter·架构·开源·音视频
㓗冽4 小时前
60题之内难题分析
开发语言·c++·算法
大江东去浪淘尽千古风流人物4 小时前
【VLN】VLN仿真与训练三要素 Dataset,Simulators,Benchmarks(2)
深度学习·算法·机器人·概率论·slam
铉铉这波能秀4 小时前
LeetCode Hot100数据结构背景知识之字典(Dictionary)Python2026新版
数据结构·python·算法·leetcode·字典·dictionary
蜡笔小马4 小时前
10.Boost.Geometry R-tree 空间索引详解
开发语言·c++·算法·r-tree
唐梓航-求职中4 小时前
编程-技术-算法-leetcode-288. 单词的唯一缩写
算法·leetcode·c#
仟濹5 小时前
【算法打卡day3 | 2026-02-08 周日 | 算法: BFS】3_卡码网99_计数孤岛_BFS | 4_卡码网100_最大岛屿的面积DFS
算法·深度优先·宽度优先