我是靠谱客的博主 含糊鸭子,最近开发中收集的这篇文章主要介绍距离度量:欧氏距离,余弦距离,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 马氏距离

最后

以上就是含糊鸭子为你收集整理的距离度量:欧氏距离,余弦距离,KL散度,马氏距离(含python代码实现)的全部内容,希望文章能够帮你解决距离度量:欧氏距离,余弦距离,KL散度,马氏距离(含python代码实现)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部