深入理解协同过滤算法及其实现

news2025/1/15 13:13:21

导语

        个性化推荐系统在现代数字时代扮演着重要的角色,协助用户发现他们可能感兴趣的信息、产品或媒体内容。协同过滤是个性化推荐系统中最流行和有效的算法之一。

目录

协同过滤算法的原理

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

用户相似性计算

余弦相似度

Demo

皮尔逊相关系数

Demo

近邻用户选择

相似性度量方法

用户邻居的选择

阈值过滤

个性化相似性权重

评分预测

基于项目的协同过滤(Item-Based Collaborative Filtering)

协同过滤的不同变种

数据预处理

python示例

用户-项目评分矩阵的创建

基于用户的协同过滤

基于项目的协同过滤

性能优化和扩展


协同过滤算法的原理

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

用户相似性计算

当计算用户之间的相似性时,通常使用余弦相似度和皮尔逊相关系数等度量方法

余弦相似度

余弦相似度是一种用于测量两个非零向量之间夹角的相似性度量。在协同过滤中,用户可以被视为向量,其中每个维度代表一个项目,值表示用户对该项目的评分。

余弦相似度的计算步骤如下:

  1. 计算两个用户向量的点积(内积)。
  2. 计算每个用户向量的范数(模)。
  3. 使用点积和范数的乘积来计算余弦相似度。

余弦相似度公式如下:

Demo

import numpy as np

# 两个用户的评分向量
user1_ratings = np.array([5, 4, 0, 0, 1])
user2_ratings = np.array([0, 0, 5, 4, 2])

# 计算余弦相似度
cosine_similarity = np.dot(user1_ratings, user2_ratings) / (np.linalg.norm(user1_ratings) * np.linalg.norm(user2_ratings))

print(f"余弦相似度: {cosine_similarity}")

皮尔逊相关系数

皮尔逊相关系数是一种用于衡量两个变量之间线性关系强度和方向的统计度量。在协同过滤中,它被用来度量用户评分之间的相关性。

皮尔逊相关系数的计算步骤如下:

  1. 计算两个用户评分向量的均值。
  2. 计算每个用户评分向量与均值的差异。
  3. 计算差异的皮尔逊相关系数。

皮尔逊相关系数的公式如下:

Demo

import numpy as np

# 两个用户的评分向量
user1_ratings = np.array([5, 4, 0, 0, 1])
user2_ratings = np.array([0, 0, 5, 4, 2])

# 计算均值
mean_user1 = np.mean(user1_ratings)
mean_user2 = np.mean(user2_ratings)

# 计算差异
diff_user1 = user1_ratings - mean_user1
diff_user2 = user2_ratings - mean_user2

# 计算皮尔逊相关系数
pearson_correlation = np.sum(diff_user1 * diff_user2) / (np.sqrt(np.sum(diff_user1**2)) * np.sqrt(np.sum(diff_user2**2)))

print(f"皮尔逊相关系数: {pearson_correlation}")

近邻用户选择

相似性度量方法

        在选择相似用户时,首先需要定义相似性度量方法。常用的相似性度量方法包括余弦相似度、皮尔逊相关系数、Jaccard相似度等。选择合适的相似性度量方法取决于数据的性质和问题的特点。余弦相似度通常用于评分数据,而Jaccard相似度通常用于二进制数据(用户是否喜欢或点击某个项目)。

用户邻居的选择

        一旦选择了相似性度量方法,接下来需要确定要选择多少个相似用户。通常,选择的相似用户数量由一个参数 k 控制,称为 "近邻数"。增加 k 可以提高覆盖范围,但可能降低准确性,因为更多的用户可能包括不太相似的用户。选择合适的 k 是一个权衡的问题,可以通过交叉验证等技术来确定。

阈值过滤

        除了基于 k 的选择,还可以使用阈值过滤来选择相似用户。例如,只选择与目标用户相似度大于某个阈值的用户。这种方法可以帮助过滤掉不太相似的用户,提高推荐的准确性。阈值的选择通常需要基于实际问题和数据进行调整。

个性化相似性权重

        在某些情况下,不同用户之间的相似性可能有不同的重要性。例如,某些用户可能与目标用户在特定领域或时间段内的行为更相关。因此,可以为每个相似用户分配个性化的相似性权重,以更好地反映他们的贡献。

评分预测

        首先,我们需要选择一组相似用户,这些用户与目标用户在过去的行为上相似。我们可以使用之前计算的相似性度量(如余弦相似度或皮尔逊相关系数)来衡量用户之间的相似性。

        一旦选择了相似用户,我们需要获取这些相似用户对于尚未评分的项目的历史评分数据。这些评分数据将用于预测目标用户的评分。

        接下来,我们使用相似用户的历史评分数据来计算目标用户对于尚未评分项目的预测评分。

可以使用加权平均法或者基于加权回归的方法:

        

注:以下各部分不再详细展开,可在入门基础情况下自行扩展

基于项目的协同过滤(Item-Based Collaborative Filtering)

  • 项目相似性计算:详细讨论如何计算项目之间的相似性,使用余弦相似度等度量。
  • 近邻项目选择:深入讨论如何为目标用户找到他们已评分项目的相似项目,以生成更精准的推荐。
  • 评分预测:解释如何基于这些相似项目的历史评分来生成最终的推荐。

协同过滤的不同变种

  • 基于隐式反馈的协同过滤:处理隐式反馈数据,如用户浏览历史和点击记录。
  • 深度学习中的协同过滤:使用深度学习模型来改进协同过滤的性能。
  • 时序协同过滤:考虑时间因素来预测用户行为和兴趣的演变。

数据预处理

  • 数据准备:准备用户-项目评分数据,通常以DataFrame的形式表示。
  • 数据清洗:处理缺失值、异常值和重复数据,以确保数据质量。
  • 数据分割:将数据集分为训练集、验证集和测试集,以进行模型训练和评估。

python示例

用户-项目评分矩阵的创建

import pandas as pd

# 创建用户-项目评分矩阵
ratings = pd.DataFrame({
    'User1': [5, 4, 0, 0, 1],
    'User2': [0, 0, 5, 4, 2],
    'User3': [4, 5, 0, 0, 0],
    'User4': [0, 0, 4, 5, 0]
}, index=['Item1', 'Item2', 'Item3', 'Item4', 'Item5'])

基于用户的协同过滤

from sklearn.metrics.pairwise import cosine_similarity

# 计算用户之间的相似性(余弦相似度)
user_similarity = cosine_similarity(ratings.fillna(0))

# 选择目标用户和要推荐的项目
target_user = 'User1'
target_item = 'Item3'

# 预测目标用户对目标项目的评分
target_user_ratings = ratings.loc[:, target_user]
similar_users = user_similarity[ratings.index == target_item]
predicted_rating = (similar_users @ target_user_ratings) / sum(similar_users[0])

print(f"预测用户{target_user}对项目{target_item}的评分为: {predicted_rating[0]}")

基于项目的协同过滤

# 预测目标用户对目标项目的评分
target_item_ratings = ratings.loc[target_item, :]
similar_items = item_similarity[ratings.columns == target_item]
predicted_rating = (similar_items @ target_item_ratings) / sum(similar_items[0])

print(f"预测用户{target_user}对项目{target_item}的评分为: {predicted_rating[0]}")

性能优化和扩展

        在示例基础上还可以在以下方向做出优化

  • 模型改进:改进协同过滤模型,包括使用加权评分、考虑时间因素等方法,以提高推荐质量。
  • 大规模数据处理:处理大规模数据集,包括分布式计算和分布式存储的使用,以处理海量用户和项目的评分数据。
  • 实时推荐:介绍如何将协同过滤算法应用于实时推荐系统,以满足用户的即时需求。

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

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

相关文章

ubuntu tensorrt 安装

官网,非常详细,比大部分博客写的都好,强烈推荐 具体的点进链接

Vue2项目练手——通用后台管理项目第五节

Vue2项目练手——通用后台管理项目 首页组件布局面包屑&tag面包屑使用组件使用vuex存储面包屑数据src/store/tab.jssrc/components/CommonAside.vuesrc/components/CommonHeader.vue tag使用组件文件目录CommonTag.vueMain.vuetabs.js 用户管理页新增功能使用的组件页面布局…

计算机图形学线性代数相关概念

Transformation(2D-Model) Scale(缩放) [ x ′ y ′ ] [ s 0 0 s ] [ x y ] (等比例缩放) \left[ \begin{matrix} x \\ y \end{matrix} \right] \left[ \begin{matrix} s & 0 \\ 0 & s \end{matrix} \right] \left[ \begin{matrix} x \\ y \en…

74天从构想到“首开式”,长沙建设全球研发中心城市跑出“加速度”

文 | 智能相对论 作者 | 胡静婕 为引鲲鹏入湘,长沙曾做到1天完成工商注册,10天完成土地审批流转,从项目筹建到一期厂房交付仅耗时120天。 “长沙速度”,让华为都感到惊讶,华为技术有限公司徐直军就曾表示&#xff1…

使用远程桌面软件改善工作与生活的平衡

在当今高度互联的世界中,我们的工作和个人生活之间的界限变得越来越模糊。在本文中,我们将探讨像 Splashtop 这样的远程桌面工具如何成为实现和谐工作与生活平衡不可或缺的一部分。 在当今的背景下理解工作与生活的平衡 工作与生活的平衡不仅仅是一个时…

C++、C#、JAVA 、 DELPHI、VB各个程序的优缺点你知道吗?

每种编程语言都有自己的优势和缺点,以下是对C、C#、Java、Delphi和VB的一些常见评价:C:优势:高性能、灵活性和可移植性强,适合对性能要求高的应用,可以进行系统级编程和嵌入式开发。缺点:语法复杂&#xff…

DRM全解析 —— CREATE_DUMB(3)

接前一篇文章:DRM全解析 —— CREATE_DUMB(2) 本文参考以下博文: DRM驱动(三)之CREATE_DUMB 特此致谢! 上一回讲解了drm_mode_create_dumb函数的前半部分,本回讲解余下的部分。 为…

函数的递归调用

1、什么是函数的递归调用? 其实说白了就是在函数的内部再调用函数自己本身 function fun(){fun() } 2、用递归解决问题的条件 (1)一个问题是可以分解成子问题,子问题的解决办法与最原始的问题解决方法相同 (2&…

【V4L2】V4L2框架简述

系列文章目录 【V4L2】V4L2框架简述 【V4L2】V4L2框架之驱动结构体 【V4L2】V4L2子设备 文章目录 系列文章目录V4L2框架简介V4L2框架蓝图蓝图解构层级解构 导读:V4L2 是专门为 linux 设备设计的一套视频框架,其主体框架在 linux 内核,可以理…

Nacos 开源版的使用测评

文章目录 一、Nacos的使用二、Nacos和Eureka在性能、功能、控制台体验、上下游生态和社区体验的对比:三、记使使用Nacos中容易犯的错误四、对Nacos开源提出的一些需求 一、Nacos的使用 这里配置mysql的连接方式,spring.datasource.platformmysql是老版本…

Python与STM32串口通讯

最近,苦于STM32与上位机Python的串口通讯,实在完成不了通讯,不知道到底是什么原因,STM32与上位机的串口调试软件是可以成功完成数据传输的,但用Python就不知道为啥不能完成通信,网上关于这方面的东西也不能…

Python Opencv实践 - 霍夫圆检测(Hough Circles)

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/steelpipes.jpg") print(img.shape) plt.imshow(img[:,:,::-1])#转为二值图 gray cv.cvtColor(img, cv.COLOR_BGR2GRAY) plt.imshow(gray, cmap plt.cm.gray…

iPhone 15预售:获取关键信息

既然苹果公司将于9月12日正式举办iPhone 15发布会,我们了解所有新机型只是时间问题。如果你是苹果的狂热粉丝,或者只是一个早期用户,那么活动结束后,你会想把所有的注意力都集中在iPhone 15的预购上——这样你就可以保证自己在发布日会有一款机型。 有很多理由对今年的iPh…

myspl使用指南

mysql数据库 使用命令行工具连接数据库 mysql -h -u 用户名 -p -u表示后面是用户名-p表示后面是密码-h表示后面是主机名,登录当前设备可省略。 如我们要登录本机用户名为root,密码为123456的账户: mysql -u root -p按回车,然后…

时序预测 | MATLAB实现TCN-BiGRU时间卷积双向门控循环单元时间序列预测

时序预测 | MATLAB实现TCN-BiGRU时间卷积双向门控循环单元时间序列预测 目录 时序预测 | MATLAB实现TCN-BiGRU时间卷积双向门控循环单元时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现TCN-BiGRU时间卷积双向门控循环单元时间序列预测&a…

“MyBatis中的关联关系配置与多表查询“

目录 引言一、一对多关系配置二、一对一关系配置三、多对多关系配置总结 引言 在数据库应用开发中,经常会遇到需要查询多个表之间的关联关系的情况。MyBatis是一个流行的Java持久层框架,它提供了灵活的配置方式来处理多表查询中的一对多、一对一和多对多…

浅谈视频汇聚平台EasyCVR中AI中台的应用功能

AI中台是将人工智能技术如深度学习、计算机视觉、知识图谱、自然语言理解等模块化,集约硬件的计算能力、算法的训练能力、模型的部署能力、基础业务的展现能力等人工智能能力,结合中台的数据资源,封装成整体中台系统。 在EasyCVR视频共享融合…

windows的redis配置sentinel

1、先安装好redis主从,参考我的文章,链接如下 redis主从(windows版本)_rediswindows版本_veminhe的博客-CSDN博客 2、然后配置sentinel 参考在windows上搭建redis集群(Redis-Sentinel) 配置时&#xf…

520页(17万字)集团大数据平台整体解决方案word

本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除,更多浏览公众号:智慧方案文库 1.1.1 系统总体逻辑结构 4-14系统总体逻辑结构图 参见上图,基于Hadoop构建的企业级数据仓库,包含…

文心一言全面开放,可能笑傲“AIGC”江湖?

8月31日凌晨,百度率先向全社会全面开放“文心一言”体验,所有用户可在AppStore或各大安卓应用市场下载“文心一言App或登录文心一言官网”体验。 这对早早关注人工智能领域的科技咖来说,是个好消息。 那么,AIGC、大模型、文心一…