我必须计算潜在大量矢量的成对加权距离。设A是m个向量/ n属性矩阵,W是1xn权重向量。
我的第一个函数以天真的方式计算成对距离:
def weightedDistance(A,W):
aff = np.zeros((len(A),len(A)))
for i in range(len(A)):
for j in range(len(A)):
aff[i][j] = np.sum(((A[i] - A[j])**2)*W)
return aff
对于1000x2矩阵,这需要超过20秒。
然后我尝试了一个更快的版本,使用矩阵乘法,based on this blog post:
def weightedDistanceFast(A,W):
AA = np.sum((A**2)*W,1)
A2 = -2*((A*W).dot(A.T))
return (AA+A2).W+AA
这是"即时"对于相同的1000x2矩阵。但是,它引入了一系列错误,顺序为e-17。
>>> dist = desc.weightedDistanceFast(attr,(1,1))
>>> dist2 = desc.weightedDistance(attr,(1,1))
>>> np.sum(dist-dist2)
6.9155863612166586e-11
>>> len(np.where((dist-dist2 > 0))[0])
380824
在这里查看其他答案,我也尝试使用sklearn.distance包中的wminkowski距离,但是根据W的值,它产生了与上述两个函数不同的结果。
def weightedDistanceMinkowski(A,W):
aff = sp.squareform(sp.pdist(A,metric='wminkowski',p=2,w=W))
return aff**2
无论如何,我知道一个certain degree of error is inevitable,但由于我要对这个距离矩阵进行进一步的计算,我想知道是否有办法减少这个错误(或者,更少容易出错的方法让函数1更快。)
谢谢!