我正在实施一个隐马尔可夫模型,因此处理非常小的概率。我通过在日志空间中表示变量来处理下溢(因此x→log(x)),其副作用是乘法现在被添加替换,并且添加通过numpy.logaddexp
或类似处理。
是否有一种简单的方法来处理日志空间中的矩阵乘法?
答案 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可得出所需的结果。