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

时间:2016-04-07 04:56:33

标签: python numpy

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

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

1 个答案:

答案 0 :(得分:0)

这是我想出的最好方法。

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)

输入A和B是要相乘的矩阵A 0 和B 0 的对数,函数返回A 0的对数 B 0 。这个想法是log(A 0 B 0 )中的i,j点是A 0 和B 0 的第j列。因此,它是A的第i行加上B的第j列的对数表达式。

在代码中,构建了Astack,所以i,j点是包含A的第i行的向量,而构建了Bstack,因此i,j点是包含B的第j列的向量。因此,Astack + Bstack是一个3D张量,其i,j点是A的第i行加上B的第j列。取轴= 0的logumexp可得出所需的结果。