在Python中处理日志空间中的矩阵乘法

Bra*_*ton 7 python numpy

我正在实现一个隐马尔可夫模型,因此处理非常小的概率.我通过在日志空间中表示变量来处理下溢(所以x→log(x)),其副作用是乘法现在被加法替换,并且通过numpy.logaddexp或类似地处理加法.

有没有一种简单的方法来处理日志空间中的矩阵乘法?

小智 5

这是我能想到的最好的方法。

from scipy.special import logsumexp
def log_space_product(A,B):
    Astack = np.stack([A]*A.shape[0]).transpose(2,1,0)
    Bstack = np.stack([B]*B.shape[1]).transpose(1,0,2)
    return logsumexp(Astack+Bstack, axis=0)
Run Code Online (Sandbox Code Playgroud)

输入 A 和 B 是要相乘的矩阵 A 0和 B 0 的对数,函数返回 A 0 B 0 的对数。这个想法是,第i,在日志联J点(A 00)为A的第i行的点积的对数0和B的第j列0。所以它是A的第i行加上B的第j列的logsumexp。

在代码中,Astack 被构建所以 i,j 点是一个包含 A 的第 i 行的向量,Bstack 被构建所以 i,j 点是一个包含 B 第 j 列的向量。因此 Astack + Bstack 是一个 3D张量,其 i,j 点是 A 的第 i 行加上 B 的第 j 列。采用轴 = 0 的 logsumexp 然后给出所需的结果。