问题描述
我有两个numpy
个元素的a_log2
和b_log2
矩阵,我想在它们之间执行矩阵乘法。
log2
我曾经使用a = np.array([[0.4,0.4,0.2],[0.1,0.5,0.4]])
b = np.array([[0.3,0.7],[0.5,0.5],[0.2,0.8]])
a_log2 = np.log2(a)
b_log2 = np.log2(b)
执行e-based logarithms
的矩阵乘法。这是我使用的代码(感谢Erik Parkinson在此线程Handling matrix multiplication in log space in Python中的回答):
scipy.special.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,2))
log_sum_exp = logsumexp(Astack+Bstack,axis=0)
return log_sum_exp
和a_log2
之间的矩阵乘法,因为尚未为b_log2
定义scipy.special.logsumexp
。>
注意:
我首先计划使用base-2 logarithms
和natural logarithms
将矩阵元素转换为a_loge[i,j] = np.log(2**a_log2[i,j])
,然后使用上述b_loge[i,j] = np.log(2**b_log2[i,j])
方法执行矩阵乘法。
但是我拒绝这样做,因为最终将要使用的矩阵有log_space_product()
行和> 1000
列。 (请不要在这里与行数和列数混淆。我确实确保保持矩阵乘法属性。)
解决方法
请记住, log 2 (x)= ln(x)/ ln(2)。我们可以将其重写为 ln(x)= c log 2 (x),其中 c = ln(2)。因此,从底数到底数的日志空间之间的转换实际上就是一个乘法。
from scipy.special import logsumexp
def log_space_product(A,B,base=np.e):
c = np.log(base)
Astack = np.stack([A]*A.shape[0]).transpose(2,1,0)
Bstack = np.stack([B]*B.shape[1]).transpose(1,2)
return (1/c) * logsumexp(c*(Astack+Bstack),axis=0)