首页 > 编程语言 >常见距离算法

常见距离算法

时间:2022-10-03 22:37:26浏览次数:35  
标签:常见 距离 余弦 算法 计算 汉明 np array

机器学习中有很多的距离计算公式,用于计算数据和数据之间的距离,进而计算相似度或者其他。

1. 欧式距离(Euclidean Distance)

​ 欧式距离是最常见的距离度量方法。小学、初中、高中接触到的两个点在空间中的距离一般都是指欧式距离。

常见距离算法_曼哈顿距离

举例:

X=[[1,1],[2,2],[3,3],[4,4]];
经计算得:(2-1,3-1,4-1,3-2,4-2,4-3)
d = 1.4142 2.8284 4.2426 1.4142 2.8284 1.4142

python求该距离:

testData=[1, 1]
testData2=[4, 4]
dist = np.linalg.norm(np.array(testData2) - np.array(testData))
print(dist)
print(round(dist, 2))
'''
4.242640687119285
4.24
'''

2. 曼哈顿距离(Manhattan Distance)

​ 在曼哈顿街区要从一个十字路口开车到另一个十字路口,驾驶距离显然不是两点间的直线距离。这个实际驾驶距离就是“曼哈顿距离”。曼哈顿距离也称为“城市街区距离”(City Block distance)。

常见距离算法_字符串_02

常见距离算法_汉明距离_03

举例子:(2-1,3-1,4-1,3-2,4-2,4-3)

X=[[1,1],[2,2],[3,3],[4,4]];
经计算得:
d = 2 4 6 2 4 2

python计算:

testData=[1, 1]
testData2=[4, 4.5]

op3=np.sum(np.abs(np.array(testData)-np.array(testData2)))
op4=np.linalg.norm(np.array(testData)-np.array(testData2),ord=1)
print(op3)
print(op4)
'''
6.5
6.5
'''

3. 切比雪夫距离(Chebyshev Distance)

​ 国际象棋中,国王可以直行、横行、斜行,所以国王走一步可以移动到相邻8个方格中的任意一个。国王从格子(x1,y1)走到格子(x2,y2)最少需要多少步?这个距离就叫切比雪夫距离。

常见距离算法_曼哈顿距离_04

常见距离算法_汉明距离_05

举例:

X=[[1,1],[2,2],[3,3],[4,4]];
经计算得:
d = 1 2 3 1 2 1

python计算:

import numpy as np

vector1 = np.array([1, 1])
vector2 = np.array([4, 4])
op5 = np.abs(vector1 - vector2).max()
op6 = np.linalg.norm(vector1 - vector2, ord=np.inf)
print(op5)
print(op6)
'''
3
3.0
'''

4. 闵可夫斯基距离(Minkowski Distance)

该距离不是一种距离,而是一组距离的定义,是对多个距离度量工时的概括性的表述。

两个n维变量a(x11,x12,…,x1n)与b(x21,x22,…,x2n)间的闵可夫斯基距离定义为:

常见距离算法_曼哈顿距离_06

其中,P是一个可变参数

p=1是曼哈顿距离

P=2是欧式距离

P->无穷大时是切比学府距离

根据p的不同,闵氏距离可以表示某一类/种的距离。

小结: 上面四个距离存在的缺点:

(1). 二维样本身高和体重单位不是,一个是cm、一个是kg,实际上10cm不等于10kg,但是上面计算是没有考虑的。

(2). 未考虑各个分量的分布(期望,方差等)可能是不同的

5. 标准化欧式距离(Stangardized Euclidean Distance)

标准化欧式距离是针对欧式距离的缺点做的改进。 先将各个分量"标准化"到均值、方差等。

Sk表示各个维度的标准差

常见距离算法_曼哈顿距离_07

如果将方差的倒数看成一个权重,也可称之为加权欧氏距离(Weighted Euclidean distance)。

举例:

X=[[1,1],[2,2],[3,3],[4,4]];(假设两个分量的标准差分别为0.5和1)
经计算得:
d = 2.2361 4.4721 6.7082 2.2361 4.4721 2.2361

6. 余弦距离(Cosine Diatance)

几何中,夹角余弦可用来衡量两个向量方向的差异;机器学习中,借用这一概念来衡量样本向量之间的差异。

  • 二维空间中向量A(x1,y1)与向量B(x2,y2)的夹角余弦公式:

常见距离算法_字符串_08

  • 两个n维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n)的夹角余弦为:

常见距离算法_曼哈顿距离_09

也就是:

常见距离算法_汉明距离_10

夹角余弦取值范围为[-1,1]。余弦越大表示两个向量的夹角越小,余弦越小表示两向量的夹角越大。当两个向量的方向重合时余弦取最大值1,当两个向量的方向完全相反余弦取最小值-1。

举例:

X=[[1,1],[1,2],[2,5],[1,-4]]
经计算得:
d = 0.9487 0.9191 -0.5145 0.9965 -0.7593 -0.8107

python 计算:

import numpy as np

vector1 = np.array([1, 1])
vector2 = np.array([1, 2])
op7 = np.dot(vector1, vector2) / (np.linalg.norm(vector1) * (np.linalg.norm(vector2)))
print(op7)
'''
0.9486832980505138
'''

此算法也可以用来计算相似度,余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫"余弦相似性"。

7. 汉明距离(Hamming Distance)

两个等长字符串s1与s2的汉明距离为:将其中一个变为另外一个所需要作的最小字符替换次数。例如字符串“1111”与“1001”之间的汉明距离为2。

python 计算:

import numpy as np

v1=np.array([1,1,0,1,0,1,0,0,1])
v2=np.array([0,1,1,0,0,0,1,1,1])
smstr=np.nonzero(v1-v2)
print(smstr) # 不为0 的元素的下标
sm= np.shape(smstr[0])[0]
print( sm )

汉明重量:

是字符串相对于同样长度的零字符串的汉明距离,也就是说,它是字符串中非零的元素个数:对于二进制字符串来说,就是 1 的个数,所以 11101 的汉明重量是 4。因此,如果向量空间中的元素a和b之间的汉明距离等于它们汉明重量的差a-b。

应用:汉明重量分析在包括信息论、编码理论、密码学等领域都有应用。比如在信息编码过程中,为了增强容错性,应使得编码间的最小汉明距离尽可能大。但是,如果要比较两个不同长度的字符串,不仅要进行替换,而且要进行插入与删除的运算,在这种场合下,通常使用更加复杂的编辑距离等算法。

举例:

X=[[0,1,1],[1,1,2],[1,5,2]]
注:以下计算方式中,把2个向量之间的汉明距离定义为2个向量不同的分量所占的百分比。

经计算得:
d = 0.6667 1.0000 0.3333

8. 杰卡德距离(Jaccard Distance)

通过交并集进行计算。两个集合的交集在并集中所占的比例,称为杰卡德相似系数。

常见距离算法_汉明距离_11

杰卡德距离(Jaccard Distance):与杰卡德相似系数相反,用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度:

常见距离算法_汉明距离_12

举例:

X=[[1,1,0][1,-1,0],[-1,1,0]]
注:以下计算中,把杰卡德距离定义为不同的维度的个数占“非全零维度”的比例
经计算得:
d = 0.5000 0.5000 1.0000

总结:

  1. 欧式距离:通过距离平方值进行计算
  2. 曼哈顿距离:通过距离的绝对值求和进行计算
  3. 切比雪夫距离:维度的最大值进行计算
  4. 闵可夫斯基距离:一个距离的统称

p=1是曼哈顿距离
P=2是欧式距离
P->无穷大时是切比雪夫距离

上面几个距离将单位同等看待,计算过程不是很科学

  1. 标准化欧式距离:计算过程中添加了标准差
  2. 余弦距离:通过cos思想完成
  3. 汉明距离:一个字符串变成另一个字符串需要经过几个字母进行计算
  4. 杰卡德距离:通过交集并集计算

【当你用心写完每一篇博客之后,你会发现它比你用代码实现功能更有成就感!】



标签:常见,距离,余弦,算法,计算,汉明,np,array
From: https://blog.51cto.com/u_12826294/5730540

相关文章

  • Latex 如何写算法?推荐模板
    之前我已经在​​这篇文章​​总结了现有的算法包的区别。如果有选择苦难症的朋友可以考虑无脑使用以下模板来写算法。\usepackage[noend]{algpseudocode}#noend表示算法......
  • 计算空间物体包围球的两种算法实现
    详细介绍了计算空间包围球的两种算法。1.概述在进行二维空间几何运算的之前,往往会用包围盒进行快速碰撞检测,从而筛掉一些无法碰撞到的可能。而在三......
  • 浙江大学陈越老师《数据结构与算法》课程笔记
    目录1.1什么是数据结构1.1解决问题方法的效率1.2数据结构的定义1.3抽象数据类型1.2什么是算法1.2.1算法指标1.2.2复杂度的渐进表示法1.2.3例子—求最大连续子列和2......
  • AcWing算法提高课 龟速乘(防止由于MOD过大使乘法爆long long)
    在求a*b%MOD的时候,如果MOD>1e10,则即便使用a%MOD*b%MOD,依旧有可能会爆longlong故可以利用和快速幂相似的思想,将乘法按位转化为加法,避免报longlong龟速乘模板:LLSlowM......
  • 数据结构与算法分析——C语言描述(第9章 图论算法)*
    目录9.1若干定义图的表示9.1若干定义一个图(graph)\(G=(V,E)\)由顶点(vertex)的集\(V\)和边(edge)/弧(arc)的集\(E\)组成。每一条边就是一幅点对\((v,w)\),其中\(v,......
  • AcWing 算法提高课 拓展欧几里得算法 同余
    拓展欧几里得算法:1、模板:https://www.cnblogs.com/ydUESTC/p/16676229.html2、原理: 3、应用:拓展欧几里得算法解线性同余方程:  4、例题:(1)线性同余方程:https://w......
  • 数据结构与算法分析——C语言描述(第5章 散列)
    目录5.1一般想法5.2散列函数5.3分离链接法(separatechaining)5.4开放定址法(openaddressing)本章讨论散列表(hashtable)ADT,不过它只支持二叉查找树所允许的一部分......
  • js进阶手写常见函数
    JavaScript进阶的必要性无论是学习react还是vue,它们都是js的应用框架。剥去他们的壳子看到的始终是js,所以作为一个前端大厨必须要熟练掌握好js这个大勺,才能烧出一顿好菜无......
  • 算法分析相关概念
    算法分析相关概念算法的时间复杂度时间复杂度的分析注意事项同一个算法用不同的语言实现,或者用不同的编译程序进行编译,或者在不同的计算机上运行时,效率均不相同。所以,......
  • js进阶手写常见函数
    JavaScript进阶的必要性无论是学习react还是vue,它们都是js的应用框架。剥去他们的壳子看到的始终是js,所以作为一个前端大厨必须要熟练掌握好js这个大勺,才能烧出一顿好菜......