如何有效地计算嵌套循环中上三角的logsumexp?

2024-05-20 02:31:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个嵌套for循环,它迭代权重矩阵的行,并将logsumexp应用于这些权重行的外部加法矩阵的上三角部分。这是非常缓慢,所以我试图找出如何加快这一点,要么矢量化或取出循环,而不是矩阵运算。你知道吗

'''
Wm: weights matrix, nxk
W: updated weights matrix, nxn
triu_inds: upper triangular indices of Wxy outer matrix
'''

for x in range(n-1):
    wx = Wm[x, :]
    for y in range(x+1, n):
        wy = Wm[y, :]
        Wxy = np.add.outer(wx, wy)
        Wxy = Wxy[triu_inds]
        W[x, y] = logsumexp(Wxy)

logsumexp:计算输入数组的指数和的对数

a: [1, 2, 3]
logsumexp(a) = log( exp(1) + exp(2) + exp(3) )

输入数据Wm是nxk维的权重矩阵。K表示一个传感器位置,n表示所有这些可能的传感器位置。Wm中的值基本上是患者传感器与已知传感器之间的距离。你知道吗

示例:

Wm  = [1   2   3]
      [4   5   6]
      [7   8   9]
      [10 11  12]

wx  = [1   2   3]
wy  = [4   5   6]

Wxy = [5   6   7]
      [6   7   8]
      [7   8   9]

triu_indices = ([0, 0, 1], [1, 2, 2])
Wxy[triu_inds] = [6, 7, 8]
logsumexp(Wxy[triu_inds]) = log(exp(6) + exp(7) + exp(8))

Tags: for矩阵传感器matrix权重wxwmweights
1条回答
网友
1楼 · 发布于 2024-05-20 02:31:50

可以对全矩阵Wm执行外积,然后交换与操作数1中的列和操作数2中的行对应的轴,以便将三角形索引应用于列。所有行的组合都将填充生成的矩阵,因此需要选择上三角部分。你知道吗

W = logsumexp(
    np.add.outer(Wm, Wm).swapaxes(1, 2)[(slice(None),)*2 + triu_inds],
    axis=-1  # Perform summation over last axis.
)
W = np.triu(W, k=1)

相关问题 更多 >