开发者社区> 问答> 正文

python计算每两个向量之间的距离并保持到矩阵中,怎么做?

python计算每两个向量之间的距离并保持到矩阵中,怎么做?

展开
收起
游客ahv54x37wvm7u 2021-10-31 12:09:27 578 0
1 条回答
写回答
取消 提交回答
  • 在很多算法中都会涉及到求向量欧式距离,例如机器学习中的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分别求其中每个向量的模平方,并扩展为23矩阵: 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 - 2vecProd ED = (SqED.getA())**0.5 return numpy.matrix(ED

    2021-10-31 13:05:33
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载