python - 在 Python (NumPy) 中高效计算相似度矩阵

标签 python performance numpy vectorization similarity

XBxn numpy 矩阵,即

import numpy as np
B = 10
n = 2
X = np.random.random((B, n))

现在,我感兴趣的是计算所谓的内核(甚至相似度)矩阵 K,它的形状是 BxB,它的 { i,j}-th 元素给出如下:

K(i,j) = 乐趣(x_i, x_j)

其中 x_t 表示矩阵 X 的第 t 行,fun 的一些函数>x_i, x_j。例如,这个函数可以是所谓的 RBF 函数,即

K(i,j) = exp(-|x_i - x_j|^2).

为此,一种天真的方法如下:

K = np.zeros((B, B))
for i in range(X.shape[0]):
    x_i = X[i, :]
    for j in range(X.shape[0]):
        x_j = X[j, :]
        K[i, j] = np.exp(-np.linalg.norm(x_i - x_j, 2) ** 2)

我想做的是把上面的操作向量化,为了效率。你能帮忙吗?

最佳答案

如果您利用 broadcasting 的力量,这在 numpy 中当然是可能的.

您只需以矢量化方式编写内部距离范数计算代码:

X1 = X[:, np.newaxis, :]
X2 = X[np.newaxis, :, :]
K = np.exp(-np.sum((X1 - X2)**2, axis=-1))

关于python - 在 Python (NumPy) 中高效计算相似度矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48907216/

相关文章:

sql - 哪个更好 : Parsing big data each time from the DB or caching the result?

performance - 性能总是重要的吗?

python - 基于 bool 掩码选择行 - 为什么性能存在差异?

python - numpy/scipy 中的矢量化索引/切片?

python - 优化使用数组索引作为函数的嵌套 for 循环

android - Buildozer 未知命令/目标 android_old

Python- Matplotlib 将图形标题移动到 y 轴

python - Python 中 double 转换为十进制值 IEEE-754

python - 使用 LEPL 解析 boolean 搜索查询

java - 什么会导致次要 GC 时间和总暂停时间之间存在较大差异?