在Numpy中乘以块矩阵

Ada*_* Xu 5 python regression numpy machine-learning matrix

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

minimize x^t * H * x  + f^t * x 
where x > 0
Run Code Online (Sandbox Code Playgroud)

其中H是2×2块矩阵,其中每个元素是ak维矩阵,x和f是2×1矢量,每个元素是ak维矢量.

我在考虑使用ndarrays.

这样:

  np.shape(H) = (2, 2, k, k)
  np.shape(x) = (2, k)
Run Code Online (Sandbox Code Playgroud)

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

alk*_*lko 1

首先,我确信转换为矩阵将带来更有效的计算。说明,如果您将 2k x 2k 矩阵视为 2 x 2 矩阵,那么您将在向量空间的张量积中进行操作,并且必须使用tensordot代替dot

让我们尝试一下,以 k=5 为例:

>>> import numpy as np
>>> k = 5
Run Code Online (Sandbox Code Playgroud)

定义我们的矩阵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.]])
Run Code Online (Sandbox Code Playgroud)

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

>>> 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)
Run Code Online (Sandbox Code Playgroud)