我有两个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,0,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
列。 (请不要在这里与行数和列数混淆。我确实确保保持矩阵乘法属性。)
答案 0 :(得分:1)
请记住, 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,0,2)
return (1/c) * logsumexp(c*(Astack+Bstack), axis=0)