基于Jaccard相似度的推荐算法---示例

目录

  • 数据展示
  • 推荐算法的分类
    • 基于相似度
    • 基于流行度/上下文/社交网络
  • Jaccard相似度
    • 分析数据的特点
    • 可以考虑的方法
    • 计算方法优缺点
    • 计算用户之间的Jaccard相似度
    • 获取与给定最相似的10个用户
    • 对1713353的用户推荐10本书

数据展示

import pandas as pd
import numpy as np# 读取CSV文件
data = pd.read_csv('E:/recommended_s/Books.csv',header=None,names=['用户id','书籍id','rating' ,'timestamp'])[:10000]
print(data.head(10))

在这里插入图片描述

推荐算法的分类

基于相似度

  • Jaccard相似度:通过计算两个用户喜好集合的交集元素数量与并集元素数量的比值来衡量相似度。
  • 余弦相似度:将用户的喜好表示为向量,通过计算两个向量的余弦值来衡量相似度。余弦相似度考虑了向量的方向和长度,适用于处理偏好差异和权重差异的情况。
  • 皮尔逊相关系数:通过计算两个用户喜好向量之间的协方差和标准差的比值来衡量相似度。皮尔逊相关系数可以衡量线性相关性,适用于处理用户评分的情况。
  • 欧氏距离:将用户的喜好表示为向量,通过计算两个向量之间的欧氏距离来衡量相似度。欧氏距离衡量了向量之间的距离,数值越小表示越相似。
  • 曼哈顿距离:将用户的喜好表示为向量,通过计算两个向量之间的曼哈顿距离来衡量相似度。曼哈顿距离衡量了向量之间的距离,数值越小表示越相似。

基于流行度/上下文/社交网络

  • 基于流行度的推荐:推荐热门、流行的物品给用户。这种方法假设用户可能对热门物品感兴趣,适用于新用户或缺乏个性化信息的情况。
  • 基于上下文的推荐:考虑用户的上下文信息,如时间、地点、设备等,来进行推荐。根据用户当前的上下文环境,推荐适合的物品。例如,在早晨推荐早餐食谱,在晚上推荐电影。
  • 基于社交网络的推荐:利用用户在社交网络中的关系和交互信息,进行推荐。例如,根据用户的好友喜好进行推荐,或者利用社交网络中的社区结构进行推荐。

Jaccard相似度

  • Jaccard相似度是一种用于比较两个集合相似程度的度量方法。它通过计算两个集合的交集元素数量与并集元素数量的比值来衡量它们的相似性
  • 具体地,给定两个集合A和B,Jaccard相似度可以通过以下公式计算:J(A, B) = |A ∩ B| / |A ∪ B|,其中,|A ∩ B|表示集合A和B的交集元素数量,|A ∪ B|表示集合A和B的并集元素数量。
  • Jaccard相似度的取值范围在0到1之间,数值越接近1表示两个集合越相似,数值越接近0表示两个集合越不相似。

分析数据的特点

  • 低维,对于产品只有书籍id,没有关于书籍的其他内容,比如内容,属性等等。【当然也可以将书籍id进行拆解,但是因为时间原因并没有细化】
  • 存在一对一和一对100的情况,每个用户所看过的书籍数目不同且有较大差异。

可以考虑的方法

  • 基于用户的协同过滤推荐算法:由于数据中包含了用户对不同物品的评分记录,可以基于用户之间的评分行为相似性来进行推荐。通过计算用户之间的相似度,找到与目标用户兴趣相似的其他用户,然后根据这些用户的评分记录,推荐给目标用户可能感兴趣的物品。
  • 基于内容的推荐算法:数据中的物品ID可以用于表示物品的内容特征,如关键词、标签等。可以根据物品之间的内容相似性来进行推荐。通过计算物品之间的相似度,找到与目标物品相似的其他物品,然后推荐给用户。
  • 基于时间的推荐算法:数据中的时间戳可以用于表示用户对物品的评分时间。可以根据时间的先后顺序,推荐最近或最热门的物品给用户。例如,可以推荐用户最近一段时间内热门的物品,或者根据用户的历史评分记录,预测用户未来可能感兴趣的物品。

计算方法优缺点

  • 简单直观:Jaccard相似度的计算方法简单明了,易于理解和实现。【选择该算法的主要原因】
  • 不受数据规模影响:Jaccard相似度只关注集合的共同元素数量,而不考虑集合的大小,因此不受数据规模的影响。
  • 适用于稀疏数据:对于稀疏的用户-物品矩阵,Jaccard相似度可以有效地衡量用户之间的喜好相似度。
  • 但,Jaccard相似度只考虑了集合的共同元素,而没有考虑元素之间的权重差异

计算用户之间的Jaccard相似度

# 计算用户之间的Jaccard相似度
def Jaccard_similarity(user_id, data):user_data = data[data['用户id'] == user_id]other_users = data[data['用户id'] != user_id]# print(user_data)# print(other_users['用户id'])other_users_ids=list(set(other_users['用户id']))# print(other_users_ids)user_books = set(user_data['书籍id'])other_users_books = other_users.groupby('用户id')['书籍id'].apply(set).tolist()# print("###")# print(user_books)# print(other_users_books)i=0similarities = []for other_user_book in other_users_books:intersection = user_books.intersection(other_user_book)union = user_books.union(other_user_book)#print(len(intersection))Jaccard = float(len(intersection)) / (len(union) + 1e-8)user_id = other_users_ids[i]i=i+1# if(Jaccard != 0):# print(Jaccard)similarities.append((user_id, Jaccard))return similarities

获取与给定最相似的10个用户

def get_similar_users(user_id, data, top_n=10):similar_users = Jaccard_similarity(user_id, data)# 根据相似度对similar_users列表进行降序排序,找到最相似的用户similar_users.sort(key=lambda x: x[1], reverse=True)# print(similar_users)# 获取给定用户已经看过的书籍ID,并将其存储在user_books集合中user_books = set(data[data['用户id'] == user_id]['书籍id'])# print("%%%")# print(user_books)# 创建一个空列表,用于存储推荐的书籍IDrecommended_books = []# 遍历与给定用户最相似的前top_n个用户for other_user, _ in similar_users[:top_n]:# 获取当前相似用户喜欢的书籍ID,并将其存储在other_user_books集合中other_user_books = set(data[data['用户id'] == other_user]['书籍id'])# print(data[data['用户id'] == other_user])# 使用列表推导式,从相似用户喜欢的书籍中筛选出给定用户没有看过的书籍,将筛选出的书籍ID添加到recommended_books列表中recommended_books.extend([book for book in other_user_books if book not in user_books])# 返回前10个推荐的书籍ID列表return recommended_books[:10]

对1713353的用户推荐10本书

# 对于用户id为1713353的用户,推荐10本书
user_id = '1713353'
recommended_books = get_similar_users(user_id, data)
# 输出推荐的书
for book in recommended_books:print(book)

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

直播实时数仓基于DataLeap开放平台在发布管控场景的业务实践

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 背景 业务背景 随着字节业务的高速增长,业务场景越来越丰富,业务基于数据做的决策也越来越多,对数据的时效性要求也越来越高。…

【ElasticSearch系列-06】Es集群架构的搭建以及集群的核心概念

ElasticSearch系列整体栏目 内容链接地址【一】ElasticSearch下载和安装https://zhenghuisheng.blog.csdn.net/article/details/129260827【二】ElasticSearch概念和基本操作https://blog.csdn.net/zhenghuishengq/article/details/134121631【三】ElasticSearch的高级查询Quer…

Lightroom Classic 2021 v10.4

Lightroom Classic 2021是一款一体化照片管理和编辑解决方案。 它面向专业人士和高端用户,支持各种不同相机的原始图像编辑,包括Canon、Apple、Casio、Contax、DxO、Epson等品牌。这样可以将原图像快速导入进行编辑,轻松满足不同用户的需求。…

echart的tooltip显示不同的单位

效果 实现 在每个series中添加不同的 tooltip: { valueFormatter: function (value) { return value.toFixed(0) ‘A’; } }, 代码如下 var option {// grid: {// left: -13vw,//左边距72px// right: 32%,// bottom: 64%,// top:…

SpringBoot使用Mybatis

SpringBoot使用Mybatis Orm 框架的本质是简化编程中操作数据库的编码,发展到现在基本上就剩两家了,一个是宣称可以不用写一句 Sql 的 Hibernate,一个是可以灵活调试动态 Sql 的 Mybatis ,两者各有特点,在企业级系统开发中可以根…

单例模式 rust和java的实现

文章目录 单例模式介绍应用实例:优点使用场景 架构图JAVA 实现单例模式的几种实现方式 rust实现 rust代码仓库 单例模式 单例模式(Singleton Pattern)是最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建…

10 个适用于 Windows 的最佳 PDF 编辑器,用于轻松编辑 PDF 文件

PDF 是当今最流行的文件格式之一。Adobe 于 1993 年开发了 PDF 文件格式。PDF(便携式文档格式)主要用于存储复杂的文本文档和电子书。PDF 文件包含固定的布局属性,并且可以存储大量文本和图形。PDF 文件格式主要用于分发大型文档。 使用 PDF…

单源最短路的简单应用

1.dijkstra维护最长路 下面这个是讨论区的一个佬的理解,非常的nice 总结一句话,dijkstra的贪心保证了每次选定的点在之后都不会被其他点所更新了 同理维护最长路的时候我们发现,如果权值是0-1的话,选定的最大值在之后不会变的更大…

【服务发现与配置】Consul特性及搭建

文章目录 一、前言二、概念2.1、什么是Consul?2.2、Consul具有哪些特点?2.3、Consul 架构图2.4、Consul的使用场景 三、安装3.1. 下载3.2. 解压3.3. 拷贝到usr目录下3.4. 查看 安装是否成功3.5. 启动 四、Consul 开机自启动4.1. 路径/usr/lib/systemd/system/&…

4 Paimon数据湖之Hive Catalog的使用

更多Paimon数据湖内容请关注:https://edu.51cto.com/course/35051.html Paimon提供了两种类型的Catalog:Filesystem Catalog和Hive Catalog。 Filesystem Catalog:会把元数据信息存储到文件系统里面。Hive Catalog:则会把元数据…

更改 npm的默认缓存地址

npm的默认缓存一般在C:\Users\用户名\AppData\Roaming路径下的npm和npm_cache,而c盘往往空间不大。 1、在其他盘新建两个文件夹,如D盘,node_cache和node_global。如下图所示。 2、在cmd中执行npm config set prefix “node_cache的路径”&a…

blender动画制作全流程软件

blender官网下载地址 Download — blender.org Blender是一款功能强大的免费开源的3D动画制作软件。它具有广泛的功能和工具,适用于从简单的2D动画到复杂的3D渲染和特效的各种需求。 以下是Blender的一些主要特点: 建模工具:Blender提供了一…