余弦距离与jaccard距离以及python实现

本文解析了余弦距离和Jaccard距离的基本概念,通过实例展示了如何使用Scipy库正确计算两者,并明确了它们在实际应用中的区别。重点讲解了从公式到代码的转换过程,以及Scipy库的高效使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

   最近在看一些文章跟代码的时候碰到了余弦距离跟jaccrd距离的概念。刚开始有些混淆不清楚特,特别是在用scipy代码实现的过程中更是搞得一塌糊涂。现在自己整明白了就将自己的理解写下来。主要的区别就是cos计算出来的是余弦相似度,只有1减去计算出来的余弦相似度才是余弦距离。

  1. 余弦距离
    简单讲余弦距离就是
    在这里插入图片描述

    也就是1减去在这里插入图片描述
    如果用scipy库中的包实现的话如下所示

import numpy as np
vec1 = [1,2,3,4]
vec2 = [5,6,7,8]
 
#法一:根据公式求解
dist1 = np.dot(vec1,vec2)/(np.linalg.norm(vec1)*np.linalg.norm(vec2))
print("余弦距离为:\t"+str(1-dist1))
 
#法二:根据scipy库求解
from scipy.spatial.distance import pdist
Vec = np.vstack([vec1,vec2])
dist2 = pdist(Vec,'cosine')
print("余弦距离为:\t"+str(dist2))

上面这段代码是从另一个博主那里借鉴来的不过他写的有错(上面的代码是我改正过的),按照他的计算方式算的不是余弦距离而是余弦相似度。我之所以困惑也是看了他的代码才晕的(博主抱歉了)原博主的文章链接。进一步看一下scipy库pdist给出的说明文档也验证了我的想法
在这里插入图片描述
用函数包算出来的直接就是余弦距离。

  1. jaccard距离
    在这里插入图片描述
    以上内容来自百度百科说的而已经很详细了。
    代码实现如下:
import numpy as np
from scipy.spatial.distance import pdist
x=np.random.random(10)>0.5
y=np.random.random(10)>0.5

x=np.asarray(x,np.int32)
y=np.asarray(y,np.int32)

#方法一:根据公式求解
up=np.double(np.bitwise_and((x != y),np.bitwise_or(x != 0, y != 0)).sum())
down=np.double(np.bitwise_or(x != 0, y != 0).sum())
d1=(up/down)
           

#方法二:根据scipy库求解
X=np.vstack([x,y])
d2=pdist(X,'jaccard')  # 算出来的就是jaccard距离,需要计算jaccard系数的话就需要1-d2

参考文献

[1]余弦距离与余弦相似度的区别以及应用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值