传统推荐模型——协同过滤

article/2025/10/30 9:35:42

文章目录

    • UserCF:基于用户的协同过滤
      • 什么是CF
      • 用户相似度计算
      • 最终结果的排序
    • ItemCF:基于物品的协同过滤
    • UserCF和ItemCF的适用场景
    • CF存在的几个缺点
    • 代码实践
      • 数据集
      • Python代码


协同过滤,Collaborative Filtering,CF,可以说是业界影响力最大、应用最广泛的模型,作为曾经推荐系统的首选模型,协同过滤基于系统中其他用户的评分或行为进行预测和推荐,分为基于用户的协同过滤和基于物品的协同过滤两种算法。

UserCF:基于用户的协同过滤

什么是CF

顾名思义,“协同过滤”就是协同大家的反馈、评价和意见一起对海量的信息进行过滤,从中筛选出目标用户可能感兴趣的信息的推荐过程。

这里用一个商品推荐的例子说明一下

在这里插入图片描述

此推荐过程大致可以分为6步:

1、一共有4件商品:电视、杂志、书、游戏机

2、历史上,用户 A , B , C , D , X A,B,C,D,X A,B,C,D,X已经对商品有过一些访问的记录,并且留下了好评和差评的标记(对应绿色和红色)。现在需要利用用户 X X X对商品的历史评价、其他用户对商品的历史评价,预测是否把电视机推荐给用户 X X X

3、为便于计算,将用户和商品放到矩阵里(称为“共现矩阵”),并将好评设为1,差评设为-1,未评价设为0(如果有具体评分,如1-5星,可以将评分作为矩阵的元素值)

4、现在对于是否推荐电视机的问题转换为图中?的数值是多少。既然是协同过滤,所以应当考虑与用户 X X X兴趣最相似的 n n n个用户,然后综合这 n n n个用户对电视机的评价,得到对于 X X X和电视机交互的预测。(Top n n n用户问题, n n n是一个超参数)

5、假设选定 n = 2 n=2 n=2,可以看出,用户 B B B和用户 C C C X X X最相似,所以被选为Top 2用户

6、因为用户 B B B和用户 C C C对电视机都是负面评价,所以预测 X X X对于电视机的评价也是负面,所以不会向用户 X X X推荐电视机

以上是简化的利用CF推荐的流程,其中的“用户相似”和“最终结果排序”的计算是不严谨的,这两部分如何计算将会直接影响推荐的结果。

用户相似度计算

两个用户的相似度,也就是在共现矩阵里,计算两个用户对应向量的相似度,常用方法有以下几种:

1、余弦相似度
sim ⁡ ( i , j ) = cos ⁡ ( i , j ) = i ⋅ j ∥ i ∥ ⋅ ∥ j ∥ \operatorname{sim}(i, j)=\cos (i, j)=\frac{\boldsymbol{i} \cdot \boldsymbol{j}}{\|\boldsymbol{i}\| \cdot\|\boldsymbol{j}\|} sim(i,j)=cos(i,j)=ijij
用户 i i i j j j的向量夹角越小,余弦相似度越大,两个用户越相似

2、皮尔逊相关系数
sim ⁡ ( i , j ) = ∑ p ϵ P ( R i , p − R ˉ i ) ( R j , p − R ˉ j ) ∑ p ϵ P ( R i , p − R ˉ i ) 2 ∑ p ϵ P ( R j , p − R ˉ j ) 2 \operatorname{sim}(i, j)=\frac{\sum_{\mathrm{p} \epsilon P}\left(R_{\mathrm{i}, \mathrm{p}}-\bar{R}_{\mathrm{i}}\right)\left(R_{\mathrm{j}, \mathrm{p}}-\bar{R}_{\mathrm{j}}\right)}{\sqrt{\sum_{\mathrm{p} \epsilon P}\left(R_{\mathrm{i}, \mathrm{p}}-\bar{R}_{\mathrm{i}}\right)^{2}} \sqrt{\sum_{\mathrm{p} \epsilon P}\left(R_{\mathrm{j}, \mathrm{p}}-\bar{R}_{\mathrm{j}}\right)^{2}}} sim(i,j)=pϵP(Ri,pRˉi)2 pϵP(Rj,pRˉj)2 pϵP(Ri,pRˉi)(Rj,pRˉj)
其中, P P P代表所有item的集合, R i , p R_{i,p} Ri,p代表用户 i i i对物品 p p p的评分, R ˉ i \bar{R}_{\mathrm{i}} Rˉi代表用户 i i i对所有物品的平均评分。

可以看出,加入了用户的平均分,减少了用户评分偏置的影响。

3、基于皮尔逊相关系数,将用户平均分 R ˉ i \bar{R}_{\mathrm{i}} Rˉi改成物品平均分 R ˉ p \bar{R}_{\mathrm{p}} Rˉp,减少物品评分偏置的影响
sim ⁡ ( i , j ) = ∑ p ϵ P ( R i , p − R p ‾ ) ( R j , p − R p ‾ ) ∑ p ϵ P ( R i , p − R p ‾ ) 2 ∑ p ϵ P ( R j , p − R p ‾ ) 2 \operatorname{sim}(i, j)=\frac{\sum_{\mathrm{p} \epsilon P}\left(R_{\mathrm{i}, \mathrm{p}}-\overline{R_{\mathrm{p}}}\right)\left(R_{\mathrm{j}, \mathrm{p}}-\overline{R_{\mathrm{p}}}\right)}{\sqrt{\sum_{\mathrm{p} \epsilon P}\left(R_{\mathrm{i}, \mathrm{p}}-\overline{R_{\mathrm{p}}}\right)^{2}} \sqrt{\sum_{\mathrm{p} \epsilon P}\left(R_{\mathrm{j}, \mathrm{p}}-\overline{R_{\mathrm{p}}}\right)^{2}}} sim(i,j)=pϵP(Ri,pRp)2 pϵP(Rj,pRp)2 pϵP(Ri,pRp)(Rj,pRp)
理论上,任何合理的“向量相似度定义方式”都可以作为相似用户计算的标准。研究人员通过对相似度定义的改进来不断解决传统的CF存在的一些缺陷的。

最终结果的排序

在获得Top n相似用户之后,最常用的是利用用户相似度和相似用户的评价的加权平均获得最终的预测
R u , p = ∑ s ϵ S ( w u , s ⋅ R s , p ) ∑ s ϵ S w u , s (4) R_{\mathrm{u}, \mathrm{p}}=\frac{\sum_{\mathrm{s} \epsilon S}\left(w_{\mathrm{u}, \mathrm{s}} \cdot R_{\mathrm{s}, \mathrm{p}}\right)}{\sum_{\mathrm{s} \epsilon S} w_{\mathrm{u}, \mathrm{s}}} \tag{4} Ru,p=sϵSwu,ssϵS(wu,sRs,p)(4)
其中, 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的评分。

(4)式一次可以预测用户 U U U对物品p的评分,在预测完所有物品之后,根据评分进行排序,即可得到推荐的列表。

基于用户相似度的推荐,有一个大的前提,认为“兴趣相似的朋友喜欢的物品,我也喜欢”,但从技术的角度,它也存在一些缺点:

  • 在互联网应用的场景下,用户数往往远大于物品数,用户相似度矩阵的存储开销非常大,并且是以 n 2 n^2 n2的复杂度快速增长的。
  • 用户的历史数据往往非常稀疏,对于只有几次购买或者点击行为的用户来说,找到相似用户的准确度是非常低的,这导致 UserCF 不适用于那些正反馈获取较困难的应用场景(如酒店预定、大件商品购买等低频应用)

ItemCF:基于物品的协同过滤

为避免上面提到的两个问题,常常采用ItemCF算法实现推荐系统。思想和UserCF很相似,简单来说就是如果用户A同时购买了商品1和商品2,那么说明商品1和商品2的相关度较高。当用户B也购买了商品1时,可以推断他也有购买商品2的需求。

预测对用户 X X X推荐 Top  k \text { Top } k  Top k物品

1、基于历史数据,构建用户和物品的 m × n m\times n m×n共现矩阵

2、计算每个物品向量之间的相似度,构建 n × n n\times n n×n维的物品相似度矩阵

3、获得用户 X X X历史行为数据中的正反馈物品列表

4、利用物品相似度矩阵,针对正反馈物品列表,找出相似的 Top  k \text { Top } k  Top k 物品

5、对 Top  k \text { Top } k  Top k 物品,利用相似度的分值进行排序,生成最终的推荐列表

对第4、5步骤举个例子,用户已经购买过商品4、5,预测推荐商品A,B,C中的哪一个。利用物品相似度矩阵,(可以利用商品4、5的评分进行加权排序),得到最终相似度评分(最下面一行)。

​ 在第5步中,如果一个物品和多个的正反馈物品相似,那么该物品最终相似度应该是多个相似度的累加:
R u , p = ∑ h ϵ H ( w p , h ⋅ R u , h ) R_{\mathrm{u}, \mathrm{p}}=\sum_{\mathrm{h} \epsilon H}\left(w_{\mathrm{p}, \mathrm{h}} \cdot R_{\mathrm{u}, \mathrm{h}}\right) Ru,p=hϵH(wp,hRu,h)
其中, H H H是目标用户的正反馈物品集合。

UserCF和ItemCF的适用场景

UsercF 的最大特点是即使某个兴趣点以前不在自己的兴趣范围内,也有可能通过朋友的动态快速更新自己的推荐列表。这样的特点使其非常适用于新闻推荐场景。相比用户对不同新闻的兴趣偏好,新闻的及时性、热点性往往是其更重要的属性,而 UsercF 正适用于发现热点,以及跟踪热点的趋势。除此之外,在社交网络中 UserCF 也是一个更好的选择,可以增加用户对推荐解释的信服程度。

​ ItemCF 适用于购物网站、视频推荐等场景。原因之一是兴趣变化较为稳定,用户在一个时间段内更倾向于寻找一类商品,这时利用物品相似度为其推荐相关物品更合适;另一个原因是用户的数量远远超过物品的数量,其物品的数据相对稳定,因此计算物品的相似度时不但计算量较小,而且不必频繁更新。

CF存在的几个缺点

(1)系统开始时推荐质量较差

(2)质量取决于历史数据集

(3)数据稀疏性问题(Sparsity)

(4)系统延伸性问题(Scalability)

(5)用户提供恶意评价对系统带来的偏差

代码实践

数据集

使用ml-100k电影评分数据集中的u.data
在这里插入图片描述

四列分别对应用户id,电影id,评分, 时间戳

总共包含943位用户,1682部电影,100000个评分,评分1—5,每个用户至少20部

Python代码

导入处理数据集

import numpy as np
import pandas as pd# 读取u.data文件
header = ['user_id', 'item_id', 'rating', 'timestamp']
df = pd.read_csv('./ml-100k/ml-100k/u.data', sep='\t', names=header)

在这里插入图片描述

分割训练集、测试集

from sklearn.model_selection import train_test_split
train_data, test_data = train_test_split(df, test_size=0.2)

创建uesr-item矩阵

# 计算唯一用户和电影的数量(去掉重复)
n_users = df.user_id.unique().shape[0]
n_items = df.item_id.unique().shape[0]
print('Number of users = ' + str(n_users) + ' | Number of movies = ' + str(n_items))# 创建n_users × n_items维矩阵
train_data_matrix = np.zeros((n_users, n_items))
for line in train_data.itertuples():train_data_matrix[line[1] - 1, line[2] - 1] = line[3]
test_data_matrix = np.zeros((n_users, n_items))
for line in test_data.itertuples():test_data_matrix[line[1] - 1, line[2] - 1] = line[3]

在这里插入图片描述

通过 pairwise_distances求相似度(余弦相似度)

# 计算相似度
# 使用sklearn的pairwise_distances函数来计算余弦相似性
from sklearn.metrics.pairwise import pairwise_distances
# 计算用户相似度
user_similarity = pairwise_distances(train_data_matrix, metric='cosine')
# 计算物品相似度
item_similarity = pairwise_distances(train_data_matrix.T, metric='cosine')

用户相似度矩阵:

商品相似度矩阵:

在这里插入图片描述

预测(基于用户和商品)

# ------------------------预测--------------------------------
def predict(ratings, similarity, type='user'):# 基于用户相似度矩阵的if type == 'user':# 求每一行(user)的平均值mean_user_rating = ratings.mean(axis=1)ratings_diff = (ratings - mean_user_rating[:, np.newaxis]) # np.newaxis自动补充维度pred = mean_user_rating[:, np.newaxis] + similarity.dot(ratings_diff) / np.array([np.abs(similarity).sum(axis=1)]).T# 基于物品相似度矩阵elif type == 'item':pred = ratings.dot(similarity) / np.array([np.abs(similarity).sum(axis=1)])return pred# 预测结果
user_prediction = predict(train_data_matrix, user_similarity, type='user')
item_prediction = predict(train_data_matrix, item_similarity, type='item')

mean_user_rating:user向量的平均值

image-20210723153141343

ratings_diff:U-I矩阵减去每个user的平均值

在这里插入图片描述

pred:预测结果
在这里插入图片描述

评价结果

image-20210723154431559

协同过滤 - 简书

王喆《深度学习推荐系统》
协同过滤算法原理分析


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

相关文章

协同过滤

协同过滤 什么是协同过滤 协同过滤推荐(Collaborative Filtering recommendation)是在信息过滤和信息系 统中正迅速成为一项很受欢迎的技术。与传统的基于内容过滤直接分析内容进行 推荐不同,协同过滤分析用户兴趣,在用户群中找…

协同过滤(Collaborative Filtering)

协同过滤,顾名思义就是协同大家的反馈、评价和意见一起对海量的信息进行过滤,从中筛选出目标用户可能感兴趣的信息的推荐过程。 协同过滤是推荐系统的重要模型之一,推荐系统是用来向用户推荐物品的。协同过滤分为两种: 1.基于用…

数字签名的简单理解

数字签名的简单化理解TOC 数字签名的简单化理解! 对于数字签名,网上有很多大神解释的很详细了,我在这里解释的方法更加通俗易懂,更适用于入门级理解,已经尽可能的浅显,希望可以对大家有用! 评…

浅谈程序的数字签名

理论基础 数字签名它是基于非对称密钥加密技术与数字摘要算法技术的应用,它是一个包含电子文件信息以及发送者身份,并能够鉴别发送者身份以及发送信息是否被篡改的一段数字串。 一段数字签名数字串,它包含电子文件经过Hash编码后产生的数字…

数字签名及应用

内容介绍 常用加密方式数字签名颁发数字证书机构CA 常用加密方式 对称加密 对称加密也称为密钥加密或单向加密,就是使用同一套密钥来进行加密和解密。 常用算法:DES、3DES、AES 优点:算法公开、简单,加密解密容易,加密…

数字签名的过程详解

数字签名的过程详解 1. 数字证书的概念2. 数字签名的过程3. 加密的过程4. 数字签名两大特性5. 用到的部分名词解释 1. 数字证书的概念 数字证书又叫“数字身份证”、“网络身份证”,是由证书认证中心CA发放并经认证中心数字签名,包含公开密钥拥有者以及…

数字签名是什么?

今天,我读到一篇好文章。 它用图片通俗易懂地解释了,"数字签名"(digital signature)和"数字证书"(digital certificate)到底是什么。 我对这些问题的理解,一直是模模糊糊…

数字签名技术及加密算法

最近由于需要使用数字签名,于是了解一下各种算法的利弊及实现 数字签名流程图: ---------BASE64----------- 常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。 BASE加密后产生的字节…

数字签名系列一:签名简介与RSA签名算法

数字签名系列一 写在前面数字签名作用数字签名发展史带属性的数字签名RSA数字签名方案 写在前面 学了一年的数字签名方案,一直都在一个点进行专研,虽然还是有所收获,总感觉还差点感觉,上了一年研究生,还没有对数字签名…

密码学---数字签名和认证协议---数字签名标准

数字签名标准 DSS的基本方式RSA签名过程DSS签名过程 数字签名算法DSA全局公钥用户私钥x用户公钥y用户为待签消息选取的秘密数k签名过程验证过程 数字签名标准(Digital Signature Standard,DSS)是美国公布的联邦信息处理标准,采用SHA和一种新的签名技术的…

数字签名与签名验证过程

1.1 生成数字签名 1 利用RSA算法生成公钥、私钥。私钥由密钥持有者自主保存,公钥可对外发布。 2 准备好待签名的文档。 3 利用哈希算法(HASH),生成待签名文档的摘要。(文档摘要) 4 利用签名者的私钥&am…

什么是数字签名?其安全性从何而来?

一、数字签名简介 数字签名是基于公钥密码体制(非对称密钥密码体制)的。 1.1.基本特征 数字签名必须保证以下三点: 报文鉴别——接收者能够核实发送者对报文的签名;报文的完整性——接收者不能伪造对报文的签名或更改报文内容。…

数字签名的工作原理

数字签名是公钥基础结构的基础部分。当我们说PKI时,一般想到的是数字证书,证书颁发机构(CA),银行使用的Key,以及SSL通信等等。 数字证书,一般都是成对存在的,包含证书的公钥,和证书…

网络安全之数据加密和数字签名技术

一、计算机网络面临的安全性威胁和解决办法 1、计算机网络上的通信面临以下两大类威胁:被动攻击和主动攻击,如下图所示: 2、解决办法,由上图可知: 对于主动攻击,可以采取适当措施加以检测。 对于被动攻击…

一文了解数字签名、数字证书、自签证书

参考 关于自签SSL证书的一些小知识汇总 对于ssl中的pem文件和key 文件的理解 openssl 生成证书 ca.pem client.pem server.pem SSL:证书文件 数字证书原理 数字签名是什么? 数字签名和数字证书的原理解读(图文) 数字签名和数字证书有哪些区别与联…

数字签名算法实现

一、实验目的   掌握利用Hash算法对要传送信息提取消息摘要的方法,理解数字签名的作用及数字签名算法的工作原理,了解多种非对称加密算法都可以用来设计数字签名算法。综合运用前面实验掌握的知识和技术,利用C语言或Java语言设计并实现数字…

数字签名——

数字签名和公钥加密的区别 公钥加密: Alice采用Bob的公钥对消息加密,传给Bob,Bob用自己的私钥解密 数字签名: Alice采用自己的私钥对消息m签名,Alice将消息m和签名发送给Bob收到m和签名后,Bob用Alice的公钥来验证签名的有效性 数…

安全技术 数字签名

(一)介绍 数字签名是一种将相当于现实世界中的盖章、签字的功能在计算机世界中进行实现的技术。使用数字签名可以识别篡改和伪装,还可以防止否认。 通过消息认证码,我们可以识别消息是否被篡改或者发送者身份是否被伪装&#xf…

数字签名技术简介

数字签名(又称公钥数字签名)是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。数字签名是非对称密钥加密技术与数字摘要技术的应用数字签名机制作为保障网络信息安全的…

数字签名技术

目录 一、数字签名 二、数字签名技术 2.1、基于哈希算法的数字签名与验证 2.2、基于非对称密钥加密体制的数字签名与验证 三、数字签名的作用 一、数字签名 数字签名(又称公钥数字签名)是只有信息的发送者才能产生的别人无法伪造的一段数字串&…