定义1.17 Mode-n Unfolding
An = tl.unfold(X,mode=n)
例如mode0展开,X的第0位就是矩阵的第0维,接下来是000,001,002这样子排
比如X[0,:,:]是这样的
展开的X0就是这样的,把X[0.:.:]变成了一行
1.5.2 模式积
式1.43和1.45的验证
A = tl.tensor(np.array([[[1,14,15],[23,6,20],[24,18,8],[24,18,8]],
[[15,8,7],[28,12,17],[21,29,23],[24,18,8]],
[[9,5,3],[7,22,26],[21,1,19],[24,18,8]]]))
# J*I1
U0 = np.array([[1,3,7],
[3,5,7]])
V1 = np.array([[1,3,7,1],
[3,5,7,4],
[3,5,7,8]])
C = tl.tenalg.mode_dot(A,U0,0)
C_unfold0 = tl.unfold(C,mode=0)
UA0 = U0@tl.unfold(A,mode=0)
存在这种性质:
交换顺序的证明:
AUV = tl.tenalg.multi_mode_dot(A,[U0,V1],[0,1])
AVU = tl.tenalg.multi_mode_dot(A,[V1,U0],[1,0])
模式n合并性质的证明
A = tl.tensor(np.array([[[1,14,15],[23,6,20],[24,18,8]],
[[15,8,7],[28,12,17],[21,29,23]],
[[9,5,3],[7,22,26],[21,1,19]]]))
U0 = np.array([[1,3,7],
[3,5,7],
[5,1,4]])
V1 = np.array([[1,3,1],
[3,7,4],
[5,7,8]])
AVU = tl.tenalg.multi_mode_dot(A,[V1,U0],[0,0])
dirAUV = tl.tenalg.multi_mode_dot(A,[U0@V1],[0])
注意,如果要用skip且用上了modes,则mode列表的长度要和张量阶次相等,不然可能会出错
B = tl.tensor(np.array([[[1,14,15],[23,6,20],[24,18,8]],
[[15,8,7],[28,12,17],[21,29,23]],
[[9,5,3],[7,22,26],[21,1,19]]]))
U0 = np.array([[1,3,7],
[3,5,7],
[5,1,4]])
U1 = np.array([[111,13,17],
[34,45,27],
[54,71,54]])
U2 = np.array([[11,1.3,17],
[4,4.5,2.7],
[4,7,54]])
B03hat = tl.tenalg.multi_mode_dot(B,[U0,U1,U2],skip=1, modes=[0,1,2],transpose=True)
B03 = tl.tenalg.mode_dot(tl.tenalg.mode_dot(B,U0.T,0),U2.T,2)
B1hat = tl.tenalg.multi_mode_dot(B,[U0,U1],skip=0, modes=[0,1],transpose=True)
B1 = tl.tenalg.mode_dot(B,U1.T,1)
连续模式积的性质,证明过程,详见Multilinear operators for higher-order decompositions但是,这个tensor unfoldding是大端顺序,而tensorly和我们平常用的是小端顺序
所以常用的话,应该把上面的克罗内克积顺序颠倒,即A(1)A(2)。。。A(N)
python代码处理:
# 模式积连乘
B = tl.tensor(np.array([[[1,14,15],[23,6,20],[24,18,8]],
[[15,8,7],[28,12,17],[21,29,23]],
[[9,5,3],[7,22,26],[21,1,19]]]))
U0 = np.array([[1,3,7],
[5,1,4]])
U1 = np.array([[111,13,17],
[54,71,54]])
U2 = np.array([[11,1.3,17],
[4,7,54]])
X0 = tl.unfold(tl.tenalg.multi_mode_dot(B,[U0,U1,U2]),mode=0)
# 小端
X0hat0 = U0@tl.unfold(B,mode=0)@(tl.tenalg.kronecker([U1, U2]).T)
# 大端
X0hat1 = U0@tl.unfold(B,mode=0)@(tl.tenalg.kronecker([U2, U1]).T)
同样的,向量化vectorization满足
因为
其中这种下标记法为:,就是动的时候先动3,3动完了再动1