【问题标题】:Method of matrix multiplication between two numpy matrices of log2 elementslog2元素的两个numpy矩阵之间的矩阵乘法方法
【发布时间】:2020-11-04 16:09:07
【问题描述】:

我有两个numpy 矩阵a_log2b_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)

我曾经使用scipy.special.logsumexp 执行e-based logarithms 的矩阵乘法。这是我使用的代码(感谢 Erik Parkinson 在此线程 Handling matrix multiplication in log space in Python 中的回答):

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_log2b_log2 之间的矩阵乘法,因为scipy.special.logsumexp 没有为base-2 logarithms 定义。

注意: 我最初打算使用a_loge[i, j] = np.log(2**a_log2[i, j])b_loge[i, j] = np.log(2**b_log2[i, j])将矩阵元素转换为natural logarithms,然后使用前面提到的log_space_product()方法进行矩阵乘法。

但我拒绝自己这样做,因为我最终将使用的矩阵有> 1000 行和> 20 列。 (不要对这里的行数和列数感到困惑。我确实确保矩阵乘法属性保持不变。

【问题讨论】:

    标签: python numpy matrix logarithm


    【解决方案1】:

    记住 log2(x) = ln(x)/ln(2)。我们可以用 c = ln(2) 将其重写为 ln(x) = c log2(x)。因此,与具有不同基数的日志空间之间的转换实际上是一个乘法。

    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)
    

    【讨论】:

    • 谢谢。顺便说一句,它不应该是“c = np.log(2)”而不是“c=np.log(np.e)”,因为我们的目标对数底数是 2?
    • @MdMorshedAlam 我写了一个通用函数,我认为使用自然日志作为默认值是最有意义的。在您的情况下,由于您在以 2 为基数的日志空间中工作,因此您可以致电 log_space_product(A, B, base=2)
    • 知道了。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 2014-11-13
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 2017-07-08
    相关资源
    最近更新 更多