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

news/2024/5/19 20:54:02 标签: 推荐算法, 算法, 机器学习

目录

  • 数据展示
  • 算法>推荐算法的分类
    • 基于相似度
    • 基于流行度/上下文/社交网络
  • 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.niftyadmin.cn/n/5152084.html

相关文章

nacos未授权添加用户漏洞(CVE-2021-29441)

文章目录 0x01 漏洞介绍0x02 影响版本0x03 环境搭建0x04 漏洞复现第一步 查看用户第二步 添加新用户,访问url第三步 修改参数,构造参数第四步 用新账户密码登录则登录成功工具使用还可以直接利用curl直接添加用户进一步使用tool0x05 修复建议摘抄免责声明0x01 漏洞介绍 Nacos…

Springboot3整合Mybatis-plus3.5.3报错

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 报错以及Bug ✨特色专栏: …

C/C++输出字符菱形 2021年3月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C输出字符菱形 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C输出字符菱形 2021年3月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 给定一个字符,用它构造一个对角线长…

[尚硅谷React笔记]——第9章 ReactRouter6

目录: 课程说明一级路由重定向NavLink高亮useRoutes路由表嵌套路由路由的params参数路由的search参数路由的state参数编程式路由导航useRouterContextuseNavigationTypeuseOutletuseResolvedPath()总结项目地址 1.课程说明 概述 React Router以三个不同的包发布…

【数据结构】深入浅出讲解计数排序【图文详解,搞懂计数排序这一篇就够了】

计数排序 前言一、计数排序算法核心思路映射 概念补充绝对映射相对映射 二、计数排序算法核心实现步骤三、码源详解四、效率分析(1)时间复杂度 — O(Max(N,range))(2)空间…

【漏洞复现】IIS_7.o7.5解析漏洞

感谢互联网提供分享知识与智慧,在法治的社会里,请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证 1.5、修复建议 1.1、漏洞描述 漏洞原理: cgi.fix_path1 1.png/.php该…

(一)centos7离线安装依赖、rpm离线安装

最简洁最有效的解决方法记录 (一)centos7离线安装依赖、rpm离线安装1、下载依赖2、生成仓库元数据3、修改离线仓库配置4、离线安装5、常见错误 (一)centos7离线安装依赖、rpm离线安装 1、下载依赖 在同版本有外网centos7操作系统…

MATLAB算法实战应用案例精讲-【图像处理】图像分割(补充篇)

目录 前言 知识储备 opencv常用函数 图像处理算法工程师常见面试题目 相关术语: 面试题目 <