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

news2024/11/27 17:52:12

目录

  • 数据展示
  • 推荐算法的分类
    • 基于相似度
    • 基于流行度/上下文/社交网络
  • 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=0
    similarities = []
    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)
    # 创建一个空列表,用于存储推荐的书籍ID
    recommended_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.coloradmin.cn/o/1166796.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue+elementUI 设置el-descriptions固定长度并对齐

问题描述 对于elementUI组件&#xff0c;el-descriptions 在以类似列表的形式排列的时候&#xff0c;上下无法对齐的问题。 问题解决 在el-descriptions 标签中&#xff0c;添加属性&#xff1a; :contentStyle"content_style" 控制其内容栏长度 <el-descripti…

Visual Components Robotics OLP解决方案 北京衡祖

Visual Components 引入了“Visual Components Robotics OLP”的重大升级&#xff0c;合并了制造模拟和机器人离线编程。该解决方案利用 Delfoi Robotics 的技术&#xff0c;提高生产率、减少停机时间并减少浪费。 一、探索下一代离线机器人编程软件 自 1999 年以来&#xff0…

强大的pdf编辑软件:Acrobat Pro DC 2023中文

Acrobat Pro DC 2023是一款强大的PDF编辑和管理软件&#xff0c;它提供了广泛的功能&#xff0c;使用户能够轻松创建、编辑、转换和共享PDF文档。通过直观的界面和先进的工具&#xff0c;用户可以快速进行文本编辑、图像调整、页面管理等操作&#xff0c;同时支持OCR技术&#…

MobPush自定义智能标签,赋能精细化运营

随着用户兴趣爱好日益多元化&#xff0c;如何精准把握用户喜好&#xff0c;向用户定制推送用户所喜好的内容&#xff0c;成为APP能否提升用户粘性和活跃度&#xff0c;形成竞争力的关键。 因此&#xff0c;MobPush此前全面上新了”智能标签“功能&#xff0c;成为无数APP运营者…

图形化ping工具gping

一、介绍 gping能够以折线图的方式&#xff0c;实时展示 ping 的结果&#xff0c;支持 Windows、Linux 和 macOS 操作系统。并且支持多个目标同时Ping同时展示折线图方便对比。下面扩展一下ICMP及ICMP隧道。 ICMP消息结构&#xff1a; ICMP消息是由一个类型字段、一个代码字段、…

数据结构——顺序表(SeqList)

目录 1. 顺序表介绍 2. 顺序表工程 2.1 顺序表定义 2.1.1 静态顺序表 2.1.2 动态顺序表 2.2顺序表接口 2.2.1 顺序表初始化 2.2.2 顺序表打印 2.2.3 顺序表销毁 2.2.4 顺序表数据插入 2.2.4.1 容量检查 2.2.4.2 顺序表尾插 2.2.4.3 顺序表头插 2.2.4.4 顺序表随机…

Vue Vuex的使用和原理 专门解决共享数据的问题

Vuex专门解决共享数据的问题 多组件共享时使用&#xff0c;如用户ID各组件需要根据ID发送请求获取数据&#xff0c;任意组件可以进行增删改&#xff0c;相当于全局变量 Vuex 工作流程 如果确定值参数可以不经过Actions 直接走 安装Vuex vue2使用 vuex3 vue3使用 vuex4 npm i…

服务Service

一、服务概述 Service(服务)是Android四大组件之一&#xff0c;是能够在后台长时间执行操作并且不是供用户界面的应用程序组件。Senice可以与其他组件进行交互&#xff0c;一般由Activity启动&#xff0c;但是并不依赖于Activity。当Activity的生命周期结束时&#xff0c;Serv…

UNI-APP_ios自动适应底部安全区背景,修改安全区背景

自动适应&#xff08;推荐&#xff09; 将所有 iPhone X&#xff08;刘海屏) 底部安全区域背景颜色 自动适应&#xff0c;当前页面什么颜色会自动调整。 1.打开 manifest.json &#xff0c;打开源码视图 2.找到 app-plus 配置项&#xff0c;添加以下代码 "safearea&quo…

vue的message提示信息修改提示框所在页面位置高度

vue的message提示信息修改提示框所在页面位置高度&#xff0c;可以使用message的offset属性通过数值来改变提示框位置&#xff01; html部分代码 <div><el-button type"primary" click"showMessage" style"margin-left:40%;margin-top:1%&q…

Python多线程和代理请求示例

这是一个python多线程调用和代理提交的示例 可以用于负载均衡测试和高并发测试 import hashlib import json import random import sys import threading import time import requests as requests from requests.packages.urllib3.exceptions import InsecureRequestWarningr…

windows jar包文件默认打开方式设置

1、管理员权限打开“注册表编辑器”&#xff1b; 2、定位到计算机\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts项下&#xff0c;找到.jar项&#xff0c;再选中UserChoice项&#xff0c;其中ProgId值为jarfile 3、定位到计算机\HKEY_CLAS…

Pixhawk2.4.8接口及引脚定义

pixhawk2.4.8实物图 pixhawk侧边信号线插口 遥控器接收机、电调信号线插在这里 pixhawk侧边功能口 Micro-USB接口用来烧录固件、SD卡中有飞行日志等信息 pixhawk主面板接口 主面板接口功能概览 主面板接口定义 参考博客&#xff1a; https://zhuanlan.zhihu.com/p/61106155…

分布式训练原理总结(DP、PP、TP 、ZeRO)

文章目录 一、分布式训练基础知识1.1 集合通信、集合通信库1.2 通信模式1.2.1 Parameter Server&#xff08;2014&#xff09;1.2.2 Ring-AllReduce&#xff08;2017&#xff09; 1.3 同步范式1.4 大模型训练的目标公式 二、数据并行2.1 DataParallel&#xff08;DP)2.2 Distri…

c++学习3——几个感悟

一些感悟 1 虚拟目录2 浏览器和微信的本质区别3 资源文件 1 虚拟目录 电脑文件中并没有这个目录&#xff0c;比如vs2019在编程时&#xff0c; c的头文件.h文件和源文件.cpp文件实际上在一个目录&#xff0c;但是在vs2019中前者显示在头文件文件夹中&#xff0c;后者显示在源文…

mybatis-plus技巧--动态表名-多语句-拼接sql--关于mybatis的mysql分页查询总数的优化思考

文章目录 动态表名xml表名填充表名拦截器每天按统计每次设置 多语句操作forEach动态拼接 参数构建java进行拼接sqlmysql分页查询总数count不要使用count&#xff08;常数&#xff09;&#xff0c;count&#xff08;列名&#xff09;代替count(*)自己计数 SQL_CALC_FOUND_ROWSxm…

左偏树学习笔记

定义 堆&#xff0c;是一棵树&#xff0c;且每个节点的键值都大于等于 / 小于其父亲的键值。 左偏树是一种可合并的堆&#xff0c;可以以 O ( log ⁡ n ) O(\log n) O(logn) 的复杂度实现合并。 性质 左偏树满足堆的性质。 我们设定一个值 dist \text{dist} dist&#xf…

学习笔记|配对设计卡方检验|配对及二分类变量|McNemar检验|规范表达|《小白爱上SPSS》课程:SPSS第十七讲 | 配对设计卡方检验怎么做?

目录 学习目的软件版本原始文档配对设计卡方检验一、实战案例读数据 二、统计策略三、SPSS操作四、结果解读第一&#xff0c;卡方检验结果第二&#xff0c;分析统计结果 五、规范报告1、规范表格2、规范文字 学习目的 SPSS第十七讲 | 配对设计卡方检验怎么做&#xff1f; 软件…

如何在嵌入式软件开发的过程中使用DevSecOps方法,提升开发效率与安全性

DevOps可以帮助软件开发和IT从僵化的瀑布式开发脱离出来&#xff0c;转为更灵活的敏捷开发&#xff0c;使开发团队能够更快地解决问题、降低代码复杂性并加快产品交付。 既然DevOps有这么多的好处&#xff0c;那么对于希望确保软件开发过程安全的开发团队来说&#xff0c;下一…

学习笔记三十四:Ingress和 Ingress Controller概述

Ingress和 Ingress Controller概述 回顾service四层负载在k8s中为什么要做负载均衡Service不足之处四层负载和七层负载的区别OSI七层模型&#xff1a; Ingress介绍Ingress Controller介绍Ingress-controller 作用Ingress和Ingress Controller总结使用Ingress Controller代理k8s…