python - 在 numpy 中向量化(平方)马哈拉诺比斯距离

标签 python numpy matrix mahalanobis

我有 X (n x d)、Y (m x d) 和正定 L (d x d)。我想计算 D,其中 D_ij 是 (X_i - Y_i) * L * (X_i - Y_i).T。 n和m约为250; d 约为 10^4。

我可以使用scipy.spatial.distance.cdist,但这非常慢。

scipy.spatial.distance.cdist(X, Y, metric='mahalanobis', VI=L)

查看 Dougal 对 this question 的回答,我试过了

    diff = X[np.newaxis, :, :] - Y[:, np.newaxis, :]
    D = np.einsum('jik,kl,jil->ij', diff, L, diff)

这也很慢。

是否有更有效的方法来向量化此计算?

最佳答案

使用 np.tensordot 的组合和 np.einsum在这样的情况下有帮助 -

np.einsum('jil,jil->ij',np.tensordot(diff, L, axes=(2,0)), diff)

运行时测试 -

In [26]: n,m,d = 30,40,50
    ...: X = np.random.rand(n,d)
    ...: L = np.random.rand(d,d)
    ...: Y = np.random.rand(m,d)
    ...: 

In [27]: diff = X[np.newaxis, :, :] - Y[:, np.newaxis, :]

In [28]: %timeit np.einsum('jik,kl,jil->ij', diff, L, diff)
100 loops, best of 3: 7.81 ms per loop

In [29]: %timeit np.einsum('jil,jil->ij',np.tensordot(diff, L, axes=(2,0)), diff)
1000 loops, best of 3: 472 µs per loop

关于python - 在 numpy 中向量化(平方)马哈拉诺比斯距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41864980/

相关文章:

python - numpy 数组访问

python - 如何对 Pandas Dataframe 中的所有值进行 value_counts

python - 用子矩阵替换 numpy 矩阵元素

c++ - vector < vector < int >> 在第一个维度上的点积

python - pandas:聚合以保留第一个非 NaN 值

python - 我正在编写一个拼写检查程序,如何替换字符串中的 ch ?

python - 迷惑Gothon练习游戏Python

python,mysql,向表中插入字符串,错误1054

python - Gurobi错误: Q matrix is not positive semi-definite (PSD)

arrays - 在没有循环的情况下为每一行将矩阵的不同元素归零