1.4 张量操作

定义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
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值