[英]Multiplying Block Matrices in Numpy
大家好我是python新手我必須為課堂作業實施套索L1回歸。 這涉及求解涉及塊矩陣的二次方程。
minimize x^t * H * x + f^t * x
where x > 0
其中H是2×2塊矩陣,其中每個元素是ak維矩陣,x和f是2×1矢量,每個元素是ak維矢量。
我在考慮使用ndarrays。
這樣:
np.shape(H) = (2, 2, k, k)
np.shape(x) = (2, k)
但我發現np.dot(X,H)在這里不起作用。 有沒有簡單的方法來解決這個問題? 提前致謝。
首先,我確信轉換為矩陣將導致更高效的計算。 說明,如果你認為你的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)
np.einsum
很好地控制哪些軸相加。
np.einsum('ijkl,jk',H,x)
是一種可能的(廣義)點積,(2,4)(H的第一個和最后一個暗點)
np.einsum('ijkl,jl',H,x)
是另一個。 你需要明確 - x
哪個維度與H
哪個維度相關。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.