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