• 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展开结果
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    举例来说,
    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,它由矩阵 𝑋 1 𝑋_1 X1 𝑋 2 𝑋_2 X2组成,其中 X [ : , : , 0 ] = 𝑋 1 ; X [ : , : , 1 ] = 𝑋 2 , 𝑋 1 和 𝑋 2 X[:,:,0]=𝑋_1; X[:,:,1]=𝑋_2,𝑋_1 和𝑋_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的乘积结果。

    举例来说,假设 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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    对于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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    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

  • 相关阅读:
    Matlab:Matlab编程语言学习之常用运算操作符、常用函数(逻辑函数、运算函数、交互函数等)简介、使用方法之详细攻略
    10、JAVA入门——多重循环及程序调试
    Idea上传gitee注意事项,push reject错误
    MySQL基本知识
    [附源码]计算机毕业设计springboot驾校预约管理系统
    无CUDA支持的dlib库的安装与使用
    [云原生k8s] k8s之持久化存储PV、PVC
    本地MQTT协议消息服务远程连接教程介绍
    计算CAF FV值的demo code
    Python_豆瓣电影&保存excel
  • 原文地址:https://blog.csdn.net/GodNotAMen/article/details/126362930