tensor的mode-n展开和mode-n乘积

1 tensor的mode-n矩阵开展

1.1 tensor的mode-n fibers

了解mode-n fibers能帮助你更好的理解tensor的mode-n展开,这里用一个三维tensor X ∈ R I × J × K X \in R^{I\times J \times K} XRI×J×K作为例子,由于这个tensor有三个维度,所以可以从三个不同的方向将其分割成一个个列向量,如下图所示:
在这里插入图片描述
从上到下的方向称为mode-1方向,从左到右的方向称为mode-2方向,从前往后的方向称为mode-3方向。沿mode-n方向将tensor分割得到的一个个列向量称为该tensor的mode-n fibers。

要得到 X X X的mode-n fibers,可以固定除第n维以外的其他维度的坐标,此时取出第n维度的所有的元素,即为 X X X的一个mode-n fibers。举例来说, X X X的mode-1 fibers可表示为 X [ : , j , k ]     j ∈ [ 0 , J )     k ∈ [ 0 , K ) X[:,j,k]\ \ \ j\in[0,J)\ \ \ k\in[0,K) X[:,j,k]   j[0,J)   k[0,K) X X X的mode-3 fibers则可以表示为 X [ i , j , : ]     i ∈ [ 0 , I )     j ∈ [ 0 , J ) X[i,j,:]\ \ \ i\in[0,I)\ \ \ j\in[0,J) X[i,j,:]   i[0,I)   j[0,J)

同理,如果这个tensor是四维的,则它的mode-4 fibers可表示为 X [ i , j , k , : ]     i ∈ [ 0 , I )     j ∈ [ 0 , J )     k ∈ [ 0 , K ) X[i,j,k,:]\ \ \ i\in[0,I)\ \ \ j\in[0,J)\ \ \ k\in[0,K) X[i,j,k,:]   i[0,I)   j[0,J)   k[0,K),其中i,j,k均取整数。

1.2 tensor 的mode-n展开矩阵

在得到tensor的mode-n fibers之后,将所有fibers排列在一起即可得到该tensor的mode-n展开矩阵(每个fibers都可以看成是一个列向量)。

那么应该按怎样的顺序来排列mode-n fibers呢?

对于展开矩阵中的第 j j j列mode-n fibers,j的位置可通过如下公式得到:
在这里插入图片描述
这个式子很枯燥,说实话,我并没有搞懂j的计算方式,不过我搞清楚了三维tensor展开为矩阵的mode-n排列方式,通过代码能更清晰的展示它的排列顺序,下面是python的代码实现:

import numpy as np
# 矩阵X,具体见代码之后的例子,这是一个简单的3x4x2的tensor
X = [[[a0+d*3, a0+d*3+12] for d in range(0,4)] for a0 in range(1,4)]
X = np.array(X)

#-------------------------unfolding(tensor的矩阵化)-------------------------#
fibers_mode1 = [X[:,j,k] for k in range(0,2) for j in range(0,4)]
fibers_mode2 = [X[i,:,k] for k in range(0,2) for i in range(0,3)]
fibers_mode3 = [X[i,j,:] for j in range(0,4) for i in range(0,3)]
unfold_mode1 = np.array(fibers_mode1).T  # mode-1展开结果
unfold_mode2 = np.array(fibers_mode2).T  # mode-2展开结果
unfold_mode3 = np.array(fibers_mode3).T  # mode-3展开结果

举例来说,
mode-1展开是先增加fibers X [ : , j , k ] X[:,j,k] X[:,j,k]的第二维坐标,再增加第三维坐标,将按顺序遍历的fibers依次加入到展开矩阵中;
mode-2展开是先增加fibers X [ i , : , k ] X[i,:,k] X[i,:,k]的第一维坐标,再增加第三维坐标,将按顺序遍历的fibers依次加入到展开矩阵中;
mode-3展开是先增加fibers X [ i , j , : ] X[i,j,:] X[i,j,:]的第一维坐标,再增加第二维坐标,将按顺序遍历的fibers依次加入到展开矩阵中。

按照归纳法进行推测,对N个维tensor进行mode-n展开,应当依次增加fibers X [ i , j , . . . , n − 1 , : , n + 1 , . . . , N ] X[i,j,...,n-1,:,n+1,...,N] X[i,j,...,n1,:,n+1,...,N]中第 1 , 2 , . . . n − 1 , n + 1 , . . . N 1,2,...n-1,n+1,...N 1,2,...n1,n+1,...N维的坐标,将其依次组加入到展开矩阵中。

在上面的代码中, X X X是3x4x2的tensor,它由矩阵 X 1 X_1 X1 X 2 X_2 X2组成,其中 X [ : , : , 0 ] = X 1 ; X [ : , : , 1 ] = X 2 , X 1 和 X 2 X[:,:,0]=X_1; X[:,:,1]=X_2,X_1 和X_2 X[:,:,0]=X1;X[:,:,1]=X2X1X2的取值如下:在这里插入图片描述
它的三种mode-n 展开 X ( 1 ) , X ( 2 ) , X ( 3 ) X_{(1)}, X_{(2)}, X_{(3)} X(1),X(2),X(3)分别为:
在这里插入图片描述

2 tensor的mode-n乘法

2.1 tensor的mode-n slice

先了解tensor的mode-n slice(切片)能帮助你更好的理解tensor的mode-n乘法,对于一个三维tensor,可以从三个不同的方向对其进行切片,示意图如下:
在这里插入图片描述

2.2 tensor的 mode-n 乘法

现在可以聊一聊mode-n乘法的方式了。tensor X ∈ R I × J × K X\in R^{I\times J \times K} XRI×J×K和矩阵 U U U的mode-n乘法,其过程为U的第i个行向量和 X X X的所有mode-n fibers做内积,得到结果的第i个mode-n slice,将得到的所有mode-n slice组合起来即为mode-n的乘积结果。

补充GPT对mode-1乘积的介绍:
三维张量的mode-1乘积是指将一个三维张量与一个矩阵沿着第一个模态(通常对应于张量的第一个维度)相乘。这种乘积会改变张量的第一个维度,而保持其他维度不变。具体来说,如果我们有一个三维张量 X \mathcal{X} X的尺寸为 ( I 1 × I 2 × I 3 ) (I_1 \times I_2 \times I_3) (I1×I2×I3),以及一个矩阵 M \mathbf{M} M的尺寸为 ( J × I 1 ) (J \times I_1) (J×I1),那么它们的mode-1乘积将产生一个新的三维张量 Y \mathcal{Y} Y,其尺寸为 ( J × I 2 × I 3 ) (J \times I_2 \times I_3) (J×I2×I3)
mode-1乘积的计算可以通过以下步骤进行:

  1. 将三维张量 X \mathcal{X} X展开成一个矩阵 X ( 1 ) \mathbf{X}_{(1)} X(1),这个过程称为mode-1展开(matricization),得到的矩阵的尺寸为 ( I 1 × ( I 2 ⋅ I 3 ) ) (I_1 \times (I_2 \cdot I_3)) (I1×(I2I3))
  2. 计算矩阵 M \mathbf{M} M与矩阵 X ( 1 ) \mathbf{X}_{(1)} X(1)的乘积,得到一个新的矩阵 Y ( 1 ) = M ⋅ X ( 1 ) \mathbf{Y}_{(1)} = \mathbf{M} \cdot \mathbf{X}_{(1)} Y(1)=MX(1),其尺寸为 ( J × ( I 2 ⋅ I 3 ) ) (J \times (I_2 \cdot I_3)) (J×(I2I3))
  3. 将矩阵 Y ( 1 ) \mathbf{Y}_{(1)} Y(1)重新折叠成三维张量 Y \mathcal{Y} Y,这个过程是mode-1展开的逆过程,得到的三维张量的尺寸为 ( J × I 2 × I 3 ) (J \times I_2 \times I_3) (J×I2×I3)

举例来说,假设 X X X为1.2节所提到的 X X X U = [ [ 1 , 3 , 5 ] , [ 2 , 4 , 6 ] ] U = [[1,3,5],[2,4,6]] U=[[1,3,5],[2,4,6]],两者的mode-1乘积记为 Y = X × 1 U Y=X_{\times 1}U Y=X×1U,则 Y Y Y的mode-1 slice为 U U U的第一个行向量 [ 1 , 3 , 5 ] [1,3,5] [1,3,5] X X X的所有mode-1 fibers的乘积,结果为:
在这里插入图片描述
将两个mode-1 slice按照mode-1的方向(从上到下的方向)组织起来,得到mode-1 乘积的结果。

其代码实现如下:

# mode-1 乘积 U 2x3
U = np.array([[1,3,5],[2,4,6]]);
# @是numpy中定义的矩阵乘积,这里是一个行向量乘以一个列向量
product = [[[U[m,:]@X[:,j,k] for k in range(0,2)] for j in range(0,4)] for m in range(0,2)]
product_mode1 = np.array(product)  # 2x4x2

对于mode-2、mode-3 乘积,这里分别给出一个例子:

# mode-2乘积 V 1x4
V = np.array([1,2,3,4]).reshape(1,4)
product = [[[V[m,:]@X[i,:,k] for k in range(0,2)] for m in range(0,1)] for i in range(0,3)]
product_mode2 = np.array(product)  # 3x1x2

# mode-3乘积 W 4x2
W = np.arange(0,10).reshape(5,2)
product = [[[W[m,:]@X[i,j,:] for m in range(0,)] for j in range(0,4)] for i in range(0,3)]
product_mode3 = np.array(product)  # 3x4x5

2.3 tensor mode-n的应用

那么这个mode-n乘积可以怎么使用呢?

我想到的一个场景是RGB图像转为灰度图,通过加权方式将每个RGB像素(三元组)转为一个灰度值,(x,y)位置上的RGB像素转化为灰度值的计算公式为: 0.3 ∗ R [ x , y ] + 0.59 ∗ G [ x , y ] + 0.11 ∗ B [ x , y ] 0.3*R[x,y] + 0.59*G[x,y]+0.11*B[x,y] 0.3R[x,y]+0.59G[x,y]+0.11B[x,y],其中R、G、B表示三个通道对应的矩阵。

将加权系数组织为矩阵,得 W = [ 0.3 , 0.59 , 0.11 ] ∈ R 1 × 3 W=[0.3,0.59,0.11]\in R^{1\times 3} W=[0.3,0.59,0.11]R1×3,对于任意大小的RGB图像 X ∈ R h × w × 3 X\in R^{h \times w \times 3} XRh×w×3,将它和 W W W进行mode-3乘积,便可以得到对应的灰度图 X ^ ∈ R h × w × 1 \hat X \in R^{h \times w \times 1} X^Rh×w×1

参考资料:Tensor Decomposition and Applications

  • 17
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值