Python欧式距离矩阵算法
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=xiTxi+xjxjT−2xiTxj
=(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}=⎝⎜⎜⎜⎜⎜⎛0d212d312⋮dn12d1220d322⋮dn22d132d2320⋮d1n2………⋱…d1n2d2n2d3n2⋮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=⎝⎜⎜⎜⎛x11x22⋮xmm⎠⎟⎟⎟⎞m×1+⎝⎜⎜⎜⎛y11y22⋮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=⎝⎛120231342⎠⎞3×3T;Y=(142332)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=⎝⎛03311820⎠⎞3×2
备注: 欧式距离矩阵中的元素为距离的平方,若需要距离,可用np.sqrt(EDM)开方。
参考文献:
- https://www.dabblingbadger.com/blog/2020/2/27/implementing-euclidean-distance-matrix-calculations-from-scratch-in-python
- Dokmanic, Ivan, et al. “Euclidean distance matrices: essential theory, algorithms, and applications.” IEEE Signal Processing Magazine 32.6 (2015): 12-30.
- Albanie, Samuel. “Euclidean Distance Matrix Trick.” Retrieved from Visual Geometry Group, University of Oxford (2019).
- https://ccrma.stanford.edu/~dattorro/EDM.pdf
Python欧式距离矩阵算法相关推荐
- python+dlib的欧式距离算法进行人脸识别
资源下载地址:https://download.csdn.net/download/sheziqiong/85738944 资源下载地址:https://download.csdn.net/downl ...
- Python:SMOTE算法——样本不均衡时候生成新样本的算法
Python:SMOTE算法 直接用python的库, imbalanced-learn imbalanced-learn is a python package offering a number ...
- 【机器学习基础】数学推导+纯Python实现机器学习算法23:kmeans聚类
Python机器学习算法实现 Author:louwill Machine Learning Lab 聚类分析(Cluster Analysis)是一类经典的无监督学习算法.在给定样本的情况下,聚类分 ...
- 【蓝桥杯 路径 python】Dij算法
题目来源: P1553 - [蓝桥杯2021初赛] 路径 - New Online Judge (ecustacm.cn) 经过两天的学习总算搞定了python的Dij算法,不得不说python的库函 ...
- 【LKH算法体验】Python调用LKH算法求TSP问题
[LKH算法体验]Python调用LKH算法求TSP问题 一.LKH算法简介 Keld Helsgaun 是丹麦 罗斯基勒大学计算机科学专业的名誉副教授. 他于 1973 年在 哥本哈根大学获得DIK ...
- Python实现KNN算法(鸢尾花集)
不同颜色的鸢尾花花语不尽相同,蓝色鸢尾花语是精致的美丽,红色鸢尾花的花语代表着热情.适应力强.紫蓝色鸢尾花花语代表着好消息.想念你.黄色鸢尾花的花语代表着友谊永固.热情开朗,白色鸢尾花花语代表着纯真. ...
- python数据结构与算法总结
python常用的数据结构与算法就分享到此处,本月涉及数据结构与算法的内容有如下文章: <数据结构和算法对python意味着什么?> <顺序表数据结构在python中的应用> ...
- 数学推导+纯Python实现机器学习算法:GBDT
Datawhale推荐 作者:louwill,Machine Learning Lab 时隔大半年,机器学习算法推导系列终于有时间继续更新了.在之前的14讲中,笔者将监督模型中主要的单模型算法基本都过 ...
- 以图搜图Python实现Hash算法
以图搜图(一):Python实现dHash算法 http://yshblog.com/blog/43 以图搜图(二):Python实现pHash算法 http://yshblog.com/blog/4 ...
最新文章
- 「小程序JAVA实战」小程序视频上传方法的抽象复用(57)
- php快速排序法远离,php快速排序原理与实现方法分析
- 福州java培训哪里好_福州自学考试培训班哪里比较好
- SAP BSP应用有状态和无状态行为差异比较
- 如何在Python中建立回归模型
- tomcat对于web.xml的security-constraint使用的处理机制
- MySQL创建字段+数据处理函数+汇总数据(聚集函数)+分组数据
- mlp神经网络_白天鹅黑天鹅灰天鹅?卷积神经网络帮你搞定识别
- Butterknife使用——转
- linux 自动连接无限,hotplug应用实例:自动连接无线网
- Intellij IDEA 2017 如何导入 GitHub 中的项目
- brctl 设置ip_Linux 网桥配置命令:brctl
- 实用Python识别图片上的数字(转载)
- 怎么攻击一个网站服务器ip,服务器被不同的IP攻击怎么破?
- Vulkan教程 - 08 着色器及编译SPIR-V
- 转载好用的小工具 【who-lock-me】
- java源码分析-注解AnnotatedElement接口
- Error: Failed to load config “standard“ to extend from
- uni-app 最简单的显示隐藏
- 洞见云计算的时代野望,第八届全球云计算大会·中国站即将启幕
热门文章
- Word解密大师:word文档加密、解密
- NOD32与VS2005冲突问题
- 专业视频处理软件.批量处理去重消重去水印去logo软件视频处理软件哪个好.批量处理去重消重去水印去log...
- webofscience入口注册_Web of Science
- 我的世界化石种子java_【我的世界】《我的世界》巨型化石种子 挖矿五年也不一定能见到_玩得好游戏攻略...
- 百-寒-进-16-油田Oil Deposits
- DC-DC2.6V~60V升压恒流大功率LED 照明驱动IC
- 如何评价收益率曲线的质量
- 东财《国际人力资源管理》综合作业
- 在一款恋爱模拟游戏中,男主角进入了某个女主角的线路,现在遵循“与其约会,使其娇羞”的战略,共有9个约会场所提供使用。其中,有四个约会场景,较为浪漫,男主可以取得好感度+2或者好感度+0,五个约会场景较