python实现 基于邻域的算法之协同过滤(电影推荐实战)

article/2025/10/30 9:25:51

1 介绍

1.1 用户行为数据

用户行为数据通常把包括:网页浏览、购买点击、评分和评论等。

用户行为在个性化推荐系统中一般分为两种:

  • 显性反馈行为(explicit feedback)
    包括:用户明确表示明确对物品喜好的行为,网站中收集显性反馈的方式就是评分喜欢/不喜欢。
  • 隐形反馈行为(implicit feedback)
    指那些不能明确反应用户喜好的行为,最具有代表性的隐形反馈行为就是页面浏览行为。

安装反馈方向分,又可以分为正反馈负反馈

  • 正反馈
    指用户的行为倾向于指用户喜欢该物品
  • 负反馈
    指用户的行为倾向于指用户不喜欢该物品。

在显性反馈行为中,很容易区分一个用户行为是正反馈还是负反馈,而在隐形反馈行为中,就相对难以确定。

1.2 用户行为分析

在利用用户行为数据设计推荐算法之前,研究人员需要对用户行为数据进行分析,了解数据中蕴含的一般规律,这样才能对算的设计起到指导作用。

  • 用户活跃度和物品流行度
  • 用户活跃度和物品流行度的关系。

协同规律有很多方法:

  • 基于领域的方法(neighborhood-based)(最著名)
  • 隐语义模型(latent factor model)
  • 基于图的随机游走算法(radom walk on graph)

基于领域的方法(neighborhood-based)

  • 基于用户的协同过滤算法:给用户推荐和他兴趣相似的其他用户喜欢的物品。
  • 基于物品的协同过滤算法:给用户推荐和他之前喜欢的武平相似的物品。

2 基于领域的算法

基于领域的算法是推荐系统中最基本的算法,该算法不仅在学术界得到了深入研究,而且在业界得到了广泛应用。

2.2 基于用户的协同过滤算法(UserCF)

基本思想:
在一个在线个性化推荐系统中,当一个用户A需要个性化推荐时,可以先找到和他有相似兴趣的其他用户,然后把那些用户喜欢的、而用户A没有的物品推荐给A。

步骤:

(1)找到和目标用户兴趣相似的用户集合。
(2)找到这个集合中的用户喜欢的,且目标用户木有听说过的物品推荐给目标用户。

在这里插入图片描述

2.3 基于物品的协同过滤算法(ItemCF)

ItemCollaborationFilter

核心:
给用户推荐那些和他们之前喜欢的物品相似的物品。

主要步骤:

(1)计算物品之间的相似度;

(2)根据物品的相似度和用户的历史行为给用户生成推荐列表;

3 ItemCF电影推荐

3.1 计算电影的相似矩阵 & 计算物品相似矩阵w

3.1.1 计算电影的相似矩阵

原理: 用户看过的电影之间的联系

用户A:看过电影 film1 和 film2,则 film1 与 film2 关系值为1。

用户B:也看过 电影 film1 和 film2,则关系值 +1

以此类推。

3.1.2 计算电影之间的相似性

使用余弦相似度
请添加图片描述
|N(i)|:喜欢物品 i 的用户数
|N(j)|:喜欢物品 j 的用户数
|N(i)&N(j)|:同时喜欢物品 i 和物品 j 的用户数

举例:
(1)用户 A 对 a、b、d 有过行为,用户 B 对物品 b、c、e 有过行为。。。

A:a、b、d
B:b、c、e
C:c、d
D:b、c、d
E:a、d

(2)依次构建用户—物品到排表:
eg. 物品 a 被用户 A、E 有过行为,。。。

a:A、E
b:A、B、D
c:B、C、D
d:A、C、D、E
d:B

(3)建立物品相似度矩阵 C

在这里插入图片描述
其中,C[i][j]记录了同时喜欢物品i和物品j的用户数,这样我们就可以得到物品之间的相似度矩阵W。

3.1.3 代码

# 计算电影间的相似度def calc_movie_sim(self):print('=' * 100)print('二、计算电影的相似矩阵......')# 建立movies_popular字典print('-' * 35 + '1.计算电影的流行度字典movie——popular...' + '-' * 26)for user, movies in self.trainSet.items():for movie in movies:"""若该movie没在movies_popular字典中,则把其插入字典并赋值为0,否则+1,最终的movie_popular字典键为电影名,值为所有用户总的观看数"""if movie not in self.movie_popular:self.movie_popular[movie] = 0else:self.movie_popular[movie] += 1self.movie_count = len(self.movie_popular)# print(self.movie_popular)print("训练集中电影总数 = %d" % self.movie_count)print('-' * 35 + '2.建立电影联系矩阵... ' + '-' * 43)for user, movies in self.trainSet.items():for m1 in movies:for m2 in movies:if m1 == m2:continue"""下面三步的作用是:分别将每个用户看过的每一部电影与其他所有电影的联系值置1,若之后又有用户同时看了两部电影, 则+1"""self.movie_sim_matrix.setdefault(m1, {})self.movie_sim_matrix[m1].setdefault(m2, 0)self.movie_sim_matrix[m1][m2] += 1print("建立电影的相似矩阵成功!")# print("矩阵进行相似计算前movieId=1的一行为:")# print(self.movie_sim_matrix['1'])  # 计算电影之间的相似性print('-' * 35 + '3.计算最终的相似矩阵...  ' + '-' * 40)for m1, related_movies in self.movie_sim_matrix.items():for m2, count in related_movies.items():# 注意0向量的处理,即某电影的用户数为 0if self.movie_popular[m1] == 0 or self.movie_popular[m2] == 0:self.movie_sim_matrix[m1][m2] = 0else:self.movie_sim_matrix[m1][m2] = count / math.sqrt(self.movie_popular[m1] * self.movie_popular[m2])print('计算电影的相似矩阵成功!')

3.3 预测

计算用户u对外拍哪个j的兴趣:
根据物品的相似度和用户的历史行为给用户生成推荐列表
在这里插入图片描述
Puj:表示用户 u 对物品 j 的兴趣。
N(u):表示用户喜欢的物品集合(i:用户喜欢的某一个物品)。
S(i, k):表示和物品 i 最相似的 k 个物品集合( j 是这个集合中的某一个物品)。
Wji:表示物品 j 和 i 的相似度。
Rui:表示用户 u 对物品 i 的兴趣。

计算结果:和用户历史上感兴趣的物品越相似的物品,越可能得到高的排名。

def recommend(self, user):K = int(self.n_sim_movie)N = int(self.n_rec_movie)rank = {}watched_movies = self.trainSet[user]for movie, rating in watched_movies.items():"""对目标用户每一部看过的电影,从相似电影矩阵中取与这部电影关联值最大的前K部电影,若这K部电影用户之前没有看过,则把它加入rank字典中,其键为movieid名,其值(即推荐度)为w(相似电影矩阵的值)与rating(用户给出的每部电影的评分)的乘积"""for related_movie, w in sorted(self.movie_sim_matrix[movie].items(), key=itemgetter(1), reverse=True)[:K]:if related_movie in watched_movies:continuerank.setdefault(related_movie, 0)# 计算推荐度rank[related_movie] += w * float(rating)return sorted(rank.items(), key=itemgetter(1), reverse=True)[:N]

4 UserCF和itemCF的比较

  • User代表网站:新闻网站
  • ItemCF代表网站:图书、电商、电影

从原理上:
UserCF给用户推荐那些和他们有共同兴趣安好的用户喜欢的物品。
ItemCF给用户推荐那些和他喜欢的物品类似的物品。

从原理角度可以看出,UserCF的推荐更社会化,反应了用户所在的小型兴趣群体中物品的热门程度,而ItemCF的推荐更加个性化,反应了用户自己的兴趣传承。

UserCF可以给用户推荐和他有相似爱好的一群塔器用户今天都在看的新闻,这样在抓住任店和时效性的同时,保证了一定程度的个性化。同时,在新闻网站中,物品的更新速度远远快于新用户的加入速度,而却对于新用户,完全可以推荐最热门的新闻,因此UserCF利更大。

但是在图书、电商网站中,用户的兴趣是比较固定和持久的。技术人员往往会购买专业书籍,但是很多优质数据并不是热门书籍,所以ItemCF算法非常适合。
一天更新一次,对网站压力会较小,但是,需要维护物品的相似性矩阵,需要更多存储空间。

User-basedItem-based
性能适合用户较少,否则计算用户相似举证代价大适用于武平数量明显小于用户数的场合,反之,计算物品相似度代价大
领域时效性强,用户个性化兴趣不太明显的领域用户个性化需求强的领域
冷启动新用户对很少的物品产生行为后,不能建立对她进行个性化推荐,因为用户相似度表是每隔一段时间离线计算的,新物品上线后一段时间,一旦有用户对物品产生行为,就可以将新物品推荐给和她产生行为的用户兴趣相似的其他用户新用户只要对一个物品产生行为,就可以给他推荐与该物品相关的其他物品,但没有办法在不离线更新物品相似度表的情况下新物品推荐给用户
推荐理由很难提供令用户信服的推荐解释利用用户的历史行为给用户推荐解释,可以令用户比较信服

参考地址:
https://www.jianshu.com/p/a21944550656

https://blog.csdn.net/qq_40965177/article/details/106636012

https://blog.csdn.net/qq_35704904/article/details/103031962

https://blog.csdn.net/yeruby/article/details/44154009


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

相关文章

协同过滤1

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

推荐算法之协同过滤

一、协同过滤算法简介 所谓协同过滤算法,其基本思想就是根据用户之前的喜好及其他兴趣相近的用户的选择来给用户推荐物品(基于对用户历史行为数据的挖掘发现用户的喜好偏向, 并预测用户可能喜好的产品进行推荐)。 目前应用广泛的…

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

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

协同过滤

协同过滤 什么是协同过滤 协同过滤推荐(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的公钥来验证签名的有效性 数…