大家好我是python新手 我必须为类赋值实现套索L1回归。这涉及求解涉及块矩阵的二次方程。
minimize x^t * H * x + f^t * x
where x > 0
其中H是2×2块矩阵,其中每个元素是k维矩阵,并且x和f是2×1矢量,每个元素是k维矢量。
我在考虑使用ndarrays。
这样:
np.shape(H) = (2, 2, k, k)
np.shape(x) = (2, k)
但我发现np.dot(X,H)在这里不起作用。 有没有简单的方法来解决这个问题?提前致谢。
答案 0 :(得分: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)
答案 1 :(得分:1)
np.einsum
可以很好地控制哪些轴相加。
np.einsum('ijkl,jk',H,x)
是一种可能的(广义)点积,(2,4)(H的第一个和最后一个暗点)
np.einsum('ijkl,jl',H,x)
是另一个。您需要明确 - x
的哪个维度与H
中的哪个维度相符。