Python欧式距离矩阵算法

根据欧式距离矩阵(Euclidean Distance Matrix, EDM) 的定义,它是一个n×\times×n的矩阵,表示欧式空间中一组n个点的空间距离,每个元素为点之间的距离平方。假设{xi∈Rd:i∈{1,...,n}}\{x_i \in \mathbb{R}^d : i \in \{1,...,n\}\}{xi​∈Rd:i∈{1,...,n}}

X=(∣∣∣x1x2...xn∣∣∣)d×nX =\begin{pmatrix} | & | & & |\\ x_1 & x_2 &... & x_n\\ | & | & & |\\ \end{pmatrix}_{d\times n}X=⎝⎛​∣x1​∣​∣x2​∣​...​∣xn​∣​⎠⎞​d×n​

距离矩阵,Dij=∣∣xi−xj∣∣22D_{ij} = ||x_i-x_j||^2_2Dij​=∣∣xi​−xj​∣∣22​
=(xi−xj)T(xi−xj)=(x_i - x_j)^T(x_i - x_j)=(xi​−xj​)T(xi​−xj​)
=xiTxi+xjxjT−2xiTxj=x_i^Tx_i + x_jx_j^T-2x_i^Tx_j=xiT​xi​+xj​xjT​−2xiT​xj​
=(0d122d132…d1n2d2120d232…d2n2d312d3220…d3n2⋮⋮⋮⋱⋮dn12dn22d1n2…0)=\begin{pmatrix} 0 &d_{12}^2 & d_{13}^2 & \dots & d_{1n}^2\\ d_{21}^2&0 & d_{23}^2 & \dots & d_{2n}^2\\ d_{31}^2 & d_{32}^2 & 0&\dots & d_{3n}^2\\ \vdots&\vdots&\vdots &\ddots & \vdots\\ d_{n1}^2 & d_{n2}^2 & d_{1n}^2 & \dots& 0\\ \end{pmatrix}=⎝⎜⎜⎜⎜⎜⎛​0d212​d312​⋮dn12​​d122​0d322​⋮dn22​​d132​d232​0⋮d1n2​​………⋱…​d1n2​d2n2​d3n2​⋮0​⎠⎟⎟⎟⎟⎟⎞​
欧式距离矩阵,edm(X)定义为
edm(X)=defdiag(G)+diag(G)T−2Gedm(X) \overset{\mathrm{def}}{=} diag(G) + diag(G)^T - 2Gedm(X)=defdiag(G)+diag(G)T−2G
其中,格拉姆矩阵(Gram matrix) G=XTXG=X^TXG=XTX, diag(G)diag(G)diag(G)为含有对角线元素的列向量。

在计算两个矩阵Xd×mX_{d\times m}Xd×m​和Yd×nY_{d\times n}Yd×n​之间的欧式距离矩阵时,可从上式推导出两个矩阵的欧式距离矩阵公式:
GX=XTXG_X = X^TXGX​=XTX
GY=YTYG_Y = Y^TYGY​=YTY
edm(X)=diag(GX)+diag(GY)T−2XTYedm(X) = diag(G_X) + diag(G_Y)^T - 2X^TYedm(X)=diag(GX​)+diag(GY​)T−2XTY
=(x11x22⋮xmm)m×1+(y11y22⋮ynn)n×1T−2XTY=\begin{pmatrix} x_{11}\\ x_{22}\\ \vdots\\ x_{mm}\\ \end{pmatrix}_{m\times1} + \begin{pmatrix} y_{11}\\ y_{22}\\ \vdots\\ y_{nn}\\ \end{pmatrix}^T_{n\times1} - 2X^TY=⎝⎜⎜⎜⎛​x11​x22​⋮xmm​​⎠⎟⎟⎟⎞​m×1​+⎝⎜⎜⎜⎛​y11​y22​⋮ynn​​⎠⎟⎟⎟⎞​n×1T​−2XTY

这里的GXG_XGX​和GYG_YGY​的对角线元素会经过numpy数组的广播机制(broadcasting),分别广播成n×nn\times nn×n和m×mm\times mm×m的矩阵,进行相加。EDM矩阵的大小应为m×nm\times nm×n。

例子:
X=(123234012)3×3T;Y=(123432)2×3TX = \begin{pmatrix} 1&2&3\\ 2&3&4\\ 0&1&2\\ \end{pmatrix}^T_{3\times 3}; Y = \begin{pmatrix} 1&2&3\\ 4&3&2\\ \end{pmatrix}^T_{2\times 3}X=⎝⎛​120​231​342​⎠⎞​3×3T​;Y=(14​23​32​)2×3T​

Python代码:

import numpy as npdef euclidean_dist(x, y=None):"""Compute all pairwise distances between vectors in X and Y matrices.:param x: numpy array, with size of (d, m):param y: numpy array, with size of (d, n):return: EDM:   numpy array, with size of (m,n). Each entry in EDM_{i,j} represents the distance between row i in x and row j in y."""if y is None:y = x# calculate Gram matricesG_x = np.matmul(x.T, x)G_y = np.matmul(y.T, y)# convert diagonal matrix into column vectordiag_Gx = np.reshape(np.diag(G_x), (-1, 1))diag_Gy = np.reshape(np.diag(G_y), (-1, 1))# Compute Euclidean distance matrixEDM = diag_Gx + diag_Gy.T - 2*np.matmul(x.T, y)  # broadcastingprint('This is matrix EDM: ')print(EDM)return EDMx = np.array([[1.0, 2.0, 3.0], [2.0, 3.0, 4.0], [0.0, 1.0, 2.0]]).T
y = np.array([[1.0, 2.0, 3.0], [4.0, 3.0, 2.0]]).T
euclidean_dist(x,y)

输出:EDM=(01138320)3×2EDM = \begin{pmatrix} 0&11\\ 3&8\\ 3&20\\ \end{pmatrix}_{3\times 2}EDM=⎝⎛​033​11820​⎠⎞​3×2​

备注: 欧式距离矩阵中的元素为距离的平方,若需要距离,可用np.sqrt(EDM)开方。

参考文献:

  1. https://www.dabblingbadger.com/blog/2020/2/27/implementing-euclidean-distance-matrix-calculations-from-scratch-in-python
  2. Dokmanic, Ivan, et al. “Euclidean distance matrices: essential theory, algorithms, and applications.” IEEE Signal Processing Magazine 32.6 (2015): 12-30.
  3. Albanie, Samuel. “Euclidean Distance Matrix Trick.” Retrieved from Visual Geometry Group, University of Oxford (2019).
  4. https://ccrma.stanford.edu/~dattorro/EDM.pdf

Python欧式距离矩阵算法相关推荐

  1. python+dlib的欧式距离算法进行人脸识别

    资源下载地址:https://download.csdn.net/download/sheziqiong/85738944 资源下载地址:https://download.csdn.net/downl ...

  2. Python:SMOTE算法——样本不均衡时候生成新样本的算法

    Python:SMOTE算法 直接用python的库, imbalanced-learn imbalanced-learn is a python package offering a number ...

  3. 【机器学习基础】数学推导+纯Python实现机器学习算法23:kmeans聚类

    Python机器学习算法实现 Author:louwill Machine Learning Lab 聚类分析(Cluster Analysis)是一类经典的无监督学习算法.在给定样本的情况下,聚类分 ...

  4. 【蓝桥杯 路径 python】Dij算法

    题目来源: P1553 - [蓝桥杯2021初赛] 路径 - New Online Judge (ecustacm.cn) 经过两天的学习总算搞定了python的Dij算法,不得不说python的库函 ...

  5. 【LKH算法体验】Python调用LKH算法求TSP问题

    [LKH算法体验]Python调用LKH算法求TSP问题 一.LKH算法简介 Keld Helsgaun 是丹麦 罗斯基勒大学计算机科学专业的名誉副教授. 他于 1973 年在 哥本哈根大学获得DIK ...

  6. Python实现KNN算法(鸢尾花集)

    不同颜色的鸢尾花花语不尽相同,蓝色鸢尾花语是精致的美丽,红色鸢尾花的花语代表着热情.适应力强.紫蓝色鸢尾花花语代表着好消息.想念你.黄色鸢尾花的花语代表着友谊永固.热情开朗,白色鸢尾花花语代表着纯真. ...

  7. python数据结构与算法总结

    python常用的数据结构与算法就分享到此处,本月涉及数据结构与算法的内容有如下文章: <数据结构和算法对python意味着什么?> <顺序表数据结构在python中的应用> ...

  8. 数学推导+纯Python实现机器学习算法:GBDT

    Datawhale推荐 作者:louwill,Machine Learning Lab 时隔大半年,机器学习算法推导系列终于有时间继续更新了.在之前的14讲中,笔者将监督模型中主要的单模型算法基本都过 ...

  9. 以图搜图Python实现Hash算法

    以图搜图(一):Python实现dHash算法 http://yshblog.com/blog/43 以图搜图(二):Python实现pHash算法 http://yshblog.com/blog/4 ...

最新文章

  1. 「小程序JAVA实战」小程序视频上传方法的抽象复用(57)
  2. php快速排序法远离,php快速排序原理与实现方法分析
  3. 福州java培训哪里好_福州自学考试培训班哪里比较好
  4. SAP BSP应用有状态和无状态行为差异比较
  5. 如何在Python中建立回归模型
  6. tomcat对于web.xml的security-constraint使用的处理机制
  7. MySQL创建字段+数据处理函数+汇总数据(聚集函数)+分组数据
  8. mlp神经网络_白天鹅黑天鹅灰天鹅?卷积神经网络帮你搞定识别
  9. Butterknife使用——转
  10. linux 自动连接无限,hotplug应用实例:自动连接无线网
  11. Intellij IDEA 2017 如何导入 GitHub 中的项目
  12. brctl 设置ip_Linux 网桥配置命令:brctl
  13. 实用Python识别图片上的数字(转载)
  14. 怎么攻击一个网站服务器ip,服务器被不同的IP攻击怎么破?
  15. Vulkan教程 - 08 着色器及编译SPIR-V
  16. 转载好用的小工具 【who-lock-me】
  17. java源码分析-注解AnnotatedElement接口
  18. Error: Failed to load config “standard“ to extend from
  19. uni-app 最简单的显示隐藏
  20. 洞见云计算的时代野望,第八届全球云计算大会·中国站即将启幕

热门文章

  1. Word解密大师:word文档加密、解密
  2. NOD32与VS2005冲突问题
  3. 专业视频处理软件.批量处理去重消重去水印去logo软件视频处理软件哪个好.批量处理去重消重去水印去log...
  4. webofscience入口注册_Web of Science
  5. 我的世界化石种子java_【我的世界】《我的世界》巨型化石种子 挖矿五年也不一定能见到_玩得好游戏攻略...
  6. 百-寒-进-16-油田Oil Deposits
  7. DC-DC2.6V~60V升压恒流大功率LED 照明驱动IC
  8. 如何评价收益率曲线的质量
  9. 东财《国际人力资源管理》综合作业
  10. 在一款恋爱模拟游戏中,男主角进入了某个女主角的线路,现在遵循“与其约会,使其娇羞”的战略,共有9个约会场所提供使用。其中,有四个约会场景,较为浪漫,男主可以取得好感度+2或者好感度+0,五个约会场景较