基于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)

相关文章:
基于Jaccard相似度的推荐算法---示例
目录 数据展示推荐算法的分类基于相似度基于流行度/上下文/社交网络 Jaccard相似度分析数据的特点可以考虑的方法计算方法优缺点计算用户之间的Jaccard相似度获取与给定最相似的10个用户对1713353的用户推荐10本书 数据展示 import pandas as pd import numpy as np# 读取CSV文…...
基于指数分布算法的无人机航迹规划-附代码
基于指数分布算法的无人机航迹规划 文章目录 基于指数分布算法的无人机航迹规划1.指数分布搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用指数分布算法来优化无人机航迹规划。 …...
vite基础学习笔记:13.Dialog 对话框 (用户注册与登录)
说明:自学做的笔记和记录,如有错误请指正 1. Dialog 对话框组件 目标效果:点击“登录/注册”,弹框 (1)创建全局组件,在官网中查询代码粘贴 (2) 注册和使用全局组件 &a…...
RedisTemplate 使用 pipeline 时需要注意的问题
RedisTemplate 使用 pipeline 时需要注意的问题 RedisTemplate 使用 pipeline 进行批量 set 时,需要把 key 和 value 都转为字节 1. 直接使用 getBytes() 转为字节,在读取数据时,会抛出以下序列化异常 //错误代码 protected void process(…...
uniapp 下载文件到手机
下载后端传递过来的文件 let thil this uni.showLoading({title: 下载中,mask:true }) uni.downloadFile({url: 接口地址, //仅为示例,并非真实的资源header: {"Authorization": token},responseType: blob,success: (res) > {if (res.statusCode 2…...
使用Drupal管理小型项目?试试Docker快速部署Drupal结合内网穿透实现远程访问
🎬 鸽芷咕:个人主页 🔥个人专栏:《Linux深造日志》《C干货基地》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal…...
BSP-STM32移植FreeRTOS
在stm32裸机工程中的Middlewares目录添加freeRtos源码 在裸机工程中的main中调用freertos接口...
【Spring】Spring IOCDI(万字详解)
文章目录 1. Spring是什么?2. 认识IOC2.1 传统程序开发1. Main.java2. Car.java3. Framework.java4. Bottom.java5. Tire.java 2.2 分析传统开发2.3 IOC程序开发1. Main.java2. Car.java3. Framework.java4. Bottom.java5. Tire.java 2.4 分析IOC开发2.5 IOC容器优点…...
ts 使用泛型来做类型映射
使用泛型来做类型映射,将对象(或数组)中类型转换为另一个类型 首先,定义一个类型Student // 定义一个类型Studentinterface Student {name: string,age: number}1、把Student的所有属性都变为可空的 type Nullable<T> {[p in keyof T]: T[p] || …...
Compose - 使用 Paging
一、添加依赖 查看官方最新版本 val paging_version "3.2.1" implementation("androidx.paging:paging-runtime:$paging_version") implementation("androidx.paging:paging-compose:$paging_version") 二、定义数据源 PagingSource 是对其它…...
数据结构与算法-(11)---有序表(OrderedList)
🌈个人主页: Aileen_0v0 🔥系列专栏:PYTHON学习系列专栏 💫"没有罗马,那就自己创造罗马~" 目录 知识回顾及总结 有序表的引入 编辑 实现有序表 1.有序表-类的构造方法 2.有序表-search方法的实现 3.有序表-add方法的实现…...
佳易王会员管理系统软件如何下载,基本功能有哪些
一、佳易王会员管理软件大众版 部分功能简介: 1、会员信息登记 :可以直接使用手机号登记,也可以使用实体卡片,推荐用手机号即可。 2、会员卡类型 :可以自由设置卡的类型,比如:充值卡、计次卡、…...
docker搭建mysql环境
1. 基础环境 名称描述CentOS 7.6Linux操作系统版本docker 20.10.5docker版本mysql 8.0.29mysql镜像版本 2. 下载安装 使用docker命令下载mysql镜像 [rootzhouwei ~]# docker pull mysql:8.0.29查看docker仓库是否已经下载了mysql镜像 [rootzhouwei ~]# docker images将mys…...
优思学院|推行精益六西格玛困难重重?7大原因分析助你避坑
六西格玛,是一种让企业在绩效管理的舞台上跳得更高更远的方法。它不仅仅是一套原则和技术,更是一种对完美的执着追求。 在这个舞台上,企业的流程管理得以严格、集中,质量得以高效提升。优思学院总结出六西格玛的核心是࿱…...
四川思维跳动商务信息咨询有限公司可信吗?
在今天的数字化时代,抖音带货已成为一种全新的商业模式。许多公司都在通过这种形式进行产品推广和销售,其中,四川思维跳动商务信息咨询有限公司以其专业的服务和良好的信誉,在抖音带货领域赢得了广泛赞誉。 四川思维跳动商务信息…...
高防CDN与高防服务器:谁更胜一筹?
在当今数字化世界中,网络安全对于保护网站和应用程序至关重要。在这一背景下,高防CDN和高防服务器是两种流行的解决方案,用于应对不同类型的网络攻击。本文将分析高防CDN是否能够替代高防服务器,以及它们各自的优势和限制。 高防C…...
2.Netty简单应用
引入Maven依赖 <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId><version>4.1.49.Final</version> </dependency>服务端的管道处理器 public class NettyServerHandler extends ChannelInbou…...
80个10倍提升Excel技能的ChatGPT提示
你是否厌倦了在使用Excel时感觉像个新手?你是否想将你的技能提升到更高的水平,成为真正的Excel大师?嗯,如果你正在使用ChatGPT,那么成为Excel专家简直易如反掌。 你只需要了解一些最有用的Excel提示,就能在…...
jenkins结合k8s部署动态slave
1、完成k8s连接 在完成jenkins的部署后现安装kubernets的插件 如果jenkins 是部署在k8s集群中只需要填写一下 如果是非本集群的部署则需要填写证书等 cat ./config echo ‘certificate-authority-data-value’ | base64 -d > ./ca.crt echo ‘client-certificate-data’ |…...
搜索引擎Elasticsearch基础与实践
倒排索引 将文档中的内容分词,然后形成词条。记录每条词条与数据的唯一表示如id的对应关系,形成的产物就是倒排索引,如下图: ElasticSearch数据的存储和搜索原理 这里的索引库相当于mysql中的database。一个文档(do…...
基于AI-Scientist-V3的列车窗景实时生成技术实践
1. 项目背景与目标拆解去年NanoBanana 2团队在Siggraph Asia上展示的"Window Seat"项目让我眼前一亮——这个通过生成式AI重构列车窗景的创意,完美融合了计算机视觉与场景理解技术。最近拿到AI-Scientist-V3模型后,我决定用开源方案复现这个经…...
如何快速在云端启动VSCode:colabcode 5分钟入门指南
如何快速在云端启动VSCode:colabcode 5分钟入门指南 【免费下载链接】colabcode Run VSCode (codeserver) on Google Colab or Kaggle Notebooks 项目地址: https://gitcode.com/gh_mirrors/co/colabcode colabcode是一个强大的工具,能够帮助用户…...
开源一个基于INA226的USB-C PD诱骗器功耗监测仪,硬件软件全公开
开源USB-C PD诱骗器功耗监测仪:从硬件设计到软件实现的全栈解析 最近在调试一个支持USB PD协议的移动电源时,我发现市面上大多数功率检测工具都无法准确捕捉快充协议握手过程中的动态功率变化。这促使我开发了一款基于INA226的高精度USB-C PD诱骗器功耗监…...
三步解决iOS设备激活锁难题:A9-A11芯片设备离线绕过方案
三步解决iOS设备激活锁难题:A9-A11芯片设备离线绕过方案 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 当你面对二手iPhone的激活锁界面,或是因忘记Apple ID密码而无法使用设备…...
Rust 异步编程的常见陷阱
Rust 的异步编程凭借其高性能和零成本抽象的特性,成为现代系统开发的热门选择。异步编程模型本身复杂,加之 Rust 严格的编译期检查,开发者容易陷入一些常见陷阱。本文将深入剖析几个典型问题,帮助读者规避潜在风险,写出…...
ncmdump:三步解决网易云音乐NCM格式播放限制的完整指南
ncmdump:三步解决网易云音乐NCM格式播放限制的完整指南 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经在网易云音乐下载了心爱的歌曲,却发现只能在官方客户端播放?NCM文件转换已经成为…...
Cyrus:自托管AI编码代理部署与实战,打造自动化开发流水线
1. 项目概述:一个能帮你写代码的“数字员工” 如果你和我一样,每天要在Linear、GitHub、Slack这些工具之间来回切换,处理数不清的工单、Issue和PR评论,那你肯定想过:要是能有个“数字员工”帮我处理这些重复性的编码任…...
从DIY爱好者视角看ZEMAX:如何用软件‘打磨’你的第一块200mm F/5牛顿望远镜主镜
从DIY爱好者视角看ZEMAX:如何用软件‘打磨’你的第一块200mm F/5牛顿望远镜主镜 当深夜的天文爱好者决定亲手磨制一块200mm口径的牛顿望远镜主镜时,ZEMAX这个光学设计软件就成为了数字世界的"磨镜台"。不同于工业级光学设计,DIY场景…...
实战指南:如何构建高效的i茅台自动化预约系统
实战指南:如何构建高效的i茅台自动化预约系统 【免费下载链接】campus-imaotai i茅台app自动预约,每日自动预约,支持docker一键部署(本项目不提供成品,使用的是已淘汰的算法) 项目地址: https://gitcode.…...
从‘tuple‘报错聊Python设计哲学:为什么字符串、整数也不能改?一份给进阶者的可变/不可变类型深度指南
从元组报错透视Python设计哲学:可变与不可变类型的本质思考 当你第一次在Python中尝试修改元组元素时,那个刺眼的TypeError: tuple object does not support item assignment错误可能让你困惑不已。但这不是一个简单的错误提示,而是Python设计…...
