掌握聚合最新动态了解行业最新趋势
API接口,开发服务,免费咨询服务

协同过滤算法介绍(基本原理、分类、优缺点、java/python代码)

在当今的信息爆炸时代,推荐系统已成为各类互联网平台(如电商、视频网站、社交平台等)提升用户体验和转化率的重要工具。而协同过滤(Collaborative Filtering)作为推荐系统中最经典、最广泛使用的算法之一,凭借其无需依赖物品特征、仅通过用户行为数据即可生成推荐的特点,被广泛应用。

本文将详细介绍协同过滤的基本原理、主要分类、优缺点,并结合 Java 与 Python 提供简单实现示例,帮助开发者快速理解并应用该算法。

一、协同过滤的基本原理

协同过滤的核心思想是“物以类聚,人以群分”。它通过分析用户的历史行为(如评分、点击、购买等),挖掘用户之间的相似性或物品之间的相似性,从而预测用户可能感兴趣的物品。

  1. 其基本流程如下:

构建用户-物品评分矩阵:记录每个用户对不同物品的评分;

计算用户或物品之间的相似度:使用余弦相似度、皮尔逊相关系数等方法;

预测未评分物品的评分:基于相似用户或物品的评分进行加权计算;

生成推荐列表:将预测评分高的未评分物品推荐给用户。

协同过滤不依赖物品的特征信息,仅通过用户行为即可生成推荐,因此被称为“基于行为”的推荐算法。

二、协同过滤的主要分类

根据建模对象的不同,协同过滤主要分为两类:

  1. 基于用户的协同过滤(User-Based Collaborative Filtering)

该方法通过计算用户之间的相似度,找出与目标用户兴趣相似的“邻居用户”,然后根据这些邻居对物品的评分,预测目标用户对未评分物品的兴趣程度。

优点:适合物品数量多、用户兴趣变化快的场景;

缺点:用户数量大时计算量大,冷启动问题严重。

  1. 基于物品的协同过滤(Item-Based Collaborative Filtering)

该方法通过计算物品之间的相似度,找出与目标物品相似的物品,然后根据用户对这些物品的评分,预测用户对目标物品的评分。

优点:物品相似度变化较慢,适合物品数量稳定的场景;

缺点:无法推荐用户完全未接触过的物品类别。

此外,还有基于模型的协同过滤(如矩阵分解、深度学习)、混合推荐系统(结合协同与内容推荐)等扩展形式,但这些超出了本文讨论范围。

三、协同过滤的优缺点分析

  1. 优点:

无需物品特征:仅需用户行为数据即可;

个性化推荐:根据用户历史行为生成推荐;

推荐效果好:在数据丰富时推荐准确率高;

易于实现:算法结构清晰,适合初学者理解和实现。

  1. 缺点:

冷启动问题:新用户或新物品缺乏行为数据,难以推荐;

稀疏性问题:用户-物品评分矩阵通常非常稀疏,影响推荐质量;

实时性差:需要定期更新相似度矩阵;

无法推荐新物品:尤其在基于物品的算法中,新物品没有评分,难以进入推荐系统。

四、Java 实现基于用户的协同过滤示例

以下是一个简单的基于用户的协同过滤 Java 实现:

import java.util.*;
public class UserBasedCF {
    // 用户-物品评分矩阵
    private Map<String, Map<String, Double>> userRatings = new HashMap<>();
    public void addRating(String user, String item, double rating) {
        userRatings.computeIfAbsent(user, k -> new HashMap<>()).put(item, rating);
    }
    // 计算两个用户之间的余弦相似度
    private double cosineSimilarity(String user1, String user2) {
        Map<String, Double> ratings1 = userRatings.get(user1);
        Map<String, Double> ratings2 = userRatings.get(user2);
        Set<String> commonItems = new HashSet<>(ratings1.keySet());
        commonItems.retainAll(ratings2.keySet());
        if (commonItems.isEmpty()) return 0;
        double dotProduct = 0, norm1 = 0, norm2 = 0;
        for (String item : commonItems) {
            double r1 = ratings1.get(item);
            double r2 = ratings2.get(item);
            dotProduct += r1 * r2;
            norm1 += Math.pow(r1, 2);
            norm2 += Math.pow(r2, 2);
        }
        return dotProduct / (Math.sqrt(norm1) * Math.sqrt(norm2));
    }
    // 预测评分
    public double predictRating(String targetUser, String item) {
        double total = 0, similaritySum = 0;
        for (String user : userRatings.keySet()) {
            if (user.equals(targetUser)) continue;
            if (!userRatings.get(user).containsKey(item)) continue;
            double sim = cosineSimilarity(targetUser, user);
            double rating = userRatings.get(user).get(item);
            total += sim * rating;
            similaritySum += Math.abs(sim);
        }
        return similaritySum == 0 ? 0 : total / similaritySum;
    }
    public static void main(String[] args) {
        UserBasedCF cf = new UserBasedCF();
        cf.addRating("A", "item1", 5);
        cf.addRating("A", "item2", 3);
        cf.addRating("B", "item1", 4);
        cf.addRating("B", "item3", 5);
        cf.addRating("C", "item2", 4);
        cf.addRating("C", "item3", 3);
        System.out.println("A 对 item3 的预测评分:" + cf.predictRating("A", "item3"));
    }

五、Python 实现基于物品的协同过滤示例

以下是一个基于物品的协同过滤 Python 实现:

import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
# 用户-物品评分矩阵(行是用户,列是物品)
ratings = np.array([    [5, 3, 0],
    [4, 0, 5],
    [0, 4, 3]
])
# 物品之间的相似度矩阵
item_similarity = cosine_similarity(ratings.T)
# 预测用户对物品的评分
def predict_ratings(ratings, similarity):
    return np.dot(ratings, similarity) / np.array([np.abs(similarity).sum(axis=1)])
# 预测评分
predicted_ratings = predict_ratings(ratings, item_similarity)
# 查看用户0对物品2的预测评分
print("用户0对物品2的预测评分:", predicted_ratings[0][2])

协同过滤算法介绍(基本原理、分类、优缺点、java/python代码)

协同过滤作为推荐系统中最基础、最经典的算法之一,凭借其基于用户行为、无需依赖物品特征的优势,在电商、视频平台、社交网络等多个领域得到了广泛应用。尽管它存在冷启动、稀疏性等问题,但其算法结构清晰、易于实现的特点,使其成为推荐系统入门和实战的首选。

声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com

  • 航班订票查询

    通过出发地、目的地、出发日期等信息查询航班信息。

    通过出发地、目的地、出发日期等信息查询航班信息。

  • 火车订票查询

    通过站到站查询火车班次时刻表等信息,同时已集成至聚合MCP Server。火车票订票MCP不仅能赋予你的Agent火车时刻查询,还能支持在线订票能力。

    通过站到站查询火车班次时刻表等信息,同时已集成至聚合MCP Server。火车票订票MCP不仅能赋予你的Agent火车时刻查询,还能支持在线订票能力。

  • 车辆过户信息查询

    通过车辆vin码查询车辆的过户次数等相关信息

    通过车辆vin码查询车辆的过户次数等相关信息

  • 银行卡五元素校验

    验证银行卡、身份证、姓名、手机号是否一致并返回账户类型

    验证银行卡、身份证、姓名、手机号是否一致并返回账户类型

  • 高风险人群查询

    查询个人是否存在高风险行为

    查询个人是否存在高风险行为

0512-88869195
数 据 驱 动 未 来
Data Drives The Future