作者|奋发的菜鸟酱@知乎
来源|https://zhuanlan.zhihu.com/p/138107999
本文整理了常见的距离算法和相似度(系数)算法,并比较了欧氏距离和余弦距离间的不同之处。
1、常见的距离算法
1.1 欧几里得距离(Euclidean Distance)
在数学中,欧几里得距离或欧几里得度量是欧几里得空间中两点间“普通”(即直线)距离。使用这个距离,欧氏空间成为度量空间。相关联的范数称为欧几里得范数。
Euclidean Distance是一个通常采用的距离定义,它是在m维空间中两个点之间的真实距离。
代码:
>>> pdist = nn.PairwiseDistance(p=2)>>> input1 = torch.randn(100, 128)>>> input2 = torch.randn(100, 128)>>> output = pdist(input1, input2)
1.2 Earth Mover's Distance (EMD距离)
和欧式距离一样,它们都是一种距离度量的定义、可以用来测量某两个分布之间的距离。EMD主要应用在图像处理和语音信号处理领域。
EMD问题通俗解释: Earth Move翻译过来是搬土,指把P位置的m个坑的土,用最小的代价搬到Q位置的n个坑中,dij是pi到qj两个坑的距离,fij是从pi搬到qj的土量,则WORK工作量就是要最小化的目标。线性规划求解出fij后,再用fij对WORK作个归一化,就得到了EMD。EMD 实际上是线性规划中运输问题的最优解。
EMD具体定义可参考:http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/RUBNER/emd.htm
C代码包: emd.h, emd.c, emd.iOpenCV:实现了EMD api, pip install --upgrade setuptools pip install numpy Matplotlib pip install opencv-pythonimport numpy as npimport cv#p、q是两个矩阵,第一列表示权值,后面三列表示直方图或数量p=np.asarray([[0.4,100,40,22], [0.3,211,20,2], [0.2,32,190,150], [0.1,2,100,100]],np.float32)q=np.array([[0.5,0,0,0], [0.3,50,100,80], [0.2,255,