淺談張量分解(四):外積、Kronecker積和張量積

在維基百科上,外積(Outer product - Wikipedia)被解釋為:

In linear algebra, an outer product is the tensor product of two coordinate vectors, a special case of the Kronecker product of matrices.

雖然這個解釋很簡明,但當我們看完這段話後,可能會產生以下兩點疑問:

  • 為什麼外積能被認為是Kronecker積的特例呢?
  • 外積與張量積(tensor product)有什麼關係?

圍繞這兩點疑問,我們來討論一下容易混淆的外積、Kronecker積和張量積。

1 Kronecker積

在之前的淺談張量分解(二):張量分解的數學基礎一文中,我們已經知道了Kronecker積的運算規則,給定一個大小為m_1	imes m_2的矩陣A和一個大小為n_1	imes n_2的矩陣B,則矩陣A和矩陣B的Kronecker積為

Aotimes B = left[ egin{array}{cccc} a_{11}B & a_{12}B & cdots & a_{1m_2}B \ a_{21}B & a_{22}B & cdots & a_{2m_2}B \ vdots & vdots & ddots & vdots \ a_{m_11}B & a_{m_12}B & cdots & a_{m_1m_2}B \ end{array} 
ight]

很明顯,矩陣Aotimes B的大小為left( m_1n_1 
ight) 	imes left( m_2n_2 
ight) ,即行數為m_1n_1,列數為m_2n_2,符號「otimes 」表示Kronecker積。當給定兩個向量,如vec u=left[ egin{array}{c} 1 \ 2 \ end{array} 
ight]vec v=left[ egin{array}{c} 3 \ 4 \ end{array} 
ight]時,我們可以很輕鬆地計算出Kronecker積為vec u otimes vec v=left[ egin{array}{c} 3 \ 4 \ 6 \ 8 \ end{array} 
ight]

import numpy as npa = np.array([[1], [2]])b = np.array([[3], [4]])np.kron(a, b)np.outer(a, b)np.kron(a, b.T)

然而,向量vec u, vec v的外積卻為vec u circ vec v = vec u vec v^T=left[ egin{array}{cc} 3 & 4 \ 6 & 8 \ end{array} 
ight],是一個大小為2 	imes 2的矩陣。我們發現Kronecker積與外積並不相同。Kronecker product and outer product confusion認為這種不一致是由符號的「濫用」造成的。

不妨將Kronecker積的符號記作otimes _K,外積的符號記作otimes _O(註:一般用符號 circ 表示),則有

vec u otimes_O vec v=vec u otimes_K vec v^T.

雖然嚴格意義上的Kronecker積的計算結果和外積的不同,但這種不同僅僅體現在每個元素的擺放位置不同,而且vec u otimes_K vec v^T等價於vec u vec v^T,確實可以用來計算外積。若給定向量 vec u = left[ egin{array}{c} u_1 \ u_2 \ end{array} 
ight]vec v = left[ egin{array}{c} v_1 \ v_2 \ v_3 \ end{array} 
ight]vec w = left[ egin{array}{c} w_1 \ w_2 \ end{array} 
ight] ,則它們外積為

mathcal{X} = left[ egin{array}{c} u_1 \ u_2 \ end{array} 
ight] circ left[ egin{array}{c} v_1 \ v_2 \ v_3 \ end{array} 
ight] circ left[ egin{array}{c} w_1 \ w_2 \ end{array} 
ight]

Leftrightarrow left[ egin{array}{c} x_{111} \ x_{211} \ x_{121} \ x_{221} \ x_{131} \ x_{231} \ x_{112} \ x_{212} \ x_{122} \ x_{222} \ x_{132} \ x_{232} \ end{array} 
ight] = left[ egin{array}{c} u_1v_1w_1 \ u_2v_1w_1 \ u_1v_2w_1 \ u_2v_2w_1 \ u_1v_3w_1 \ u_2v_3w_1 \ u_1v_1w_2 \ u_2v_1w_2 \ u_1v_2w_2 \ u_2v_2w_2 \ u_1v_3w_2 \ u_2v_3w_2 \ end{array} 
ight] =vec w otimes vec v otimes vec u .

因此,我們依然可以認為外積是Kronecker積的特例。

2 張量積

簡單來說,張量積的定義為:給定兩個有限維的向量空間(finite dimensional vector space)VW,其中,vec v_1,...,vec v_m為向量空間V的基(basis),vec w_1,...,vec w_n為向量空間W的基,則我們可以將Votimes W定義為mnvec v_i otimes vec w_j的線性組合,即

Votimes W=sum_{i,j}{c_{ij}left(vec v_i otimes vec w_j
ight)}.

同時,雙線性映射(bilinear map,如果僅僅關注張量積的計算,則不必深究這個概念)被定義為

B:V 	imes W 
ightarrow V otimes W

其中,B left(sum_i {a_i vec v_i}, sum_j {b_j vec w_j}
ight) = sum_{i,j}{a_i b_jleft(vec v_i otimes vec w_j
ight)},對於任意取自向量空間VW下的向量,我們都可以用相應的基進行線性組合來表示出來,若a_i,i=1,...,m為向量vec v_i線性組合的係數,b_j,j=1,...,n為向量vec w_j線性組合的係數,則滿足a_i b_j=c_{ij}。另外,V 	imes W表示兩個向量空間的Cartesian積(維基鏈接:Cartesian product)。

為了便於理解,這裡舉一個簡單的例子(來源:Calculate the tensor product of two vectors)。

已知mathbb{R}^2下的一組標準基為vec e_1=left(1, 0
ight) ^Tvec e_2=left(0, 1
ight) ^Tmathbb{R}^3下的一組標準基為vec f_1=left(1,0,0 
ight)^Tvec f_2=left(0,1,0 
ight)^Tvec f_3=left(0,0, 1 
ight)^T。給定向量vec x=left[ egin{array}{c} 1 \ 1 \ end{array} 
ight]=vec e_1+vec e_2,向量vec y=left[ egin{array}{c} 1 \ -2 \ 1 \ end{array} 
ight]=vec f_1-2 vec f_2 +vec f_3,則向量vec x,vec y的張量積為

vec x otimes vec y=sum_{i=1}^{2} sum_{j=1}^{3}x_iy_j left(vec e_i otimes vec f_j
ight)

=vec e_1 otimes vec f_1-2vec e_1 otimes vec f_2+vec e_1 otimes vec f_3+vec e_2 otimes vec f_1-2vec e_2 otimes vec f_2+vec e_2 otimes vec f_3=left[ egin{array}{ccc} 1 & -2 & 1 \ 1 & -2 & 1 \ end{array} 
ight]=vec xvec y^T

其中,vec e_i otimes vec f_jmathbb{R}^2 otimes mathbb{R}^3的基,張量積與外積的計算結果完全相同。

import numpy as npx = np.array([[1], [1]])y = np.array([[1], [-2], [1]])np.kron(x, y.T)np.outer(x, y)

對於任意向量vec xvec{y},它們的張量積vec xotimes vec y有時被稱為外積,如果vec e_iotimes vec f_jmathbb {R}^m otimes mathbb {R}^n的基,且vec e_ivec f_j 是標準基,則外積可以寫成如下形式:

vec xotimes vec y=sum_{i=1}^m sum_{j=1}^n {c_{ij}left(vec e_i otimes vec f_j
ight)}

其中,c_{ij}是矩陣vec xvec y^Ti行、第j列的元素。

對於向量而言,張量積和外積是等價的。

3 推薦閱讀:秩一(rank one)矩陣和外積的聯繫

在矩陣分解和張量分解中,我們總不免見到rank one這個詞,另外,我們也知道「秩一」與向量的外積密切相關,因此,對秩一矩陣和外積的聯繫感興趣的讀者可閱讀Rank of a Decomposable Tensor和Is there meaning for uv^T?上的回答。

附錄——張量積的性質:

(1) (vec a+vec b) otimes vec c=vec a otimes vec c+vec b otimes vec c, vec a otimes (vec b+vec c)=vec aotimes vec b+vec aotimes vec c;

(2) (lambda vec a)otimes vec b=vec aotimes (lambda vec b)=lambda (vec aotimes vec b),lambda in mathbb {R}.


推薦閱讀:

外代數的楔積之間的內積到底怎麼算?

TAG:矩阵计算 | 线性代数 | 张量 |