欧氏距离、余弦相似度、Jaccard相似度、皮尔逊的Python代码与实例

本文详细介绍了四种常用的Python计算相似度方法:欧氏距离、余弦相似度、皮尔逊相关系数和Jaccard相似度。通过实例展示它们在不同情境下的表现,以及各自关注的数据特征。了解这些概念有助于在实际项目中选择合适的相似度度量。

首先是一段计算4个相似度的Python代码。

需要注意的是,进行归一化操作后,4个函数取值范围都是0-1,而且都是数值越大表示相似性越高,数值为1代表完全相似。

import numpy as np

def CalSimEuD(dataA,dataB):
    '''【目的】计算欧氏距离(对应值的差平方之和再开方),注重数据之间的绝对位置而不是方向
       【输入】np.array
       【输出】已进行归一化,取值(0,1],数值越大表示相似性越高,数值为1代表完全相似'''
    #np.linalg.norm用于范数计算,默认二范数,相当于平方和开根号
    #原始取值为(0,正无穷),归一化到(0,1]区间:1/(1+原始值)
    return 1/(1+np.linalg.norm(dataA-dataB))

def CalSimCosine(dataA,dataB):
    '''【目的】计算余弦相似度,注重数据的方向而非绝对位置
       【输入】np.array
       【输出】已进行归一化,取值[0,1],数值越大表示相似性越高,数值为1代表完全相似'''
    sumData=np.dot(dataA,dataB)#公式中的分子,向量的内积
    #np.linalg.norm用于范数计算,默认二范数,相当于平方和开根号
    denom=np.linalg.norm(dataA)*np.linalg.norm(dataB)#公式中的分母
    #原始取值为[-1,1],归一化到[0,1]区间:0.5 + 0.5 * 原始值
    return 0.5+0.5*(sumData/denom)

def CalSimPearson(dataA,dataB):
    '''【目的】计算皮尔逊相关系数,是对余弦相似度的修正,分子和分母都需要减去输入数据集各自本身向量的均值,以达到中心化
       【输入】np.array,不可以输入常量数组如[1,1]
       【输出】已进行归一化,取值[0,1],数值越大表示相似性越高,数值为1代表完全相似'''
    # np直接计算出的皮尔逊相关系数取值范围[-1,1],归一化到[0,1]区间:0.
### 欧氏距离余弦相似度的区别及各自适用场景 #### 区别分析 欧氏距离余弦相似度是两种常用的向量间距离或相似性的度量方法,它们的核心区别在于量方式的不同。 1. **定义计算方式** - 欧氏距离基于几何中的直线距离概念,用于衡量两个点在多维空间中的实际距离。它的取值范围是非负实数 $[0, \infty)$,其中零表示完全重合的点[^3]。 - 余弦相似度则通过计算两向量夹角的余弦值来反映方向上的相似程度。其取值范围为 $[-1, 1]$,其中 1 表示完全相同的方向,-1 表示相反方向,而 0 则意味着正交(无关联)。由于余弦相似度仅关注角度而非长度,在某些情况下可以忽略数据规模的影响[^1]。 2. **特性对比** - 欧氏距离能够很好地体现绝对位置关系以及数值大小的变化情况,因此适合处理那些既关心方向又重视幅度的数据集。 - 而余弦相似度因经过归一化处理,故不受特征尺度变化影响,特别适用于当样本间的相对比例更重要而不是具体数值时的应用场合[^2]。 #### 各自适用场景探讨 根据上述特点可得出两者不同的最佳应用领域: 1. **欧氏距离的最佳应用场景** - 当需要考虑对象的实际物理间距或者属性的具体差异数值时应优先选用欧氏距离。比如地理信息系统(GIS)中城市之间的最短路径规划问题就非常适合采用此方法来进行评估。 2. **余弦相似度的理想使用环境** - 对于像文本挖掘这样的任务来说,文档通常被转换成高维度稀疏向量形式表达词频信息等内容特征。此时利用余弦相似度能有效消除不同长度文本带来的干扰因素从而更精准地捕捉语义层面的相关性。 - 推荐系统也是另一个典型例子,在这里我们往往更加注重用户偏好模式的一致性而非评分高低本身,所以借助余弦相似度可以帮助发现具有相似兴趣爱好的群体[^4]。 ```python import numpy as np def euclidean_distance(vec_a, vec_b): return np.linalg.norm(np.array(vec_a) - np.array(vec_b)) def cosine_similarity(vec_a, vec_b): dot_product = np.dot(vec_a, vec_b) norm_a = np.linalg.norm(vec_a) norm_b = np.linalg.norm(vec_b) return dot_product / (norm_a * norm_b) vec_x = [1, 2, 3] vec_y = [4, 5, 6] print(f"Euclidean Distance: {euclidean_distance(vec_x, vec_y)}") print(f"Cosine Similarity: {cosine_similarity(vec_x, vec_y)}") ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值