我正在实现一个隐马尔可夫模型,因此处理非常小的概率.我通过在日志空间中表示变量来处理下溢(所以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 0乙0)为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 然后给出所需的结果。
| 归档时间: |
|
| 查看次数: |
531 次 |
| 最近记录: |