协同过滤算法理解

article/2025/10/19 16:12:58

一、协同过滤思想介绍

  顾名思义,协同过滤算法的核心思想就是“物以类聚,人以群分”,通过用户对物品的评价和意见,将物品和人聚成几类,从各自的类中挑选出用户可能感兴趣的的物品进行推荐,而代替从直接从海量物品中筛选,缩小目标范围,简化计算。
在这里插入图片描述

二、协同过滤基本原理

  协同过滤最关键的一步是怎么将人或者是物品进行聚类,此时我们的一般做法是获取用户-物品的共现矩阵,其中用户跟物品发生的交互有可能是显示行为(比如有具体评分等),但大部分情况下我们拿到的都是隐式行为(比如是否浏览、点击等)

用户/物品i1i2i3
u111
u21
u31

  拿到共现矩阵之后我们就可以进行距离计算,我们可以计算用户间的距离,也可以计算物品之间的距离,这也就衍生出了两种不同的协同过滤方式。我们的目的是给用户推荐,也就没有和用户发生过交互行为的物品。

1.基于用户的协同过滤(Usercf)

基本步骤

  • Step1:计算用户间的相似度(共现矩阵中行与行)
  • Step2:选取TopN个相似用户
  • Step3:计算预测得分
  • Step4:选出TopK个物品进行推荐

  关于用户间的相似度计算方法有很多,这里重点列举几种常用的方法。
相似度计算方式

(1)杰卡德(Jacard)相似系数
  两个集合A和B交集元素的个数在A、B并集中所占的比例,称为这两个集合的杰卡德系数,用符号 J(A,B) 表示。杰卡德相似系数是衡量两个集合相似度的一种指标,jaccard值越大说明相似度越高。其取值范围为[0,1].
J ( A , B ) = ∣ A ∩ B ∣ ∣ A ∪ B ∣ J(A,B)=\frac{|A\cap B|}{|A \cup B|} J(A,B)=ABAB
  其缺点为引入分值,对所有物品一视同仁

(2) 余弦相似度
  余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度,夹角越小,证明余弦相似度越大,两个用户越相似,其取值范围为[-1,1]。
cos ⁡ θ = ∑ i = 1 n ( A i × B i ) ∑ i = 1 n ( A i ) 2 × ∑ i = 1 n ( B i ) 2 \cos \theta=\frac{\sum_{i=1}^n(A_i\times B_i)}{\sqrt{\sum_{i=1}^n(A_i)^2\times \sqrt{\sum_{i=1}^n(B_i)^2}}} cosθ=i=1n(Ai)2×i=1n(Bi)2 i=1n(Ai×Bi) = A T ⋅ B ∣ ∣ A ∣ ∣ × ∣ ∣ B ∣ ∣ =\frac{A^T\cdot B}{||A||\times ||B||} =A×BATB

  不过对于不同的物品,其所带来的影响也是不同的,比如:两个用户都对<新华字典>有过行为,但这并不能说明他们的兴趣是一样的,因为大多数人都买过这件商品。但如果用户都买过《java语言编程思想》,那么就可以认为他们的兴趣有很大的相似之处。换句话说,两个用户对冷门的物品采取过同样的行为更能说明他们兴趣的相似度。所以可以改进上述的公式(称为User-IIF):
cos ⁡ θ = ∑ i = 1 n ( A i × B i × 1 log ⁡ ( 1 + N i ) ) ∑ i = 1 n ( A i ) 2 × ∑ i = 1 n ( B i ) 2 \cos \theta=\frac{\sum_{i=1}^n(A_i\times B_i\times \frac{1}{\log (1+N_i)})}{\sqrt{\sum_{i=1}^n(A_i)^2\times \sqrt{\sum_{i=1}^n(B_i)^2}}} cosθ=i=1n(Ai)2×i=1n(Bi)2 i=1n(Ai×Bi×log(1+Ni)1)

  其中 N i N_i Ni为物品 i i i跟用户发生过交互的次数, N i N_i Ni越大,则对应 1 log ⁡ ( 1 + N i ) \frac{1}{\log (1+N_i)} log(1+Ni)1越小,对热门商品进行了惩罚,不过改进后的余弦相似度仍存在没有考虑用户间评分偏差性的问题。

(3)皮尔逊相关系数
  通过引入用户平均分减少用户评分对结果的影响
cos ⁡ θ = ∑ i = 1 n ( A i − A ˉ ) ( B i − B ˉ ) ∑ i = 1 n ( A i − A ˉ ) 2 × ∑ i = 1 n ( B i − B ˉ ) 2 \cos \theta=\frac{\sum_{i=1}^n(A_i-\bar A) (B_i-\bar B)}{\sqrt{\sum_{i=1}^n(A_i-\bar A)^2\times \sqrt{\sum_{i=1}^n(B_i-\bar B)^2}}} cosθ=i=1n(AiAˉ)2×i=1n(BiBˉ)2 i=1n(AiAˉ)(BiBˉ)
  其实对于不同的业务,不一定要以平均值为衡量标准,比如工资这种情况选择中位数或许更靠谱。

预测评分计算
  利用用户相似度和相似用户的评价加权平均获得用户的评价的预测值。
R u , p = ∑ s ∈ S ( W u , s ⋅ R s , p ) ∑ s ∈ S W u , s R_u,p=\frac{\sum_{s\in S}(W_{u,s}\cdot R_{s,p})}{\sum_{s\in S}W_{u,s}} Ru,p=sSWu,ssS(Wu,sRs,p)
  其中 S S S为TopN相似用户集合, W u , s W_{u,s} Wu,s是用户 u u u和用户 s s s的相似度, R s , p R_{s,p} Rs,p为用户 s s s对物品 p p p的评分。

  可以选择减去用户对物品的评分偏差更精确:
R u , p = ∑ s ∈ S ( W u , s ⋅ ( R s , p − R ˉ s ) ) ∑ s ∈ S W u , s R_u,p=\frac{\sum_{s\in S}(W_{u,s}\cdot (R_{s,p}-\bar R_{s}))}{\sum_{s\in S}W_{u,s}} Ru,p=sSWu,ssS(Wu,s(Rs,pRˉs))

Usercf的缺点

  • 在物品较多的情况下,每个user对应的向量可能极其稀疏,不同用户之间买的物品重叠性较低,导致算法无法找到一个用户的邻居,即偏好相似的用户。这导致UserCF不适用于那些正反馈获取较困难的应用场景*(如酒店预订, 大件商品购买等低频应用),通俗的说就是user在item里面并不能形成很好的联系。
  • 基于用户的协同过滤需要维护用户相似度矩阵以便快速的找出TopN相似用户, 该矩阵的存储开销非常大,存储空间随着用户数量的增加而增加,不适合用户数据量大的情况使用。因此很多平台初期都会采用Itemcf

2.基于物品的协同过滤(Itemcf)

基本步骤

  • Step1:计算物品和物品之间的相似性(共现矩阵中列与列)
  • Step2:获取用户最喜欢的TopK个物品列表(根据评分或者是浏览时长等)
  • Step3:计算预测评分
  • Step4:选取TopN个物品进行推荐

  其相似度计算方式与Usercf计算方法相同,这里就不赘述了。

预测评分计算
R u , p = ∑ h ∈ H ( W p , h ⋅ R u , h ) R_{u,p}=\sum_{h\in H}(W_{p,h}\cdot R_{u,h}) Ru,p=hH(Wp,hRu,h)
  其中 H H H为用户最喜欢TopK物品列表, W p , h W_{p,h} Wp,h是物品 p p p与物品 h h h的相似度, R u , h R_{u,h} Ru,h是用户 u u u对物品 h h h的已有评分

三、应用场景

  UserCF基于用户相似度进行推荐,具有更强的社交特性,适用于新闻推荐场景。因为新闻本身的兴趣点往往是分散的,相比用户对不同新闻的兴趣偏好,新闻的及时性、热点性更为重要,UserCF正适用于发现热点,以及跟踪热点的趋势

​  ItemCF适用于兴趣变化较为稳定的场景,比如电商场景,用户往往在一个时间段内寻找一类商品,或者是电视剧、电影这种推荐场景

四、存在问题

  协同过滤最严重的一个问题就是泛化能力较弱,具有很强的头部效应,容易跟大量物品产生相似, 而尾部物品由于特征向量稀疏, 导致很少被推荐。


http://chatgpt.dhexx.cn/article/QCy38agW.shtml

相关文章

协同过滤推荐算法的原理及实现

一、协同过滤算法的原理及实现 二、基于物品的协同过滤算法详解 一、协同过滤算法的原理及实现 协同过滤推荐算法是诞生最早&#xff0c;并且较为著名的推荐算法。主要的功能是预测和推荐。算法通过对用户历史行为数据的挖掘发现用户的偏好&#xff0c;基于不同的偏好对用户…

协同过滤算法详解

一、协同过滤算法简介 协同过滤算法是一种较为著名和常用的推荐算法&#xff0c;它基于对用户历史行为数据的挖掘发现用户的喜好偏向&#xff0c;并预测用户可能喜好的产品进行推荐。也就是常见的“猜你喜欢”&#xff0c;和“购买了该商品的人也喜欢”等功能。它的主要实现由…

协同过滤算法

目录 一、什么是协同过滤算法 二、相似度的计算 2.1杰卡德&#xff08;Jaccard&#xff09;相似度 2.2余弦相似度&#xff08;Cosine Similarity&#xff09; 2.3皮尔逊相关系数&#xff08;Pearson Correlation Coefficient&#xff09; 2.4欧氏距离&#xff08;Euclidea…

协同过滤推荐算法

一、协同过滤思想简介 二、协同过滤算法原理介绍 三、基于用户的协同过滤算法描述 四、基于物品的协同过滤算法 基于物品的协同过滤算法的优缺点 一、协同过滤思想简介 协同过滤&#xff0c;从字面上理解&#xff0c;包括协同和过滤两个操作。首先我们在外出和朋友吃饭的时候肯…

推荐系统之协同过滤算法

1、介绍 协同过滤算法&#xff08;Collaborative Filtering&#xff09; 是比较经典常用的推荐算法&#xff0c;从1992年一直延续至今。所谓协同过滤算法&#xff0c;基本思想是根据用户的历史行为数据的挖掘发现用户的兴趣爱好&#xff0c;基于不同的兴趣爱好对用户进行划分并…

oracle数据库中spool的作用,Oracle中Spool命令如何使用 Oracle中Spool命令使用方法

Oracle中Spool命令如何使用&#xff1f;本篇文章小编给大家分享一下Oracle中Spool命令使用方法&#xff0c;小编觉得挺不错的&#xff0c;现在分享给大家供大家参考&#xff0c;有需要的小伙伴们可以来看看。 方法/步骤 首先需要明白Spool是Oracle的命令而不是sql语句。 Spool命…

oracle的Spool命令

使用spool命令实行将sql*plus中的输出的结果复制到一个指定的文件中&#xff0c;或者把查询的结果 发送到打印机中&#xff0c;直接使用spool off命令为止。 spool命令的语法如下&#xff1a; spool [file_name [create|replace|append] off|out] 其中file_name指定一个操作…

Oracle数据导出spool用法详解

Oracle数据导出spool用法详解 spool可导出select查询的结果集以emp表为例spool命令参数 spool可导出select查询的结果集 在实际的工作中&#xff0c;很多时候我们需要将Oracle中查询的数据导出来&#xff0c;生成excel格式的表以便于处理。虽然plsql可以导数据&#xff0c;但是…

oracle spool命令

1.spool的作用是什么&#xff1f; spool的作用可以用一句话来描述&#xff1a;在sqlplus中用来保存或打印查询结果。 通过spool 命令&#xff0c;可以将select 数据库的内容写到文件中&#xff0c;通过在sqlplus设置一些参数&#xff0c;使得按指定方式写到文件中。 spool 是…

spool命令的使用

&#xff08;一&#xff09;SPOOL是sqlplus中的命令 转自&#xff1a;https://blog.csdn.net/wangnan537/article/details/20706555 可作如下用途&#xff1a; 1)可使用SPOOL保存查询的结果集 [sql] view plain copy SPOOL "C:\test.txt" --生成test.txt文件 ...…

spooling

SPOOLing的含义是什么&#xff1f;试述SPOOLing系统的特点、功能以及控制过程。答&#xff1a;SPOOLing是Simultaneous Peripheral Operation On-Line &#xff08;即外部设备联机并行操作&#xff09;的缩写 SPOOLING &#xff0c;它是关于慢速字符设备如何与计算机主机交换信…

SPOOLing技术

1&#xff0e;什么是SPOOLing 脱机输入、脱机输出技术。 该技术是利用专门的外围控制机&#xff0c;将低速I/O设备上的数据传送到高速磁盘上&#xff0c;或者相反。 引入了多道程序技术后&#xff0c;可以利用进程来模拟脱机输入时的外围控制机功能。这样&#xff0c;外围操作…

SoapUI接口测试-基本操作

SoapUI&#xff1a;http接口测试 GET请求&#xff1a; 1、打开SoapUI工具&#xff0c;点击左上角REST&#xff0c;新建一个REST项目。&#xff08;一般的http接口文档中会有声明此接口遵循RESTful API的设计规范&#xff09;&#xff0c;弹出的框中提示输入接口地址&#xff0c…

SoapUI-一款强大的Rest和Soap测试工具

文章目录 SoapUI-一款强大的Rest和Soap测试工具1.什么是SoapUI2.SoapUi基本使用-Http2.1 构建一个项目2.2 确定项目名2.3 创建测试用例以及用例组2.4 创建一个http请求的测试用例&#xff0c;这里我们用一个天气测试接口测试2.5 运行接口测试 3.SoapUi基本使用-Web Service3.1 …

接口测试工具--SoapUI下载安装教程

接口测试工具--SoapUI下载安装教程&#xff1a; 作为一个初学测试的小白&#xff0c;当然是从下载熟悉各种测试工具开始了&#xff0c;现在写一下SoapUI的下载安装过程&#xff0c;以便日后使用。 我是直接在松勤网的网站上找的下载资源&#xff1a;链接&#xff1a;ht…

SoapUI基本使用

SoapUI是用java开发的测试web service的工具。 SoapUI基本使用&#xff1a; 主要用其来查看web service提供的接口&#xff0c;以及返回的结果&#xff0c;以便进一步的利用&#xff0c;但是SoapUI的功能远不止这些&#xff0c;其可以对web service进行功能上和性能上的测试。…

soapui 自动化教程(四)

上一节介绍到了使用groovy实现接口自动化测试的基本功能。 本节将介绍groovy执行用例动态参数、参数回传、参数加密、soapui引入第三方jar包、生成随机参数&#xff08;绕过业务逻辑中的一些唯一校验阻碍自动化&#xff09;&#xff0c;以适应更真实、复杂的场景。 soapui引入…

soapUI 5.7.0使用

soapUI 5.7.0使用 公司有接口是webService的&#xff0c;用的是soap协议类型&#xff0c;这时候使用postman就不好使了&#xff0c;所以这边要使用SoapUI来进行测试&#xff0c;以下是SoapUI的使用流程首先&#xff0c;新建一个SOAP项目 将webService的地址填入其中&#xff0c…

soapui 自动化教程(二)

soapui 之 groovy 基础 本教程需要一些groovy基础&#xff0c;不会也没关系&#xff0c;会任意一门编程语言就能看懂代码。 上一节介绍了soapui如何创建测试用例&#xff0c;本节介绍groovy脚本如何执行测试用例。 新建一个script测试用例存放脚本 新增一个step&#xff…

使用SoapUI测试webservice接口详细步骤

如题所示&#xff0c;当我们写好webservice接口以后&#xff0c;在正式发布使用之前总是需要测试下接口是否好用&#xff0c;使用SoapUI这个软件可以很方便地对我们写的接口进行测试。下面我以SoapUI测试一个SOAP类型的接口来举例说明&#xff1a; &#xff08;1&#xff09;S…