机器学习之余弦距离以及欧式距离

一、余弦距离

定义
 similarity  = cos ⁡ ( θ ) = A ⋅ B ∥ A ∥ ∥ B ∥ = ∑ i = 1 n A i B i ∑ i = 1 n A i 2 ∑ i = 1 n B i 2 , \text { similarity }=\cos (\theta)=\frac{\mathbf{A} \cdot \mathbf{B}}{\|\mathbf{A}\|\|\mathbf{B}\|}=\frac{\sum_{i=1}^{n} A_{i} B_{i}}{\sqrt{\sum_{i=1}^{n} A_{i}^{2}} \sqrt{\sum_{i=1}^{n} B_{i}^{2}}},  similarity =cos(θ)=ABAB=i=1nAi2 i=1nBi2 i=1nAiBi,
where A i A_{i} Ai and B i B_{i} Bi are components of vector A A A and B B B respectively.

简单来说,余弦相似度,就是计算两个向量间的夹角的余弦值。

余弦距离就是用1减去这个获得的余弦相似度。
余弦距离取值范围:
c o s ( θ ) cos (\theta) cos(θ)的取值范围是[-1 1] ,余弦距离的取值范围为[0,2] ,这就满足了非负性的性质。

二、欧式距离

欧式距离就是空间中两点的距离

就是常用的距离计算公式:
d = ∑ i = 1 N ( x 1 i − x 2 i ) 2 d=\sqrt{\sum_{i=1}^{N}\left(x_{1 i}-x_{2 i}\right)^{2}} d=i=1N(x1ix2i)2
举例说明:
A = ( 1 , 3 ) B = ( 1 , 2 ) C = ( 2 , 4 ) A=(1,3) \quad B=(1,2) \quad C=(2,4) A=(1,3)B=(1,2)C=(2,4)
向量A和B之间的夹角 θ 1 \theta_{1} θ1,向量A和C之间的夹角 θ 2 \theta_{2} θ2,并且 θ 1 = θ 2 \theta_{1} = \theta_{2} θ1=θ2
在这里插入图片描述

A和B之间的余弦相似度:

cos ⁡ θ 1 = 1 + 6 9 + 1 ⋅ 1 + 4 = 7 10 5 = 7 50 = 0.9899494936611665 \cos \theta_{1}=\frac{1+6}{\sqrt{9+1} \cdot \sqrt{1+4}}=\frac{7}{\sqrt{10} \sqrt{5}}=\frac{7}{\sqrt{50}}=0.9899494936611665 cosθ1=9+1 1+4 1+6=10 5 7=50 7=0.9899494936611665

cos ⁡ θ 2 = 2 + 12 10 ⋅ 20 = 14 200 = 7 50 = 0.9899494936611665 \cos \theta_{2}=\frac{2+12}{\sqrt{10} \cdot \sqrt{20}}=\frac{14}{\sqrt{200}}=\frac{7}{\sqrt{50}}=0.9899494936611665 cosθ2=10 20 2+12=200 14=50 7=0.9899494936611665

import numpy as np

A = np.array([1,3])
B = np.array([1,2])
C = np.array([2,4])


AngleSimiliaryAB = np.dot(A,B)/(np.linalg.norm(A)*np.linalg.norm(B))
AngleSimiliaryAC = np.dot(A,C)/(np.linalg.norm(A)*np.linalg.norm(C))

print('Angle similiarity between A and B : {}'.format(AngleSimiliaryAB))

print('Angle similiarity between A and C : {}'.format(AngleSimiliaryAC))

EuclideanDistanceAB = np.sqrt(np.sum(np.square(A-B)))
EuclideanDistanceAC = np.sqrt(np.sum(np.square(A-C)))

print('Euclidean Distance between A and B: {}'.format(EuclideanDistanceAB))

print('Euclidean Distance between A and C: {}'.format(EuclideanDistanceAC))

运行结果:

Angle similiarity between A and B : 0.9899494936611664
Angle similiarity between A and C : 0.9899494936611664
Euclidean Distance between A and B: 1.0
Euclidean Distance between A and C: 1.4142135623730951

三、两者之间的关系

当向量的模长是经过归一化的,此时欧氏距离与余弦距离有着单调的关系:
∥ A − B ∥ 2 = 2 ( 1 − cos ⁡ ( A , B ) ) \|A-B\|_{2}=\sqrt{2\left(1-\cos \left(A, B\right)\right)} AB2=2(1cos(A,B))
在此场景下,如果选择距离最小(相似度最大)的近邻,那么使用余弦相似度和欧氏距离的结果是相同的。

四、什么时候用余弦距离什么时候用欧式距离呢?

总体来说,欧氏距离体现数值上的绝对差异,而余弦距离体现方向上的相对差异。

1)例如,统计两部剧的用户观看行为,用户A的观看向量为(0,1),用户B为(1,0);此时二者的余弦距很大,而欧氏距离很小;我们分析两个用户对于不同视频的偏好,更关注相对差异,显然应当使用余弦距离。

2)而当我们分析用户活跃度,以登陆次数(单位:次)和平均观看时长(单:分钟)作为特征时,余弦距离会认为(1,10)、(10,100)两个用户距离很近;但显然这两个用户活跃度是有着极大差异的,此时我们更关注数值绝对差异,应当使用欧氏距离。

总结:在日常使用中需要注意区分,余弦距离虽然不是一个严格意义上的距离度量公式,但是形容两个特征向量之间的关系还是有很大用处的。比如人脸识别,推荐系统等。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MATLAB中,可以使用pdist函数来计算矩阵的距离。pdist函数的命令格式为d = pdist(X, distance),其中X是一个矩阵,distance是一个字符串参数,用于指定距离的计算方式。 距离的计算方式可以是欧几里德距离('euclidean'),曼哈顿距离('cityblock'),切比雪夫距离('chebychev'),余弦距离('cosine')等。通过指定不同的distance参数,可以选择不同的距离度量方法来计算矩阵的距离。 例如,如果要计算矩阵X中各个向量之间的欧几里德距离,可以使用以下命令: d = pdist(X, 'euclidean') 同样地,如果要计算矩阵X中各个向量之间的曼哈顿距离,可以使用以下命令: d = pdist(X, 'cityblock') 通过pdists函数,我们可以方便地计算矩阵之间的距离,这在很多数据处理和机器学习任务中都是非常有用的。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Matlab计算矩阵间距离](https://blog.csdn.net/weixin_30727835/article/details/98254303)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [MATLAB计算数据各种距离矩阵(欧式距离、加权欧式距离...)](https://blog.csdn.net/weixin_46584887/article/details/122056280)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [理解Matlab中的数组和矩阵:区别与用途](https://download.csdn.net/download/weixin_41784475/88226805)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值