协同过滤推荐算法

  协同过滤(Collaborative Filtering)是推荐系统中最经典的算法之一,其核心思想是 “物以类聚,人以群分”,即通过分析用户的历史行为数据,找到与目标用户相似的用户群体或相似的物品,从而为目标用户推荐他们可能感兴趣的物品。

一、基于用户的协同过滤(User-Based CF)

核心思想:找到与目标用户兴趣相似的其他用户(“邻居”),将这些邻居喜欢的物品推荐给目标用户。

步骤:
s1.计算用户相似度:通过用户的历史行为(如评分矩阵)计算用户之间的相似度。常用方法有,
  余弦相似度:将用户评分视为向量,计算向量夹角余弦值。
  皮尔逊相关系数:修正用户评分偏置(如严格评分 vs 宽松评分)。
s2.选择邻居用户:筛选出与目标用户最相似的 Top-K 个用户。
s3.生成推荐:根据邻居用户的加权评分(相似度作为权重),预测目标用户对未交互物品的兴趣,推荐得分最高的物品。
  举例:用户A和用户B都喜欢电影《星际穿越》和《盗梦空间》,用户B还喜欢《信条》,则可将《信条》推荐给用户A。

二、基于物品的协同过滤(Item-Based CF)

核心思想:找到与目标物品相似的其他物品,将用户喜欢物品的相似物品推荐给该用户。
步骤:
s1.计算物品相似度:基于用户对物品的历史行为(如共现次数或评分模式)计算物品之间的相似度。
  常用方法:调整余弦相似度(消除用户评分尺度影响)。
s2.生成推荐:根据用户已交互的物品,找出相似物品并预测评分,推荐得分最高的物品。
  举例:喜欢《哈利波特》的用户通常也喜欢《指环王》,则可将《指环王》推荐给喜欢《哈利波特》的用户。

三、协同过滤的关键问题与解决方式

数据稀疏性:用户-物品矩阵通常非常稀疏(大部分用户未交互大部分物品)。
解决方式:使用矩阵分解(如SVD、ALS)降维,或结合内容信息(混合推荐)。

冷启动问题:新用户或新物品缺乏历史数据。
解决方式:结合基于内容的推荐或利用社交网络信息。

相似度计算的效率:大规模数据下计算用户/物品相似度耗时。
解决方式:使用局部敏感哈希(LSH)或分布式计算(如Spark)。

四、协同过滤的优缺点

优点:
  无需领域知识,仅依赖用户行为数据。
  能够发现用户潜在的、非显式的兴趣(如“啤酒与尿布”关联)。

缺点:
  依赖高质量的历史数据,对稀疏数据敏感。
  难以处理冷启动问题。
  可解释性较弱(尤其是矩阵分解类方法)。

五、Python实现示例

import numpy as np# 示例用户-物品评分矩阵(行表示用户,列表示物品)
# 0表示未评分
ratings = np.array([[5, 3, 0, 1],[4, 0, 0, 1],[1, 1, 0, 5],[1, 0, 0, 4],[0, 1, 5, 4],
])def similarity(user1, user2):"""计算两个用户之间的余弦相似度"""# 找到两个用户都评分的物品both_rated = np.logical_and(ratings[user1] > 0, ratings[user2] > 0)if not np.any(both_rated):return 0# 提取共同评分的物品user1_common = ratings[user1, both_rated]user2_common = ratings[user2, both_rated]# 计算余弦相似度dot_product = np.dot(user1_common, user2_common)norm1 = np.linalg.norm(user1_common)norm2 = np.linalg.norm(user2_common)if norm1 == 0 or norm2 == 0:return 0return dot_product / (norm1 * norm2)def recommend_items(user_id, top_n=2):"""为指定用户推荐物品"""n_users, n_items = ratings.shape# 计算目标用户与其他用户的相似度similarities = [similarity(user_id, i) for i in range(n_users)]recommendations = {}# 遍历每个物品for item_id in range(n_items):# 如果目标用户已经对该物品评分,则跳过if ratings[user_id, item_id] > 0:continue# 计算加权评分和相似度总和weighted_sum = 0sim_sum = 0# 遍历每个用户for other_user_id in range(n_users):# 如果其他用户对该物品有评分if ratings[other_user_id, item_id] > 0:weighted_sum += similarities[other_user_id] * ratings[other_user_id, item_id]sim_sum += abs(similarities[other_user_id])# 计算预测评分if sim_sum > 0:predicted_rating = weighted_sum / sim_sumrecommendations[item_id] = predicted_rating# 返回评分最高的top_n个物品return sorted(recommendations.items(), key=lambda x: x[1], reverse=True)[:top_n]# 为用户0推荐物品
user_id = 0
recommended = recommend_items(user_id)print(f"为用户{user_id}推荐的物品:")
for item_id, score in recommended:print(f"物品{item_id},预测评分:{score:.2f}")

在这里插入图片描述

示例说明

  评分矩阵:使用一个二维数组表示用户对物品的评分,0 表示未评分。
  相似度计算:通过余弦相似度计算用户之间的相似性,只考虑两个用户都评分的物品。
  推荐计算:对于目标用户未评分的物品,基于相似用户的评分进行加权平均,预测目标用户可能的评分。
  结果展示:返回预测评分最高的物品作为推荐结果。

六、小结

  协同过滤因其简单高效,至今仍是推荐系统的基石技术之一,常与内容推荐、图神经网络其他方法结合使用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

免费一键自动化申请、续期、部署、监控所有 SSL/TLS 证书,ALLinSSL开源免费的 SSL 证书自动化管理平台

目录 一、前言二、ALLinSSL 简介亮点核心功能 三、操作步骤部署安装授权DNS服务商授权你的主机服务器自动化部署ssl测试自动申请ssl证书 一、前言 SSL证书是每个网站必备的,但是现在的免费的ssl证书有效期是3个月,以后CA/B Forum 调整 SSL 证书最长有效期…

KMP(Kotlin Multiplatform)改造(Android/iOS)老项目

一、背景说明 新建KMP项目的情况下,无论是界面,还是业务逻辑都可以正常运行。但大多数情况下,我们是在原有项目基础上逐步改造,就需要把KMP项目作为依赖添加到原有项目中,并且保证KMP项目、原Android/iOS项目都能正常…

Vue如何处理数据、v-HTML的使用及总结

Vue如何处理数据、v-HTML的使用及总结 Vue是如何处理数据的 这里我们先看一段代码 const app Vue.createApp({data() {return {courseGoalA: 学习Vue,最终掌握Vue,courseGoalB: 掌握Vue,并构建相应的应用程序,vueLink: https://cn.vuejs.org/};},methods: {outputGoal() {c…

Linux基本命令篇 —— alias命令

alias是Linux/Unix系统中一个非常实用的命令,用于创建命令的别名。它允许用户为常用命令或命令组合创建简短的替代名称,从而提高工作效率。 目录 一、基本语法 二、常用用法 1. 创建临时别名 2. 查看已定义的别名 3. 查看特定别名 4. 删除别名 三、…

Springboot开发常见注解一览

注解用法常用参数Configuration用于标记类为配置类,其中通过Bean方法定义Spring管理的组件。它替代XML配置,用Java代码声明对象创建逻辑,并确保单例等容器特性生效。相当于给Spring提供一个“制造说明书”来组装应用部件RestControllerRestCo…

obs直播通过Wireshark获取推流码

选择当前使用的网络 应用显示过滤器中输入:rtmpt , 并回车, 打开直播伴侣,并开启直播(无需任何操作,直接开启直播就行,其他设置可在obs中调试,直播画面) 打开Wireshark,滚动条拉到最…

单链表和双向链表

目录 目录 目录 一、链表种类 二、单链表概念 三、单链表实现 3.1 单链表创建结点 3.2 单链表销毁 3.3 单链表尾插 3.4 单链表尾删 3.5 单链表头插 3.6 单链表头删 3.7 单链表寻找值 3.8 单链表任意插(之前、之后) 3.9 单链表任意删&#…

A模块 系统与网络安全 第三门课 网络通信原理-3

今日目标 IP数据包格式IP地址解析网络层常见协议路由原理和配置路由器转发数据分析配置默认路由 1 IP数据包格式 1.1 网络层概述 位于OSI模型第三层作用 √定义网络设备的逻辑地址,俗称网络层地址(如P地址) √在不同的网段之间选择最佳数据…

笔记/计算机网络

Content 计算机网络部分核心概念十大网络协议一览 计算机网络部分核心概念 1. 什么是计算机网络?它最基本的功能是什么? 计算机网络是指通过某种传输介质将多台独立的计算机或设备连接起来,实现数据交换和资源共享的系统。其最基本的功能是数…

反射,枚举和lambda表达式

1. 反射 1. Java 的反射机制 Java 的反射机制是在运行状态,对于任意一个类,都能够直到它所有的属性和方法; 对于任意一个对象,都能调用它的方法和属性; 这种动态获取信息及调用对象方法的功能,称为Java…

关于 java:8. Java 内存模型与 JVM 基础

一、堆 Java 堆是 JVM 中所有线程共享的运行时内存区域,用于存放所有对象实例、数组以及类的实例字段值。 在 Java 中: String str new String("abc");new String("abc") 创建的对象就分配在堆中。 1.1 堆的特点 特性说明共享…

大语言模型 API 进阶指南:DeepSeek 与 Qwen 的深度应用与封装实践

在昨天小宁已经教大家怎么去获取各个平台的API-kEY,然后也带大家了解了最简单的大模型的调用,那么今天就带大家进阶了解一些更加详细的功能。 在大语言模型的实际应用中,除了基础的问答功能,深度思考能力、推理过程的获取以及灵活的对话模式…