问题描述

(; 表示纵向连接) 和

, 计算矩阵

中每一个行向量和矩阵

中每一个行向量的平方欧氏距离 (pairwise squared Euclidean distance), 即计算:

(这是一个

矩阵).

这个计算在度量学习, 图像检索, 行人重识别等算法的性能评估中有着广泛的应用.

公式转化

在 NumPy 中直接利用上述原式来计算两个矩阵的成对平方欧氏距离, 要显式地使用二重循环, 而在 Python 中循环的效率是相当低下的. 如果想提高计算效率, 最好是利用 NumPy 的特性将原式转化为数组/矩阵运算. 下面就尝试进行这种转化.

先将原式展开为:

下面逐项地化简或转化为数组/矩阵运算的形式:

式中,

表示按元素积 (element-wise product), 又称为 Hadamard 积;

表示维的全1向量 (all-ones vector), 余者类推. 上式中

的作用是计算

每行元素的和, 返回一个列向量;

的作用类似于 NumPy 中的广播机制, 在这里是将一个列向量扩展为一个矩阵, 矩阵的每一列都是相同的.

所以:

上述转化式中出现了

(矩阵乘) , 矩阵乘在 NumPy 等很多库中都有高效的实现, 对代码的优化是有好处的.

特别地, 当

时, 原式等于

, 注意到第一项和第二项互为转置. 当

(即

的每一个行向量的范数均为1时), 原式等于

,

全1矩阵.

代码实现

sklearn 中已经包含了用 NumPy 实现的计算 "两个矩阵的成对平方欧氏距离" 的函数 (sklearn.metrics.euclidean_distances

import numpy as np

def euclidean_distances(x, y, squared=True):

"""Compute pairwise (squared) Euclidean distances."""

assert isinstance(x, np.ndarray) and x.ndim == 2

assert isinstance(y, np.ndarray) and y.ndim == 2

assert x.shape[1] == y.shape[1]

x_square = np.sum(x*x, axis=1, keepdims=True)

if x is y:

y_square = x_square.T

else:

y_square = np.sum(y*y, axis=1, keepdims=True).T

distances = np.dot(x, y.T)

# use inplace operation to accelerate

distances *= -2

distances += x_square

distances += y_square

# result maybe less than 0 due to floating point rounding errors.

np.maximum(distances, 0, distances)

if x is y:

# Ensure that distances between vectors and themselves are set to 0.0.

# This may not be the case due to floating point rounding errors.

distances.flat[::distances.shape[0] + 1] = 0.0

if not squared:

np.sqrt(distances, distances)

return distances

如果想进一步加速, 可以将

x_square = np.sum(x*x, axis=1, keepdims=True)

替换为

x_square = np.expand_dims(np.einsum('ij,ij->i', x, x), axis=1)

以及将

y_square = np.sum(y*y, axis=1, keepdims=True).T

替换为

y_square = np.expand_dims(np.einsum('ij,ij->i', y, y), axis=0)

使用 np.einsum 的好处是不会产生一个和 x 或 y 同样形状的临时数组 (x*x 或 y*y 会产生一个和 x 或 y 同样形状的临时数组).

PyTorch 中也包含了计算 "两个矩阵的成对平方欧氏距离" 的函数

另外上述的转化公式也可以用在其他 Python 框架 (如 TensorFlow) 或其他语言中, 这里就不展开叙述了.

版权声明

版权声明:自由分享,保持署名-非商业用途-非衍生,知识共享3.0协议。

如果你对本文有疑问或建议,欢迎留言!转载请保留版权声明!

参考

python 矩阵元素平方_NumPy之计算两个矩阵的成对平方欧氏距离相关推荐

  1. python矩阵的平方_NumPy之计算两个矩阵的成对平方欧氏距离

    问题描述 设 (; 表示纵向连接) 和 , 计算矩阵 中每一个行向量和矩阵 中每一个行向量的平方欧氏距离 (pairwise squared Euclidean distance), 即计算: (这是 ...

  2. python编写函数,计算两个矩阵的乘积。

    ''' 编写函数,计算两个矩阵的乘积.'''# 该函数用于把一维列表转换为二维列表 def strToMatrxi(ju):############beigin#################### ...

  3. 计算两个矩阵的行向量之间的欧式距离

    1 问题描述 矩阵P的大小为[m, d]   用行向量表示为P1, P2,...,Pm 矩阵C的大小为[n, d]    用行向量表示为C1, C2,...,Cn 求矩阵P的每个行向量与矩阵C的每个行 ...

  4. 计算两个矩阵相乘(Java)

    package Four; /** 矩阵* * 题目描述* 计算两个矩阵的乘积,第一个2*3 第二个3*2* 输出* 一个2*2的矩阵(每个数字后都跟一个空格)* */ import java.uti ...

  5. 计算两个矩阵乘积(两种方式实现)(C语言)

    题目描述 计算两个矩阵的乘积,第一个是 2 * 3,第二个是 3 * 2 输入 输入为两个矩阵,其中一个为 2 * 3 的矩阵,另一个为 3 * 2 的矩阵 输出 一个 2 * 2 的矩阵(每一个数字 ...

  6. C语言求二阶矩阵最小值,C语言科学计算入门之矩阵乘法的相关计算

    1.矩阵相乘矩阵相乘应满足的条件: (1) 矩阵A的列数必须等于矩阵B的行数,矩阵A与矩阵B才能相乘: (2) 矩阵C的行数等于矩阵A的行数,矩阵C的列数等于矩阵B的列数: (3) 矩阵C中第i行第j ...

  7. python 矩阵元素相加_Numpy中元素级运算

    标量与矩阵的运算: 加法: values = [1,2,3,4,5] values = np.array(values) + 5 #现在 values 是包含 [6,7,8,9,10] 的一个 nda ...

  8. python 向量元素判断_python;计算向量的元素

    你的代码很少出错.在my vector a should be of dimension 10, but it isn't! 这是因为你不会在列表中只添加10个元素.看看你的逻辑.在for t in ...

  9. python列表元素之和_python实现计算列表元素之和

    目标:定义一个数字列表,并计算列表元素之和. 例如: 输入 : [12, 15, 3, 10] 输出 : 40 方法一:total = 0 list1 = [11, 5, 17, 18, 23] fo ...

  10. 编写程序计算两个矩阵之和。

    编程计算下列两个3*4矩阵之和. 第一个矩阵(A)内容为: 1 2 3 4 5 6 7 8 9 10 11 12 第二个矩阵(B)内容为: 1 4 7 10 2 5 8 11 3 6 9 12 程序运 ...

最新文章

  1. 【BZOJ 1566】 1566: [NOI2009]管道取珠 (DP)
  2. ubuntu修改顶栏颜色
  3. asp.net core webapi项目配置全局路由
  4. P2756,ssl2601-飞行员配对问题【网络流24题,最大匹配,dinic】
  5. CSS三角强化的巧妙运用(HTML、CSS)
  6. asp.net 抓取html内容,c# – 如何从ASP.NET获取网页的HTML内容
  7. jQuery常用操作部分总结
  8. PHPWAMP自定义添加PHP版本教程,支持无限添加PHP和Mysql版本
  9. GD32F103与STM32F103的区别 2021.6.2
  10. 免费的视频格式转换器哪个最好用呢?
  11. mysql生成数据字典
  12. SCHMERSAL AZM 161 Z ST1-AS PT西溪,且留下
  13. J2EE项目开发中常用到的公共方法
  14. Lua 最全的快速入门教程
  15. windows 2008 下C#调用office组件访问拒绝的解决方法(failed du
  16. android:layout_gravity=quot;topquot;,android:layout_gravity和gravity的区别
  17. python拆分excel并发送邮件_python使用tkinterpandassmtplib读取Excel并发送邮件
  18. 前端实现炫酷动效_前端动效实现--lottie - web
  19. 沟通修炼 I型沟通->U型沟通
  20. OpenCV—Python 对比度与亮度调整

热门文章

  1. 多元相关分析与回归分析(转)
  2. 排队问题解题思路_有关排队问题的排列组合题解法举例
  3. python计算直角三角形斜边上的中线_怎么证明直角三角形斜边上的中线
  4. Java:获取两个区间内 为周几或星期符合 的所有日期,指定日期 使用周数计算出相对应的工作日
  5. wps复选框怎么设置,wps表格中如何插入复选框?
  6. python爬取企业电话_Python爬取天眼查企业数据
  7. 伯努利试验和二项分布
  8. 唤起Android手机中已安装的地图应用
  9. Ros自定义消息及使用
  10. 【数据集收集】可用于深度学习模型的遥感数据集(持续更新,最后更新时间2020-06)