通过矩阵求两个向量集中元素两两之间的欧氏距离(python实现),比直接分开求更快速
2018-01-21 11:31
3195 查看
在很多算法中都会涉及到求向量欧式距离,例如机器学习中的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)
转自http://blog.csdn.net/uwell_peng/article/details/4999275912345678910111213[/code]
相关文章推荐
- 通过矩阵求两个向量集中元素两两之间的欧氏距离(python实现)
- 通过矩阵求两个向量集中元素两两之间的欧氏距离(python实现)
- 求两个矩阵中向量的欧氏距离(python实现)
- 求矩阵各个元素两两之间的欧式距离(python实现)
- 通过python模块实现服务器和本地机器之间快速拷贝文件
- 通过python模块实现服务器和本地机器之间快速拷贝文件
- 直接读取进程内存实现两个应用程序之间的通信
- 写正确函数需要注意的地方:两个序列a,b,大小都为n,序列元素的值为任意整数,无序;要求通过交换a,b中的元素,使序列a元素的和与序列b元素的和之间的差最小
- 通过共享内存,利用循环队列实现两个进程A,B之间的通信
- 分享:用Python计算两个向量之间的夹角余弦值
- 华为面试题(8分钟写出代码) 有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- 利用ORACLE的MINUS函数和OVER函数,直接通过视图实现两个记录集的比较。(转载)
- 《数组-规划》 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- 用Python实现gmail邮箱服务,实现两个邮箱之间的绑定(上)
- 用js实现两个select下拉框之间的元素互相移动
- Html5实现如何在两个div元素之间拖放图像
- 有两个序列a,b,要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
- 用Python实现gmail邮箱服务,实现两个邮箱之间的绑定(中)
- [微软]有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小