精华内容
下载资源
问答
  • 按照我之前的想法,会进行两轮或者一轮循环一个个地求出样本间的欧氏距离,但是看过了michuanhaohao/reid-strong-baseline中Euclidean_dist()方法的运算之后才发现了新大陆---------通过矩阵的方式快速的进行计算。...

    最近工作中需要用到矩阵中各个样本之间欧氏距离,因此记录一下,如何简便快捷地进行tensor间欧氏距离的计算(使用Pytorch框架)。

    按照我之前的想法,会进行两轮或者一轮循环一个个地求出样本间的欧氏距离,但是看过了michuanhaohao/reid-strong-baseline 中Euclidean_dist()方法的运算之后才发现了新大陆---------通过矩阵的方式快速的进行计算。

     

    一、理论分析

           首先从理论上介绍 一下,矩阵之间欧氏距离的快速计算,参考了@frankzd 的博客,原文链接在

    https://blog.csdn.net/frankzd/article/details/80251042

     

     

     

    二、代码分析

           接下来上代码,我会在每一行进行必要的注释(来源:https://github.com/michuanhaohao/reid-strong-baseline/blob/master/layers/triplet_loss.py

    
     
    1. def euclidean_dist(x, y):

    2. """

    3. Args:

    4. x: pytorch Variable, with shape [m, d]

    5. y: pytorch Variable, with shape [n, d]

    6. Returns:

    7. dist: pytorch Variable, with shape [m, n]

    8. """

    9.  
    10. m, n = x.size(0), y.size(0)

    11. # xx经过pow()方法对每单个数据进行二次方操作后,在axis=1 方向(横向,就是第一列向最后一列的方向)加和,此时xx的shape为(m, 1),经过expand()方法,扩展n-1次,此时xx的shape为(m, n)

    12. xx = torch.pow(x, 2).sum(1, keepdim=True).expand(m, n)

    13. # yy会在最后进行转置的操作

    14. yy = torch.pow(y, 2).sum(1, keepdim=True).expand(n, m).t()

    15. dist = xx + yy

    16. # torch.addmm(beta=1, input, alpha=1, mat1, mat2, out=None),这行表示的意思是dist - 2 * x * yT

    17. dist.addmm_(1, -2, x, y.t())

    18. # clamp()函数可以限定dist内元素的最大最小范围,dist最后开方,得到样本之间的距离矩阵

    19. dist = dist.clamp(min=1e-12).sqrt() # for numerical stability

    20. return dist

     

    三、demo演示

           接下来用一个简单的demo实现(也便于自己查验最后结果是否正确)

    
     
    1. import torch

    2.  
    3. def euclidean_dist(x, y):

    4. m, n = x.size(0), y.size(0)

    5. xx = torch.pow(x, 2).sum(1, keepdim=True).expand(m, n)

    6. yy = torch.pow(y, 2).sum(1, keepdim=True).expand(n, m).t()

    7. dist = xx + yy

    8. dist.addmm_(1, -2, x, y.t())

    9. dist = dist.clamp(min=1e-12).sqrt() # for numerical stability

    10. return dist

    11.  
    12. if __name__ == '__main__':

    13. x = torch.tensor([[1.0, 2.0, 3.0, 4.0], [2.0, 5.0, 7.0, 9.0]])

    14. y = torch.tensor([[3.0, 1.0, 2.0, 5.0], [2.0, 3.0, 4.0, 6.0]])

    15. dist_matrix = euclidean_dist(x, y)

    16. print(dist_matrix)

     最后输出的结果为:

    tensor([[2.6458, 2.6458],[7.6158, 4.6904]])

     

           理论看起来稍微有些麻烦,不过静下心来琢磨一下,还是很简单的。本文使用的是pytorch下的tensor变量进行的演示,对于矩阵,原理也是相同的。学会这个方法,以后就可以很高效地,而不必通过循环的方式计算矩阵间的欧氏距离了。

    展开全文
  • 按照我之前的想法,会进行两轮或者一轮循环一个个地求出样本间的欧氏距离,但是看过了michuanhaohao/reid-strong-baseline中Euclidean_dist()方法的运算之后才发现了新大陆---------通过矩阵的方式快速的进行计算。...

    最近工作中需要用到矩阵中各个样本之间欧氏距离,因此记录一下,如何简便快捷地进行tensor间欧氏距离的计算(使用Pytorch框架)。

    按照我之前的想法,会进行两轮或者一轮循环一个个地求出样本间的欧氏距离,但是看过了michuanhaohao/reid-strong-baseline 中Euclidean_dist()方法的运算之后才发现了新大陆---------通过矩阵的方式快速的进行计算。

     

    一、理论分析

           首先从理论上介绍 一下,矩阵之间欧氏距离的快速计算,参考了@frankzd 的博客,原文链接在

    https://blog.csdn.net/frankzd/article/details/80251042

     

     

     

    二、代码分析

           接下来上代码,我会在每一行进行必要的注释(来源:https://github.com/michuanhaohao/reid-strong-baseline/blob/master/layers/triplet_loss.py

        def euclidean_dist(x, y):
            """
            Args:
              x: pytorch Variable, with shape [m, d]
              y: pytorch Variable, with shape [n, d]
            Returns:
              dist: pytorch Variable, with shape [m, n]
            """
    
            m, n = x.size(0), y.size(0)
            # xx经过pow()方法对每单个数据进行二次方操作后,在axis=1 方向(横向,就是第一列向最后一列的方向)加和,此时xx的shape为(m, 1),经过expand()方法,扩展n-1次,此时xx的shape为(m, n)
            xx = torch.pow(x, 2).sum(1, keepdim=True).expand(m, n)
            # yy会在最后进行转置的操作
            yy = torch.pow(y, 2).sum(1, keepdim=True).expand(n, m).t()
            dist = xx + yy
            # torch.addmm(beta=1, input, alpha=1, mat1, mat2, out=None),这行表示的意思是dist - 2 * x * yT 
            dist.addmm_(1, -2, x, y.t())
            # clamp()函数可以限定dist内元素的最大最小范围,dist最后开方,得到样本之间的距离矩阵
            dist = dist.clamp(min=1e-12).sqrt()  # for numerical stability
            return dist

     

    三、demo演示

           接下来用一个简单的demo实现(也便于自己查验最后结果是否正确)

    import torch
    
    def euclidean_dist(x, y):
        m, n = x.size(0), y.size(0)
        xx = torch.pow(x, 2).sum(1, keepdim=True).expand(m, n)
        yy = torch.pow(y, 2).sum(1, keepdim=True).expand(n, m).t()
        dist = xx + yy
        dist.addmm_(1, -2, x, y.t())
        dist = dist.clamp(min=1e-12).sqrt()  # for numerical stability
        return dist
    
    if __name__ == '__main__':
        x = torch.tensor([[1.0, 2.0, 3.0, 4.0], [2.0, 5.0, 7.0, 9.0]])
        y = torch.tensor([[3.0, 1.0, 2.0, 5.0], [2.0, 3.0, 4.0, 6.0]])
        dist_matrix = euclidean_dist(x, y)
        print(dist_matrix)

     最后输出的结果为:

    tensor([[2.6458, 2.6458],[7.6158, 4.6904]])

     

           理论看起来稍微有些麻烦,不过静下心来琢磨一下,还是很简单的。本文使用的是pytorch下的tensor变量进行的演示,对于矩阵,原理也是相同的。学会这个方法,以后就可以很高效地,而不必通过循环的方式计算矩阵间的欧氏距离了。

    展开全文
  • 协方差定义,EX为随机变量X数学期望,同理,EXY是XY数学期望,挺麻烦,建议你看一下概率论cov(x,y)=EXY-EX*EY 协方差定义,EX为随机变量X数学期望,同理,EXY是XY数学期望,挺麻烦,建议你看一下...

    1. 协方差

    cov(x,y)=EXY-EX*EY

    协方差的定义,EX为随机变量X的数学期望,同理,EXY是XY的数学期望,挺麻烦的,建议你看一下概率论cov(x,y)=EXY-EX*EY

    协方差的定义,EX为随机变量X的数学期望,同理,EXY是XY的数学期望,挺麻烦的,建议你看一下概率论

    举例:

    Xi 1.1 1.9 3

    Yi 5.0 10.4 14.6

    E(X) = (1.1+1.9+3)/3=2

    E(Y) = (5.0+10.4+14.6)/3=10

    E(XY)=(1.1×5.0+1.9×10.4+3×14.6)/3=23.02

    Cov(X,Y)=E(XY)-E(X)E(Y)=23.02-2×10=3.02

    此外:还可以计算:D(X)=E(X^2)-E^2(X)=(1.1^2+1.9^2+3^2)/3 - 4=4.60-4=0.6 σx=0.77

    D(Y)=E(Y^2)-E^2(Y)=(5^2+10.4^2+14.6^2)/3-100=15.44 σy=3.93

    X,Y的相关系数:

    r(X,Y)=Cov(X,Y)/(σxσy)=3.02/(0.77×3.93) = 0.9979

    表明这组数据X,Y之间相关性很好!

     

    2. 协方差矩阵

     

     

    3. 马氏距离

     

     

    求马氏距离具体实例

    https://www.cnblogs.com/kailugaji/p/10252280.html

     

     

    转载于:https://www.cnblogs.com/luoyinjie/p/11151896.html

    展开全文
  • 在matlab中计算距离矩阵

    万次阅读 2011-03-30 11:26:00
    如何用matlab自带函数计算距离矩阵?请看本文。

         matlab中自带的计算距离矩阵的函数有两个pdist和pdist2。前者计算一个向量自身的距离矩阵,后者计算两个向量之间的距离矩阵。基本调用形式如下:

                   D = pdist(X)

                   D = pdist2(X,Y)

     

       这两个函数都提供多种距离度量形式,非常方便,还可以调用自己编写的距离函数。

     

       需要注意的是:pdist2返回是n*n的距离矩阵,pdist则返回距离矩阵的下三角串联形式。

    展开全文
  • 经常用的mantel检验,原理来讲,很是简单,就是一个距离矩阵的相关分析而已,但是这层窗户纸似乎存在很长时间,大家都对这个分析的原理有些忌惮,所以今天就之前的文档,来告诉大家如何理解mantel并且在一些文章中的...
  • 如何在python中不用for循环高效计算欧氏距离矩阵?问题描述 投票:1回答:1我有一个(51266,20,25,3)(N,F,J,C)矩阵,其中N是实例号,F是帧号,J是关节,C是关节xyz坐标。我想计算每个例子中每一帧欧氏距离矩阵,...
  • 最近在使用tensorflow...这里首先假定我们的输入是两个四维的Tensor,然后我们需要计算的是其中某个维度的距离。比如说我们的输入是batch个句子,句长是sent_len, 每个词被表示成embed_size的词向量。所以我们的输入
  • 在机器学习中距离矩阵计算非常常见(只要涉及距离计算,基本都需要计算距离矩阵),在本篇博客中就来记录一下如何使用Python都科学计算包numpy计算向量都距离矩阵。本篇博客讲解以行向量欧氏距离为例讲解,但是...
  • 如何画分布密度?如下图所示:x轴是海明距离,y轴是分布密度。我写一个函数,输入为海明距离hd。function out = YanMiDu(hd)xMin = min(hd);xMax = max(hd);... %计算各个区间,hd出现次数y = y/length(hd)
  • 最近在使用tensorflow完成句子...这里首先假定我们的输入是两个四维的Tensor,然后我们需要计算的是其中某个维度的距离。比如说我们的输入是batch个句子,句长是sent_len, 每个词被表示成embed_size的词向量。所以我们
  • 调用百度地图API,计算出已知经纬度的地址之间的实际距离,然后计算多个这样的地址之间的距离矩阵
  • 本次发布的内容为“小范带你学空间计量之十二:如何利用MATLAB程序设计并遴选基于多种空间权重矩阵的最优时空权重矩阵”,系范巧老师2019年5月18日-5月26日在东北师范大学经济学院“空间计量经济学”专题讲座的部分...
  • 因为读了在职博士原因,小范好久没更新公众号了,实在是太忙。最近刚把毕业条件弄完,于是稍微有点时间来写博文。...第二步,在经纬度基础上计算经纬度距离,并由此设定空间权重矩阵。当然,如果后续需要进...
  • 麻烦请教一下各位大佬,小弟最近刚刚接触机器学习,才疏学浅,理解不精。 knn中两个向量间距离的计算往往用欧式距离,若要...是否要计算traindata的逆协方差矩阵,再以此计算某一测试数据和traindata中所有向量的距离
  • 在机器学习中距离矩阵计算非常常见(只要涉及距离计算,基本都需要计算距离矩阵),在本篇博客中就来记录一下如何使用Python都科学计算包numpy计算向量都距离矩阵。本篇博客讲解以行向量欧氏距离为例讲解,但是...
  • 如何求解图像变换的矩阵

    千次阅读 2019-09-15 16:50:10
    1、问题描述 ...再计算 n 个点的平均值,这里假设平移的距离为,则 2.2 最小二乘(Least Square)法 对于任一特征点(xi,yi) 有 定义残差: 所有点的残差和为: 如果把特征点坐标...
  • 坐标快速转距离矩阵

    2020-12-04 10:26:13
    给定若干个点如何转换成距离矩阵,最简单粗暴的方法就是依次计算出各个点彼此间的距离然后填到矩阵中,参考练习题记录:求解距离矩阵,首先生成一百个二维坐标点,计算任意两个坐标点的距离。 但是我们可以利用...
  • Numpy矩阵计算应用——来自一个小白的学习记录 导火索 应客户要求,要匹配出A、B表中两两门店间的距离。其中A表共有1939家门店,B表共有1081家门店。 原始思路 1、先计算两两之间的距离:用两层for循环,依次提取每...
  • CUDA并行计算 计算向量欧式距离

    千次阅读 2017-04-02 16:46:09
    本文将介绍如何用cuda来计算两个向量之间欧式距离,其中涉及到了如果将二维矩阵传入到核函数进行计算的问题,并且介绍两个内存分配和拷贝API:cudaMallocPitch以及cudaMemcpy2D。 一、需求分析 现在我们要...
  • 本人最近写了一些如何创建空间权重命令,具体内容包括如下:1、直接利用stata创建空间距离矩阵和空间邻接矩阵, 2、Moran' I分析; 3、空间杜宾模型计算; 4、相关命令说明(部分命令为英文,不影响阅读); 5、同时...
  • 本文将介绍如何用cuda来计算两个向量之间欧式距离,其中涉及到了如果将二维矩阵传入到核函数进行计算的问题,并且介绍两个内存分配和拷贝API:cudaMallocPitch以及cudaMemcpy2D。 一、需求分析 现在...
  • 求出描述测试样本与训练样本之间的距离矩阵dists,其中dists.shape为(m1, m2)。测试集为矩阵X,维度为(m1, d);训练集为矩阵X_train,维度为(m2, d)。 问题难点:如何不使用循环计算出dists? 使用两层循环...
  • 关于matlab实现无线传感器网络DV-HOP算法中如何计算能量损耗 用MATLAB实现无线传感器网络DV-HOP算法,然后根据下列文字编写代码计算能量损耗:  目前,在低能量无线电通信领域有大量研究。无线电通信特性不同...
  • /** 计算高程坐标(Col0, Row0),(Col1, Row1) */ int col0 = int(CameraX); int row0 = int(CameraZ); unsigned int col1 = col0 + 1; unsigned int row1 = row0 + 1; /** 确保单元坐标不超过高程以外 */ if...
  • 题意:给出n个人和他们坐标,闪电随机劈到一个机器人,在他周围与他距离不超过r机器人会被传播,...首先给出一个非常一般的计算方法 -- 矩阵行列式法 对于任何一个顶点数为n无向连通图,我们列出一个矩阵
  • 1、 先比较两个字符数量 ,计算相差数量 2、 字符匹配, 循序匹配两个字符中最长字符串数量len§。 3、 最少操作数 = | len(1) - len(2) |+ len(2) - len§ word 1 = a [] word 2 = b [] 构造矩阵, m = len(a) ...
  • 马氏距离与欧式距离

    2019-06-12 18:42:16
    如果我们要衡量一个点到一个集合的距离,我们很可能就直接计算这个点x到这个集合的质心y的距离,那这样我们就忽略了这个集合的分布了 2、标准欧式距离 其中s为各个特征的方差,标准欧式距离没有考虑特征之间的...

空空如也

空空如也

1 2 3 4 5 6
收藏数 104
精华内容 41
关键字:

如何计算矩阵的距离