python求距离矩阵_python计算每两个向量之间的距离并保持到矩阵中

本文介绍了如何使用numpy在Python中高效地计算两个向量集之间的欧氏距离矩阵,避免了传统的双层循环,提高了计算效率。通过矩阵运算,先计算点积、模平方,然后构建距离矩阵并开方得到最终结果。
摘要由CSDN通过智能技术生成

匿名用户

1级

2017-08-02 回答

在很多算法中都会涉及到求向量欧式距离,例如机器学习中的KNN算法,就需要对由训练集A和测试集B中的向量组成的所有有序对(Ai,Bi),求出Ai和Bi的欧式距离。这样的话就会带来一个二重的嵌套循环,在向量集很大时效率不高。

这里介绍如何将这一过程用矩阵运算实现。

假设有两个三维向量集,用矩阵表示:

A=[a11a12a21a22a31a32]

B=⎡⎣⎢⎢b11b12b13b21b22b23b31b32b33⎤⎦⎥⎥

要求A,B两个集合中的元素两两间欧氏距离。

先求出ABT:

ABT=⎡⎣⎢⎢⎢⎢⎢∑k=13ak1bk1∑k=13ak2bk1∑k=13ak1bk2∑k=13ak2bk2∑k=13ak1bk3∑k=13ak2bk3⎤⎦⎥⎥⎥⎥⎥

然后对A和BT分别求其中每个向量的模平方,并扩展为2*3矩阵:

Asq=⎡⎣⎢⎢⎢⎢⎢∑k=13(ak1)2∑k=13(ak2)2∑k=13(ak1)2∑k=13(ak2)2∑k=13(ak1)2∑k=13(ak2)2⎤⎦⎥⎥⎥⎥⎥

Bsq=⎡⎣⎢⎢⎢⎢⎢∑k=13(bk1)2∑k=13(bk1)2∑k=13(bk2)2∑k=13(bk2)2∑k=13(bk3)2∑k=13(bk3)2⎤⎦⎥⎥⎥⎥⎥

然后:

Asq+Bsq−2ABT=⎡⎣⎢⎢⎢⎢⎢∑k=13(ak1−bk1)2∑k=13(ak2−bk1)2∑k=13(ak1−bk2)2∑k=13(ak2−bk2)2∑k=13(ak1−bk3)2∑k=13(ak2−bk3)2⎤⎦⎥⎥⎥⎥⎥

将上面这个矩阵一开平方,就得到了A,B向量集两两间的欧式距离了。

下面是Python实现:

import numpy

def EuclideanDistances(A, B):

BT = B.transpose()

vecProd = A * BT

SqA = A.getA()**2

sumSqA = numpy.matrix(numpy.sum(SqA, axis=1))

sumSqAEx = numpy.tile(sumSqA.transpose(), (1, vecProd.shape[1]))

SqB = B.getA()**2

sumSqB = numpy.sum(SqB, axis=1)

sumSqBEx = numpy.tile(sumSqB, (vecProd.shape[0], 1))

SqED = sumSqBEx + sumSqAEx - 2*vecProd

ED = (SqED.getA())**0.5

return numpy.matrix(ED)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值