欧氏距离和余弦相似度

两者相同的地方,就是在机器学习中都可以用来计算相似度,但是两者的含义有很大差别,以我的理解就是:

前者是看成坐标系中两个,来计算两点之间的距离

后者是看成坐标系中两个向量,来计算两向量之间的夹角


前者因为是,所以一般指位置上的差别,即距离

后者因为是向量,所以一般指方向上的差别,即所成夹角


如下图所示:


数据项A和B在坐标图中当做点时,两者相似度为距离dist(A,B),可通过欧氏距离(也叫欧几里得距离)公式计算:


当做向量时,两者相似度为cosθ,可通过余弦公式计算:


假设||A||、||B||表示向量A、B的2范数,例如向量[1,2,3]的2范数为:

√(1²+2²+3²) = √14

numpy中提供了范数的计算工具:linalg.norm()

所以计算cosθ起来非常方便(假定A、B均为列向量):

  1. num = float(A.T * B) #若为行向量则 A * B.T  
  2. denom = linalg.norm(A) * linalg.norm(B)  
  3. cos = num / denom #余弦值  
  4. sim = 0.5 + 0.5 * cos #归一化  

因为有了linalg.norm(),欧氏距离公式实现起来更为方便:

  1. dist = linalg.norm(A - B)  
  2. sim = 1.0 / (1.0 + dist) #归一化  

关于归一化:

因为余弦值的范围是 [-1,+1] ,相似度计算时一般需要把值归一化到 [0,1],一般通过如下方式:

sim = 0.5 + 0.5 * cosθ
若在欧氏距离公式中,取值范围会很大,一般通过如下方式归一化:

sim = 1 / (1 + dist(X,Y))


说完了原理,简单扯下实际意义,举个栗子吧:

例如某T恤从100块降到了50块(A(100,50)),某西装从1000块降到了500块(B(1000,500))

那么T恤和西装都是降价了50%,两者的价格变动趋势一致,余弦相似度为最大值,即两者有很高的变化趋势相似度

但是从商品价格本身的角度来说,两者相差了好几百块的差距,欧氏距离较大,即两者有较低的价格相似度


-- EOF --

### 欧氏距离余弦相似度的区别 在机器学习和数据分析领域,衡量样本间的相似性或距离是非常重要的操作之一。两种常用的度量方式分别是欧氏距离(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]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值