距离度量:欧氏距离,余弦距离,KL散度,马氏距离(含python代码实现)

1. 欧氏距离(Euclidean Distance)

欧氏距离,又称欧几里得度量,绝对距离, 是欧几里得空间中两点间“普通”(即直线)距离。

定义如下:
在这里插入图片描述

2. 余弦距离(余弦相似度)

余弦距离,Cosine distance, 是用两个向量的夹角的余弦来衡量向量A,B的距离,余弦相似性最常用于高维正空间。
例如在信息检索中,每个词项被赋予不同的维度,而一个文档由一个向量表示,其各个维度上的值对应于该词项在文档中出现的频率。余弦相似度因此可以给出两篇文档在其主题方面的相似度。
在这里插入图片描述

余弦距离关注的是向量的角度关系,不关心绝对大小,取值 [-1,1].

2. 1 余弦距离和欧氏距离的区别,联系

归一化后的欧式距离和余弦距离关系:
在这里插入图片描述
(1)欧氏距离体现了绝对差异,余弦距离体现方向上的相对差异。

如果分析两个用户对不同视频的偏好,更关注相对差异,需要使用余弦距离。比如用户A的观看向量(0,1),B的观看向量(1,0),这时余弦距离是很大的。
如果分析用户的活跃度,如登录的次数,时长,这时,需要使用欧氏距离。

3. KL散度

在这里插入图片描述

4. 马哈拉诺比斯距离

马哈拉诺比斯距离, Mahalanobis distance, 表示数据的协方差距离。它是一种有效的计算两个未知样本集的相似度的方法。

与欧氏距离不同的是它考虑到各种特性之间的联系(例如:一条关于身高的信息会带来一条关于体重的信息,因为两者是有关联的)并且是尺度无关的(scale-invariant),即独立于测量尺度。 对于一个均值为 μ = ( μ 1 , μ 2 , μ 3 , … , μ p ) T {\displaystyle \mu =(\mu _{1},\mu _{2},\mu _{3},\dots ,\mu _{p})^{T}} μ=(μ1,μ2,μ3,,μp)T,协方差矩阵为 Σ {\displaystyle \Sigma } Σ 的多变量向量 x = ( x 1 , x 2 , x 3 , … , x p ) T {\displaystyle x=(x_{1},x_{2},x_{3},\dots ,x_{p})^{T}} x=(x1,x2,x3,,xp)T ,其马氏距离为

D M ( x ) = ( x − μ ) T Σ − 1 ( x − μ ) {\displaystyle D_{M}(x)={\sqrt {(x-\mu )^{T}\Sigma ^{-1}(x-\mu )}}} DM(x)=(xμ)TΣ1(xμ)

马哈拉诺比斯距离也可以定义为两个服从同一分布并且其协方差矩阵为 Σ {\displaystyle \Sigma } Σ 的随机变量 x ⃗ {\displaystyle {\vec {x}}} x y ⃗ {\displaystyle {\vec {y}}} y 的差异程度:

d ( x ⃗ , y ⃗ ) = ( x ⃗ − y ⃗ ) T Σ − 1 ( x ⃗ − y ⃗ ) {\displaystyle d({\vec {x}},{\vec {y}})={\sqrt {({\vec {x}}-{\vec {y}})^{T}\Sigma ^{-1}({\vec {x}}-{\vec {y}})}}} d(x ,y )=(x y )TΣ1(x y )

如果协方差矩阵为单位矩阵,马哈拉诺比斯距离就简化为欧氏距离;如果协方差矩阵为对角阵,其也可称为正规化的欧氏距离。

d ( x ⃗ , y ⃗ ) = ∑ i = 1 p ( x i − y i ) 2 σ i 2 {\displaystyle d({\vec {x}},{\vec {y}})={\sqrt {\sum _{i=1}^{p}{(x_{i}-y_{i})^{2} \over \sigma _{i}^{2}}}}} d(x ,y )=i=1pσi2(xiyi)2

其中 σ i {\displaystyle \sigma _{i}} σi x i {\displaystyle x_{i}} xi 的标准差。

马氏距离——向量空间按照主成分旋转后的欧氏距离
主成分分析:找到主成分方向(方差大的维度),将整个样本空间按照主成分方向旋转,让主成分方向作为新的轴,让维度之间尽可能互相独立。

马氏距离:在主成分空间中,样本到原点的欧式距离(因为PCA的时候已经中心化数据了,所以该类别样本的中心就是原点)

计算步骤:

找出主成分方向,中心化后的数据求协方差矩阵,经过特征值分解找出排序后的特征值矩阵U

U矩阵作用于数据矩阵,旋转空间

新数据空间标准化,减去均值除以标准差,标准化后,让维度同分布,独立

计算新坐标的欧氏距离

5. 实践

欧式距离和余弦距离的实现:

import numpy as np

def euclidean_distance(arr1, arr2):
	"""
	"""
	distance = np.sqrt(np.sum((arr1-arr2)**2))
	return distance
	
def cosine_distance(arr1, arr2):
	"""
	Calculate the cosine distance between arr1 and arr2.
	:param arr1: np.array
	:param arr2: np.array
	:return:
	"""
	assert arr1.ndim == 1 and arr2.ndim == 1
	distance = np.dot(arr1, arr2)/(np.sqrt(np.sum(arr1**2)*np.sum(arr2**2)))
	return distance
	
def test():
	arr1 = np.array([1, 2])
	arr2 = np.array([4, 8])
	dis = cosine_distance(arr1, arr2)
	print(dis)
	print(euclidean_distance(arr1,arr2))

test()

结果:

1.0
6.708203932499369

参考:

  1. 欧氏距离和余弦相似度的区别是什么?;
  2. zhihu 机器学习中的散度
  3. 百面机器学习;
  4. wiki 余弦距离;
  5. 马哈拉诺比斯距离 Wikipedia;
  6. cnblog 马氏距离
  • 4
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rosefunR

你的赞赏是我创作的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值