当前位置: 首页 > news >正文

基于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 使用泛型来做类型映射

使用泛型来做类型映射&#xff0c;将对象(或数组)中类型转换为另一个类型 首先&#xff0c;定义一个类型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)

&#x1f308;个人主页: Aileen_0v0 &#x1f525;系列专栏:PYTHON学习系列专栏 &#x1f4ab;"没有罗马,那就自己创造罗马~" 目录 知识回顾及总结 有序表的引入 ​编辑 实现有序表 1.有序表-类的构造方法 2.有序表-search方法的实现 3.有序表-add方法的实现…...

佳易王会员管理系统软件如何下载,基本功能有哪些

一、佳易王会员管理软件大众版 部分功能简介&#xff1a; 1、会员信息登记 &#xff1a;可以直接使用手机号登记&#xff0c;也可以使用实体卡片&#xff0c;推荐用手机号即可。 2、会员卡类型 &#xff1a;可以自由设置卡的类型&#xff0c;比如&#xff1a;充值卡、计次卡、…...

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大原因分析助你避坑

六西格玛&#xff0c;是一种让企业在绩效管理的舞台上跳得更高更远的方法。它不仅仅是一套原则和技术&#xff0c;更是一种对完美的执着追求。 在这个舞台上&#xff0c;企业的流程管理得以严格、集中&#xff0c;质量得以高效提升。优思学院总结出六西格玛的核心是&#xff1…...

四川思维跳动商务信息咨询有限公司可信吗?

在今天的数字化时代&#xff0c;抖音带货已成为一种全新的商业模式。许多公司都在通过这种形式进行产品推广和销售&#xff0c;其中&#xff0c;四川思维跳动商务信息咨询有限公司以其专业的服务和良好的信誉&#xff0c;在抖音带货领域赢得了广泛赞誉。 四川思维跳动商务信息…...

高防CDN与高防服务器:谁更胜一筹?

在当今数字化世界中&#xff0c;网络安全对于保护网站和应用程序至关重要。在这一背景下&#xff0c;高防CDN和高防服务器是两种流行的解决方案&#xff0c;用于应对不同类型的网络攻击。本文将分析高防CDN是否能够替代高防服务器&#xff0c;以及它们各自的优势和限制。 高防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时感觉像个新手&#xff1f;你是否想将你的技能提升到更高的水平&#xff0c;成为真正的Excel大师&#xff1f;嗯&#xff0c;如果你正在使用ChatGPT&#xff0c;那么成为Excel专家简直易如反掌。 你只需要了解一些最有用的Excel提示&#xff0c;就能在…...

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基础与实践

倒排索引 将文档中的内容分词&#xff0c;然后形成词条。记录每条词条与数据的唯一表示如id的对应关系&#xff0c;形成的产物就是倒排索引&#xff0c;如下图&#xff1a; ElasticSearch数据的存储和搜索原理 这里的索引库相当于mysql中的database。一个文档&#xff08;do…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器

一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下&#xff0c;音视频内容犹如璀璨繁星&#xff0c;点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频&#xff0c;到在线课堂中知识渊博的专家授课&#xff0c;再到影视平台上扣人心弦的高清大片&#xff0c;音…...

MySQL体系架构解析(三):MySQL目录与启动配置全解析

MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录&#xff0c;这个目录下存放着许多可执行文件。与其他系统的可执行文件类似&#xff0c;这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中&#xff0c;用…...