【问题标题】:Multiplying Block Matrices in Numpy在 Numpy 中乘以块矩阵
【发布时间】:2013-11-13 11:08:27
【问题描述】:

大家好,我是python新手 我必须为课堂作业实施套索 L1 回归。这涉及求解涉及块矩阵的二次方程。

minimize x^t * H * x  + f^t * x 
where x > 0

其中 H 是一个 2 X 2 块矩阵,每个元素是一个 k 维矩阵,x 和 f 是一个 2 X 1 向量,每个元素都是一个 k 维向量。

我正在考虑使用 ndarrays。

这样:

  np.shape(H) = (2, 2, k, k)
  np.shape(x) = (2, k)

但我发现 np.dot(X, H) 在这里不起作用。 有没有简单的方法来解决这个问题?提前致谢。

【问题讨论】:

    标签: python numpy matrix machine-learning regression


    【解决方案1】:

    首先,我相信转换为矩阵将导致更高效的计算。说明,如果您认为您的 2k x 2k 矩阵是 2 x 2 矩阵,那么您在向量空间的张量积中操作,并且必须使用 tensordot 而不是 dot

    试一试,例如 k=5:

    >>> import numpy as np
    >>> k = 5
    

    定义我们的矩阵a和向量x

    >>> a = np.arange(1.*2*2*k*k).reshape(2,2,k,k)
    >>> x = np.arange(1.*2*k).reshape(2,k)
    >>> x
    array([[ 0.,  1.,  2.,  3.,  4.],
           [ 5.,  6.,  7.,  8.,  9.]])
    

    现在我们可以乘以我们的张量。一定要选择正确的轴,我没有明确测试过下面的公式,可能会有错误

    >>> result = np.tensordot(a,x,([1,3],[0,1]))
    >>> result
    array([[  985.,  1210.,  1435.,  1660.,  1885.],
           [ 3235.,  3460.,  3685.,  3910.,  4135.]])
    >>> np.shape(result)
    (2, 5)
    

    【讨论】:

    • @AdaXu,不客气。如果您的问题得到解决,请随时将最有用的答案标记为已接受,learn how and why
    【解决方案2】:

    np.einsum 可以很好地控制对哪些轴求和。

    np.einsum('ijkl,jk',H,x)
    

    是一种可能的(广义)点积,(2,4)(H 的第一个和最后一个暗点)

    np.einsum('ijkl,jl',H,x)
    

    是另一个。您需要明确 - x 的哪些维度与 H 的哪个维度相匹配。

    【讨论】:

    • 非常感谢!我会调查 einsum
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    相关资源
    最近更新 更多