杰卡德相似度(Jaccard)详解及在UserCF中的应用

news/2024/11/23 0:38:43/

1、杰卡德相似度(Jaccard)

这个是衡量两个集合的相似度一种指标。 两个集合A和B的交集元素在A,B的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号J(A,B)表示

在这里插入图片描述

另一种表示的方法:

在这里插入图片描述

jaccard系数衡量维度相似性

jaccard系数很适合用来分析多个维度间的相似性,也多被用于推荐系统中用来给用户推荐相似的产品或业务。

举个例子,要计算某网站的两个用户的相似性,可以从性别、地区、年龄、浏览时间等等维度进行分析,我们把这些维度再进行细化:

男性、女性、小于18岁、18岁-40岁、40岁以上、浏览时间为早上、浏览时间为中午、浏览时间为下午
将以上维度作为一个集合,对两个用户A 和B ,将符合以上维度的指标值置为1,其他置为0。

假设用户A = [男性=1, 女性=0, 小于18岁=0, 18岁-40岁=1, 40岁以上=0, 浏览时间为早上=0, 浏览时间为中午=0, 浏览时间为下午=1]
假设用户B = [男性=1, 女性=0, 小于18岁=1, 18岁-40岁=0, 40岁以上=0, 浏览时间为早上=0, 浏览时间为中午=0, 浏览时间为下午=1]

即他们只有年龄不同,则根据计算公式,得到的jaccard系数值为:

在这里插入图片描述

在这里插入图片描述

jaccard系数衡量文本相似性

虽然jaccard主要是在维度分析这样的稀疏向量中作用比较大,但是在文本相似度计算时也可用jaccard。

用在文本相似度上,就是将字符串A, B分别进行分词,用交集中的词语数和并集中的词语数求比值。

A = [今天,天气,真好]

B = [今天,天气,不错]

在这里插入图片描述

转换为01向量

在这里插入图片描述

jaccard相似度在UserCF中应用示例
import numpy as np
import pandas as pd#构建用户购买记录数据集(1买了,0没买)
users = ["User1","User2","User3","User4","User5",]
items = ["ItemA","ItemB","ItemC","ItemD","ItemE"]
datasets = [[1,0,1,1,0],[1,0,0,1,1],[1,0,1,0,0],[0,1,0,1,1],[1,1,1,0,1]
]
df = pd.DataFrame(datasets,columns=items,index=users)df

在这里插入图片描述

在这里插入图片描述

# 计算所有数据两两之间的杰卡德相似系数from sklearn.metrics.pairwise import  pairwise_distances# 计算用户的相似度 ( 相似度 = 1 - 杰卡德距离 )
user_similar = 1 - pairwise_distances(df.values,metric='jaccard')
user_similar = pd.DataFrame(user_similar,columns=users,index=users)
print("用户之间的相似度")
user_similar

在这里插入图片描述

#为每个用户找到最相似的K个用户(k=2)
topN_users = {}
for i in user_similar.index:_df = user_similar.loc[i].drop(i)#取出第i个用户的那一行,删除自身(自己与自己的相似度为1)_df_sorted = _df.sort_values(ascending = False)  #降序排列top2 = list(_df_sorted.index[:2])#找到前两个topN_users[i] = top2print("每个用户最相似的两个用户")
topN_users

在这里插入图片描述

rs_users = {}
for user,sim_users in topN_users.items():rs_user = set()# 每个用户都有一个推荐结果for sim_user in sim_users:#和该用户相似的用户都买过什么,放在一起,set去重rs_user = rs_user.union(set(df.loc[sim_user].replace(0,np.nan).dropna().index))rs_user -= set(df.loc[user].replace(0,np.nan).dropna().index)#除去自己买了的rs_users[user] = rs_user
print("基于用户推荐")
rs_users

在这里插入图片描述

与传统相似性度量方法相比,杰卡德方法完善了余弦相似性只考虑用户评分而忽略了其他信息量的弊端,特别适合于应用到稀疏度过高的数据


http://www.ppmy.cn/news/11233.html

相关文章

Java调用WebService接口之利用hutool工具包实现

最近要对接金蝶财务系统,对方提供了一个webService接口。而且测试接口地址还是内网的,每改一处代码都要部署堡垒机去测试,光是一个登录接口就花了我两天时间很是无语(主要是接口文档地址不会看) 接口的地址大就是这种…

计算机专业实训报告总结

在日新月异的计算机行业里,计算机应用专业的学生参加实习是有着极其重要的意义的。今天给你介绍的是计算机专业实训报告总结,希望对大家有所帮助。 随着计算机技术的发展,在 Inter 飞速发展的今天,互联网成为人们快速获取、发布和…

Java基础知识复习

文章目录复习1. Java编译和运行2. Java运行环境3. Java注释4. Java中的打印5. 数据类型整形浮点型字符类型字节类型布尔类型数据类型转换强制类型转换隐式类型转换小结6. 变量命名规范7. 运算符算数运算符逻辑运算符移位运算符关系运算符8. switch9. 方法方法的重载可变参数变程…

【数据结构】栈及其经典面试题详解

目录前言一、栈的介绍二、数据类型重定义三、栈的结构四、栈中的常见操作五、测试栈六、栈的常见面试题前言 前面学习的线性表中包含顺序表和链表,这两种数据结构允许在任意位置进行插入和删除,那么有没有一种数据结构是不能在任意位置进行插入删除&…

SpringBoot在使用测试的时候是否需要@RunWith?

我们在使用SpringBoot进行测试的时候一般是需要加两个注解: SpringBootTest 目的是加载ApplicationContext,启动spring容器。 RunWith 是一个测试启动器,可以加载SpringBoot测试注解让测试在Spring容器环境下执行。如测试类中无此注解&#…

linux篇【13】:网络应用层—网络版计算器,序列化

目录 一.应用层 1.再谈 "协议" 2.序列化,反序列化 (1)序列化,反序列化的实例: (2)自描述长度的协议 3.网络版计算器 细节(1):报头方案 &am…

memcached面试专题及答案【三】

memcached 能接受的 key 的最大长度是多少?key 的最大长度是 250 个字符。需要注意的是,250 是 memcached 服务器端内部的限制,如果您使用的客户端支持”key 的前缀”或类似特性,那么 key(前缀原始 key)的最…

Vue 2 即将成为过去

自从 2020 年 9 月 18 日 Vue 3 正式发布以来,已经有两年多时间了,终于在 2022 年 2 月 7 日 Vue 作者发布了一则消息:Vue 3 将成为新的默认版本。与此同时,Vue 相关官方周边的核心库 latest 发布标签将指向其 Vue 3 的兼容版本。…