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

相关文章:

  • 2021-07-01
  • 2021-11-20
  • 2022-01-05
  • 2021-05-05
  • 2021-06-23
  • 2021-12-14
  • 2021-07-10
  • 2021-07-24
猜你喜欢
  • 2022-12-23
  • 2021-11-14
  • 2021-09-04
相关资源
相似解决方案