求两个点的欧氏距离_机器学习中的八大距离度量

点击菜单栏“粉丝福利”
拿小度,兑手机!
作者: 张家豪 来源: 人工智能学习圈
机器学习中往往要考虑向量之间的距离,此时曼哈顿距离,欧式距离,马氏距离等等接踵而至,帮助机器学习模型处理各种各样不同种类的数据,帮助我们解决了大问题! 但凡是“距离”,就需要满足正定性,齐次性,三角不等式这3个性质。 下面我们来一个个看看那些距离都是什么吧~
1
曼哈顿距离(Manhattan Distance)
在曼哈顿街区要从一个十字路口开车到另一个十字路口,直观上看,当然是绿线的距离最短,但在现实中显然是不成立的,因为我们不能穿过房屋。驾驶距离显然不是两点间的直线距离这些实际驾驶距离就是“曼哈顿距离”,也称为“街区距离”。 注:红蓝黄线皆为曼哈顿距离,绿线为欧式距离。

2
欧式距离(Euclidean Distance)
欧氏距离是最容易直观理解的距离度量方法,我们最早接触到的两个点在空间中的距离一般都是指欧氏距离。欧式距离同样也是机器学习中使用最广泛的距离。
标准化欧氏距离是针对欧氏距离的缺点而作的一种改进,但要求必须基于一个数据集的分布。 思路:既然数据各维分量的分布不一样, 那先将各个分量都“标准化”到均值、方差相等,即使得各个维度分别满足标准正态分布。假设样本集X的均值(mean)为m, 标准差(standard deviation)为s, X的“标准化变量”表示为:
化简后的标准化欧氏距离公式: 
3
切比雪夫距离(Chebyshev Distance)
切比雪夫距离来源于国际象棋,国王可以直行、横行、斜行,所以国王走一步可以移动到相邻8个方格中的任意一个。国王从一个格子走到另一个格子最少需要多少步?这个距离就叫切比雪夫距离。

4
闵可夫斯基距离(Minkowski Distance)
闵氏距离不是一种距离, 而是一组距离的定义, 是对多个距离度量公式的概括性的表述。
其中p是一个变参数: 当p=1时, 就是曼哈顿距离; 当p=2时, 就是欧氏距离; 当p→∞时, 就是切比雪夫距离。 根据p的不同, 闵氏距离可以表示某一种的距离。 
5
余弦距离

简单来说,余弦相似度,就是计算两个向量间的夹角的余弦值,取值范围[-1,1]。
余弦距离就是用1减去这个获得的余弦相似度。
由上面的余弦距离可以知道,余弦距离的取值范围为[0,2] ,这就满足了非负性的性质。 Python实现: 
6
马氏距离
下图有两个正态分布的总体,它们的均值分别为a和b,但方差不一样,则图中的A点离哪个总体更近? 或者说A有更大的概率属于谁? 显然, A离左边的更近, A属于左边总体的概率更大, 尽管A与a的欧式距离远一些。 这就是马氏距离的直观解释。
马氏距离是基于样本分布的一种距离。 物理意义就是在规范化的主成分空间中的欧氏距离。所谓规范化的主成分空间就是利用主成分分析对一些数据进行主成分分解。再对所有主成分分解轴做归一化, 形成新的坐标轴。由这些坐标轴张成的空间就是规范化的主成分空间。 定义:有M个样本向量X1与Xm, 协方差矩阵记为S, 均值记为向量μ, 则其中样本向量X到μ的马氏距离表示为:
向量Xi与Xj之间的马氏距离定义为:
若协方差矩阵是单位矩阵(各个样本向量之间独立同分布) , 则Xi与Xj之间的马氏距离等于他们的欧氏距离(若协方差矩阵是对角矩阵, 则就是标准化欧氏距离) :
若协方差矩阵是单位阵,那么右图马氏空间的样本分布就会简化为左图欧式空间的样本分布。
7
汉明距离
汉明距离一般是针对字符串,两个字符串s1与s2的汉明距离为: 将其中一个变为另外一个所需要作的最小字符替换次数。
汉明重量:是字符串相对于同样长度的零字符串的汉明距离,也就是说,它是字符串中非零的元素个数:对于二进制字符串来说,就是1的个数,所以11101的汉明重量是4。因此,如果向量空间中的元素a和b之间的汉明距离等于它们汉明重量的差a-b。 下面是求两个整数的二进制字符串的汉明距离的代码实现:
应用:汉明重量分析在包括信息论、编码理论、密码学等领域都有应用。比如在信息编码过程中,为了增强容错性,应使得编码间的最小汉明距离尽可能大。但是,如果要比较两个不同长度的字符串,不仅要进行替换,而且要进行插入与删除的运算,在这种场合下,通常使用更加复杂的编辑距离等算法。
8
编辑距离
编辑距离也针对于字符串,两个字符串 word1 和 word2,将 word1 转换成 word2 所使用的最少操作数 ,即为两个字符串的编辑距离。 你可以对一个单词进行如下三种操作: a.插入一个字符 b.删除一个字符 c.替换一个字符 举个例子:
输入:word1 = "horse", word2 = "ros"
输出:3
解释:
horse -> rorse (将 'h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')
以下代码为动态规划实现编辑距离:
这些是机器学习中常用的距离度量,还是很有必要掌握的。当然除此之外,还有流型距离等更复杂的距离,限于篇幅问题,就先不介绍啦。 


