Python - Numpy:如何减少这种成对距离代码中的舍入误差?

时间:2015-12-22 02:08:33

标签: python numpy matrix rounding

我必须计算潜在大量矢量的成对加权距离。设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更快。)

谢谢!

0 个答案:

没有答案