【Python】欧氏距离和余弦距离

本文详细介绍了欧氏距离和余弦距离的概念及其应用场景,包括两种距离度量的数学定义、Python实现方法,并对比了二者在数据分析中的区别。
部署运行你感兴趣的模型镜像

一、欧几里得距离(Euclidean Distance)

   欧氏距离是最常见的距离度量,衡量的是多维空间中各个点之间的绝对距离。公式如下:

Euclidean Distance

  因为计算是基于各维度特征的绝对数值,所以欧氏度量需要保证各维度指标在相同的刻度级别,比如对身高(cm)和体重(kg)两个单位不同的指标使用欧式距离可能使结果失效。

        Python实现如下:

import numpy as np

x=np.random.random(10)
y=np.random.random(10)

# solution1
dist1 = np.linalg.norm( x - y )

# solution2
dist2 = np.sqrt(np.sum(np.square(x - y)))  

print('x',x)
print('y',y)
print('dist1',dist1)
print('dist2',dist2)
          运行结果:



二、余弦距离

         余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比距离度量,余弦相似度更加注重两个向量在方向上的差异,而非距离或长度上。公式如下:

Cosine Similarity

              Python实现如下:

import numpy as np
from scipy.spatial.distance import pdist

x=np.random.random(10)
y=np.random.random(10)

# solution1
dist1 = 1 - np.dot(x,y)/(np.linalg.norm(x)*np.linalg.norm(y))

# solution2
dist2 = pdist(np.vstack([x,y]),'cosine')

print('x',x)
print('y',y)
print('dist1',dist1)
print('dist2',dist2)
            运行结果:



三、欧氏距离和余弦距离的区别

           

        余弦距离使用两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比欧氏距离,余弦距离更加注重两个向量在方向上的差异。

        借助三维坐标系来看下欧氏距离和余弦距离的区别:

clip_image009

           从上图可以看出,欧氏距离衡量的是空间各点的绝对距离,跟各个点所在的位置坐标直接相关;而余弦距离衡量的是空间向量的夹角,更加体现在方向上的差异,而不是位置。如果保持A点位置不变,B点朝原方向远离坐标轴原点,那么这个时候余弦距离 clip_image011 是保持不变的(因为夹角没有发生变化),而A、B两点的距离显然在发生改变,这就是欧氏距离和余弦距离之间的不同之处。

           欧氏距离和余弦距离各自有不同的计算方式和衡量特征,因此它们适用于不同的数据分析模型:

欧氏距离能够体现个体数值特征的绝对差异,所以更多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异。

余弦距离更多的是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦距离对绝对数值不敏感)。


您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 欧氏距离余弦相似度的区别 在机器学习数据分析领域,衡量样本间的相似性或距离是非常重要的操作之一。两种常用的度量方式分别是欧氏距离(Euclidean Distance) 余弦相似度(Cosine Similarity),二者各有特点。 #### 定义上的区别 - **欧氏距离**定义为两个向量之间直线的距离,适用于数值型变量的空间中两点间最短路径长度的测量。具体公式如下: ```python import numpy as np def euclidean_distance(vec_a, vec_b): return np.sqrt(np.sum((vec_a - vec_b)**2)) ``` 这种度量方法考虑到了各个维度上绝对差值的影响,因此当不同属性的重要性不同时可能需要先做标准化处理[^4]。 - **余弦相似度**则是通过计算两个非零向量夹角的余弦值来反映它们方向的一致程度,取值范围[-1, 1],其中1表示完全相同的方向(-1相反),0垂直无关: ```python from sklearn.metrics.pairwise import cosine_similarity cos_sim = cosine_similarity([vec_a], [vec_b]) print(f"Cosine similarity between vectors: {cos_sim[0][0]}") ``` 此度量仅关注于角度而非大小,所以即使两对象的实际位置相差很大但如果指向一致也会得到较高的分数[^1]。 #### 应用场景的不同 - 对于那些关心实际物理意义下的差距情况的任务来说,比如地理位置分析、图像识别等,则更适合采用能够体现真实间距变化特性的**欧氏距离**作为评价标准;而对于文本分类、推荐系统这类更在意事物本质联系而不是表面数量关系的情形而言,基于方向判断的**余弦相似度**就显得尤为合适了[^5]。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值