推荐系统的基础_协同过滤(CF)

news2024/9/22 4:00:20

协同过滤(Collaborative Filtering)是一种推荐系统算法,它通过分析用户之间的相似性或者物品之间的相似性来预测用户可能感兴趣的物品。协同过滤算法主要有两种类型:

1. 用户基协同过滤(User-based Collaborative Filtering):
   这种方法通过找到与目标用户兴趣相似的其他用户,然后推荐这些相似用户喜欢的物品给目标用户。它依赖于用户之间的相似度计算,通常使用评分数据来确定用户之间的相似性。例如,如果用户A和用户B对多个物品的评分很相似,那么用户A喜欢的物品很可能也会被用户B喜欢。

2. 物品基协同过滤(Item-based Collaborative Filtering):
   这种方法通过分析用户对物品的评分,找出相似的物品,然后将这些相似物品推荐给用户。它依赖于物品之间的相似度计算,通常也是基于用户的评分数据。例如,如果物品X和物品Y经常被相似的用户评分,那么喜欢物品X的用户也可能会喜欢物品Y。

协同过滤算法的关键在于如何准确计算用户或物品之间的相似度。常用的相似度计算方法包括:

  • 皮尔逊相关系数(Pearson Correlation):衡量两个用户或物品评分向量之间的线性相关性。
  • 余弦相似度(Cosine Similarity):通过计算两个评分向量的夹角的余弦值来衡量相似度,对评分尺度不敏感。
  • 欧几里得距离(Euclidean Distance):衡量两个评分向量在多维空间中的直线距离。

一:用户基协同过滤

实现用户基协同过滤(User-Based Collaborative Filtering)的实例通常涉及以下步骤:

  1. 数据收集:收集用户对项目的评分数据。
  2. 用户相似度计算:计算用户之间的相似度,常用的方法有余弦相似度、皮尔逊相关系数等。
  3. 邻居选择:根据相似度选择与目标用户最相似的邻居用户。
  4. 推荐生成:根据邻居用户的评分预测目标用户对未评分项目的评分,并生成推荐列表。

为了展示这一过程,将使用一个简化的示例。假设我们有以下用户对电影的评分数据:

用户/电影电影1电影2电影3电影4
用户15432
用户24521
用户33354
用户42145

我们将计算用户之间的相似度,并选择与用户1最相似的邻居,然后预测用户1对电影4的评分。

import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

# 评分数据
ratings = np.array([
    [5, 4, 3, 2],
    [4, 5, 2, 1],
    [3, 3, 5, 4],
    [2, 1, 4, 5]
])

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

结果如下:

我们计算了用户之间的余弦相似度,得到了一个相似度矩阵。例如,用户1和用户2之间的相似度为0.963,用户1和用户3之间的相似度为0.886,依此类推。

接下来,我们将选择与用户1最相似的邻居用户,并使用这些邻居的评分来预测用户1对电影4的评分。为了简化,我们这里只选择一个最相似的邻居(用户2)。

预测用户1对电影4的评分的公式为:

预测评分 = 用户1的平均评分 + 相似度 × (用户2对电影4的评分 − 用户2的平均评分)

现在,我将计算用户1对电影4的预测评分。

# 计算用户平均评分
user_means = np.mean(ratings, axis=1)

# 用户1和用户2的相似度
similarity_user1_user2 = user_similarity[0, 1]

# 用户2对电影4的评分
rating_user2_movie4 = ratings[1, 3]

# 用户2的平均评分
mean_user2 = user_means[1]

# 用户1的平均评分
mean_user1 = user_means[0]

# 预测用户1对电影4的评分
predicted_rating_user1_movie4 = mean_user1 + similarity_user1_user2 * (rating_user2_movie4 - mean_user2)
predicted_rating_user1_movie4

根据计算,用户1对电影4的预测评分约为1.57。这意味着基于用户之间的相似度,我们预测用户1可能不会特别喜欢电影4,因为该评分低于用户1的平均评分。

二:物品基协同过滤

实现物品基协同过滤(Item-Based Collaborative Filtering)的实例通常涉及以下步骤:

  1. 数据收集:收集用户对项目的评分数据。
  2. 物品相似度计算:计算物品之间的相似度,常用的方法有余弦相似度、皮尔逊相关系数等。
  3. 邻居选择:根据相似度选择与目标物品最相似的邻居物品。
  4. 推荐生成:根据邻居物品的评分预测目标用户对未评分项目的评分,并生成推荐列表。

为了展示这一过程,我将仍然使用以上用户对电影的评分数据。同理可得:

import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

# 评分数据
ratings = np.array([
    [5, 4, 3, 2],
    [4, 5, 2, 1],
    [3, 3, 5, 4],
    [2, 1, 4, 5]
])

# 计算电影之间的余弦相似度
item_similarity = cosine_similarity(ratings.T)
item_similarity

结果如下:

我们计算了电影之间的余弦相似度,得到了一个相似度矩阵。例如,电影1和电影2之间的相似度为0.972,电影1和电影3之间的相似度为0.852,依此类推。

接下来,我们将选择与电影1最相似的邻居电影,并使用这些邻居的评分来预测用户1对电影4的评分。为了简化,我们这里只选择一个最相似的邻居(电影2)。

预测用户1对电影4的评分的公式为:

预测评分 = 用户1的平均评分 + 相似度 × (用户1对电影2的评分 − 电影2的平均评分)

现在,我将计算用户1对电影4的预测评分。

# 计算电影平均评分
item_means = np.mean(ratings, axis=0)

# 电影1和电影2的相似度
similarity_movie1_movie2 = item_similarity[0, 1]

# 用户1对电影2的评分
rating_user1_movie2 = ratings[0, 1]

# 电影2的平均评分
mean_movie2 = item_means[1]

# 用户1的平均评分
mean_user1 = np.mean(ratings[0, :])

# 预测用户1对电影4的评分
predicted_rating_user1_movie4 = mean_user1 + similarity_movie1_movie2 * (rating_user1_movie2 - mean_movie2)
predicted_rating_user1_movie4

根据计算,用户1对电影4的预测评分约为4.23。这意味着基于电影之间的相似度,我们预测用户1可能会比较喜欢电影4,因为该评分高于用户1的平均评分。

想要探索更多元化的数据分析视角,可以关注之前发布的相关内容。

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

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

相关文章

OceanMind海睿思“一种业务驱动数据治理的方法和系统”获国家发明专利!

近日,中新赛克海睿思最新技术:一种业务驱动数据治理的方法和系统(专利号ZL 202410567107.8),获得国家知识产权局的正式授权,并取得专利证书。 当前,现有的数据治理方法论和平台工具主要聚焦于数…

IDEA 常用插件推荐,美观又实用!

1、 TONGYl Lingma - Your Al Coding Assistant. Type less, Code more. 通义灵码,是一款基于通义大模型的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研发智能问答、异常报错排查等能力&…

JVM 调优篇2 jvm的内存结构以及堆栈参数设置与查看

一 jvm的内存模型 2.1 jvm内存模型概览 二 实操案例 2.1 设置和查看栈大小 1.代码 /*** 演示栈中的异常:StackOverflowError** author shkstart* create 2020 下午 9:08** 设置栈的大小: -Xss (-XX:ThreadStackSize)** -XX:PrintFlagsFinal*/ public class S…

【C++】C++ STL 探索:List使用与背后底层逻辑

C语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现 本文将通过模拟实现List,从多个角度深入…

第J3周:DenseNet算法实战与解析(pytorch版)

>- **🍨 本文为[🔗365天深度学习训练营]中的学习记录博客** >- **🍖 原作者:[K同学啊]** 📌 本周任务: ●1.请根据本文 Pytorch 代码,编写出相应的 TensorFlow 代码(建议使用…

《黑神话·悟空》背后的佛学义理探析

《黑神话悟空》不仅是一款备受期待的动作冒险游戏,其背后的深厚文化内涵,尤其是佛教义理的体现,更是吸引了不少玩家和佛学爱好者的关注。本文将通过对游戏剧情的解析,结合佛教思想,探讨《黑神话悟空》中所蕴含的哲学智…

冯·诺依曼体系结构

纯硬件的计算机结构应该就是输入设备——CPU——输出设备 冯诺依曼体系结构加入了存储器(内存) 因为数据是要在计算机体系结构中流动的,流动过程中对数据进行加工处理,数据从一个设备到另流动到另一个设备本质是一种数据拷贝。C…

HDFS常用命令及Python连接HDFS操作

目录 一、HDFS常用命令 二、Python连接HDFS操作 一、HDFS常用命令 HDFS(Hadoop Distributed File System,Hadoop分布式文件系统)是Hadoop集群中的一部分,用于存储大量数据,并运行在商用硬件集群上。以下是HDFS中常用…

6款好用到离谱的宝藏软件,每一款都超出你的认知

你的电脑里有没有那种,无论重装多少次系统,都要第一时间安装的软件? 请把它的名字打在评论区!本期分享6款,免费也能吊打付费的Windows电脑必装软件。 最大程度的增强Windows系统的功能,良心分享&#xff…

一文讲解多种GIS分析功能

GIS行业有很多分析功能,对于刚入行的新手有着足够的吸引力,其实有许多分析功能实现原理大差不差,比如模型压平,基于模型的淹没分析以及模型裁切。本文将以模型裁切为切入口进行介绍其中原理。 首先 (立方体剖切示意图…

只需一个类文件,Erupt 可以能完成整个后台管理?这个低代码值得一试

只需一个类文件,Erupt 竟然能搞定整个后台管理?这个低代码值得一试 在纷繁复杂的后端开发世界里,Erupt 就像是一剂强心针,用一个 .class 文件就能实现后台管理功能,简直让人感叹“开发也可以这么简单!”本文…

linux进程的概念和pid

进程的概念 进程是参与分配资源(cpu,内存)得实体,比如打开qq,浏览器就是打开了进程。 进程这么多,如何管理进程呢? 在linux下进程通过PCB(task_struct)来管理进程 ta…

足浴行业在线预约小程序源码系统+支持拼团功能 带完整的安装代码包以及搭建部署教程

系统概述 在快节奏的现代生活中,人们对健康养生的需求日益增长,足浴行业作为传统养生方式之一,其市场需求也随之不断扩大。为了满足消费者日益增长的便捷性需求,一款集在线预约、拼团优惠于一体的足浴行业小程序源码系统应运而生…

Vue/cli不同环境下打包后js文件没有添加hash值-会导致缓存问题-解决

环境变量 包文件判断是根据NODE_ENV=production,这时会对应打包加上hash值,所以在配置不同环境对应命令的时候,把NODE_ENV=production加上 全局的环境变量需要以VUE_APP_ 开头 process.env.VUE_APP_ENV 会读取不到值 .env 文件配置 NODE_ENV=production 才会按照hash模式去…

利用数据分析提升SEO排名的7种方法

我们都听过“大数据分析”这个词。科技让我们能够清晰地了解我们的活动和内容的表现——向我们提供了关于受众的宝贵信息,甚至可以精确到他们在Google和其他搜索引擎上使用的具体搜索词。 你已经在你的业务中使用数据分析了吗?如果是,你有利…

漏水监测报警摄像机

漏水监测报警摄像机 是一种智能设备,专门用于监测管道或设备的漏水情况,并能在检测到漏水时发出警报,帮助用户及时发现并处理水患。这种摄像机通常配备高清摄像头和敏感的水滴传感器,能够全天候地监测管道周围的情况。 当漏水摄像…

【ARM compiler】生成ELF文件中包含了那些内容

【更多软件使用问题请点击亿道电子官方网站】 文档目标:用于了解ARM compiler生成的ELF文件中存储的内容进行了解 问题场景:ELF文件主要用于通过调试软件对于代码的运行顺序和数据链接等内容进行分析。了解一下ARM compiler生成ELF文件包含那些内容。 软…

蓝牙--关于bta_av_main.cc文件的讲解

简单概要下: BTIF:提供bluedroid对外的接口 BTA:提供各种profile的实现 stack:协议实现与连接管理 上层在建立A2dp connect连接的时候,先调用到btif层的btif_av.cc中函数src_connect_sink,接着调用bta层bta_av_api.cc中函数BTA_AvOpen,经过内部state machine处理,最…

ROPS 自动化快速构造缓冲区溢出ROP链工具

项目地址:https://github.com/MartinxMax/ROPS ROPS 快速自动化构造ROP(Return-Oriented Programming)链的脚本,用于生成ROP攻击的有效载荷。 Usage $ ./rops.sh $ ./rops.sh /home/ayush/.binary/rop 该脚本将根据提供的二进制文件自动生…

【C语言数据结构】

一. 线性表 通俗的讲,线性表是具有相同特性的数据结构的集合 逻辑结构(人为想象出来的数据的组织形式):都是线性的 物理结构(数据在内存中的存储形式):不一定是线性的 二. 顺序表 顺序表是…