python计算每两个向量之间的距离并保持到矩阵中,怎么做?
在很多算法中都会涉及到求向量欧式距离,例如机器学习中的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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。