三种不同的方式,计算欧氏距离,速度比较
Posted yjybupt
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三种不同的方式,计算欧氏距离,速度比较相关的知识,希望对你有一定的参考价值。
import time
import numpy as np
#计算单行的欧氏距离
def cal_1(vec):
dist = np.linalg.norm(vec)
sim = (1.0 / (1.0 + dist))
return sim
#计算多行的欧氏距离
def cal_2(vec):
dist = np.linalg.norm(vec,axis=1)
sim = (1.0 / (1.0 + dist))
return sim
#生成向量vec1
t = np.zeros(20000,dtype=float)
vec1 = np.append(np.random.rand(100),t) #构建一个20100维的稀疏矩阵
vec1 = np.tile(vec1,(10000,1)) #10000行
print(‘built vec sucess!‘,vec1.shape)
#使用for循环计算欧氏距离
time1 = time.time()
arr1 = np.array([])
for i in vec1:
b = cal_1(i)
# print(b)
arr1 = np.append(arr1,b)
time2 = time.time()
print(time2-time1)
#使用map计算欧氏距离
time1 = time.time()
arr2 = np.array(list(map(cal_1,vec1)))
time2 = time.time()
print(time2-time1)
#使用cal_2计算欧氏距离
time1 = time.time()
arr3 = cal_2(vec1)
time2 = time.time()
print(time2-time1)
大规模计算欧氏距离,三种方法在不同情况下速度不同。
1、如果特征数很高、样本多,则使用map快
2、如果特征数低,多,则使用np.linalg.norm(vec,axis=1)
3、如果特征很少,样本很少,则使用for
以上是关于三种不同的方式,计算欧氏距离,速度比较的主要内容,如果未能解决你的问题,请参考以下文章
基于欧氏距离(或任何其他距离计算技术)提取的SIFT描述符估计两幅图像的相似度得分