matrix - 计算给定行向量矩阵的距离矩阵

标签 matrix numpy distance

假设我有一个容纳行向量的矩阵 nxm。我想要一个距离矩阵 nxn 来表示每个向量彼此之间的距离。当我使用 Numpy 时,如何在 Python 中做到这一点。我知道 Scipy 可以做到这一点,但我想弄脏我的手。我已经编写了一个余弦相似度函数 cos_dist(a,b),其中 a 和 b 是两个不同的向量。现在我需要一个调用者函数来有效地为每对项目执行此操作。我该怎么做呢?

最佳答案

以下代码显示了两个选项来执行您想要的操作。一次循环数组两次并使用 Python 函数计算 cos_dist。第二个使用矢量化方法和 broadcasting获得相同结果的速度提高了 1000 倍。

from __future__ import division
import numpy as np

def cos_dist(a, b):
    mod_a = np.sqrt(a.dot(a))
    mod_b = np.sqrt(b.dot(b))
    return a.dot(b) / mod_a / mod_b

a = np.random.rand(100, 4)

# Slow option
def slow_dist(a):
    items = a.shape[0]
    out_slow = np.ones((items,items))
    for j in xrange(items):
        for k in xrange(j+1, items):
            out_slow[j, k] = cos_dist(a[j], a[k])
            out_slow[k, j] = out_slow[j, k]
    return out_slow

# Faster option
from numpy.core.umath_tests import inner1d
def fast_dist(a):
    mod_a = np.sqrt(inner1d(a ,a))
    norm_a = a / mod_a[:, None]
    out_fast = inner1d(norm_a[:, None, :],
                       norm_a[None, :, :])
    return out_fast

时间安排如下:

In [2]: %timeit slow_dist(a)
10 loops, best of 3: 67.6 ms per loop

In [3]: %timeit fast_dist(a)
10000 loops, best of 3: 60.5 us per loop

In [4]: np.allclose(slow_dist(a), fast_dist(a))
Out[4]: True

关于matrix - 计算给定行向量矩阵的距离矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16470321/

相关文章:

JavaScript:我需要创建有关加法、乘法等矩阵运算的问题。如何在 HTML 页面上显示矩阵?

python - 相当于 itertools.product 的 Numpy

python - 大数据集上 numpy polyfit 的解读

python - 效率与可读性 : obfuscation when using nested boolean index arrays

vector - 操纵两个向量之间的距离

python - 将networkx图输入zss算法(树编辑距离)

具有固定项的整数分区的数组 [矩阵] 的 Java 数组

java - 方阵

c - 数组数据指向另一个数组中的另一个位置

MATLAB:函数返回单个值而不是向量