一、CP分解(CANDECAMP/PARAFAC)
这是较为古老的一种张量分解方法。最早的研究历史可以追溯到1927年。

在上一节,学习向量乘积的时候,我们看到两个向量外积产生一个矩阵。我们可以推断出,三个向量做外积得出一个三维张量(其实是一种extension)。

数学上,我们可以用以下公式表示:

matlab emd分解例子_特征向量

我们可以将三个向量的外积结果以张量的三种矩阵化形式写出:

matlab emd分解例子_matlab emd分解例子_02

matlab实例程序如下

matlab emd分解例子_matlab emd分解例子_03

我们都知道,矩阵的秩是矩阵中的最大的不相关的向量的个数。那么张量的秩是什么概念呢?
文中提出,把能够以用三个向量外积直接表示的张量称作秩一张量。
如果一个张量能够以两个秩一张量的和表示,那么其秩则为2。
如果一个张量能够以三个秩一张量的和表示,那么其秩为3。
以此类推…

matlab emd分解例子_特征值_04

matlab emd分解例子_特征向量_05

我们可以以公式写出秩R的张量T:

matlab emd分解例子_特征值_06


其中 A = (a1,a2……aR) , B = (b1,b2……bR) , C = (c1,c2……cR)。A,B,C称为因子矩阵。

这个公式即是张量的CP分解。

这里有一个性质:Rank(A)+Rank(B)+Rank(C) >=2R+2
即各因子矩阵的秩之和大于等于2R+2

求解CP分解一般用的算法是交替最小二乘法(ALS)算法(Alternating Least Squares algorithm)。
这个在后面会详细再写。

二、HOSVD分解
HOSVD分解又称作Tucker分解。由Tucker在1936年提出。
HOSVD全名为high order SVD,即高阶的SVD。所以我们要先了解一下SVD原理,才能更好地了解HOSVD。

1.SVD矩阵分解

该段内容参考自文章:

  矩阵分解就是将一个较为复杂的矩阵分解成一些小矩阵,而这些小矩阵往往带有原来矩阵的一些特征。矩阵分解有很多种方式,特征值分解,LU分解(三角分解),奇异值分解等等。



特征值分解和奇异值分解两者有着很紧密的关系,特征值分解和奇异值分解的目的都是一样,就是提取出一个矩阵最重要的特征。先谈谈特征值分解吧:
1 特征值
如果说一个向量v是方阵A的特征向量,将一定可以表示成下面的形式:

matlab emd分解例子_特征向量_07



这时候λ就被称为特征向量v对应的特征值,一个矩阵的一组特征向量是一组正交向量。特征值分解是将一个矩阵分解成下面的形式:


matlab emd分解例子_奇异值分解_08



其中Q是这个矩阵A的特征向量组成的矩阵,Σ是一个对角阵,每一个对角线上的元素就是一个特征值。首先,要明确的是,一个矩阵其实就是一个线性变换,因为一个矩阵乘以一个向量后得到的向量,其实就相当于将这个向量进行了线性变换。比如说下面的一个矩阵:


matlab emd分解例子_奇异值分解_09



 它其实对应的线性变换是下面的形式:


matlab emd分解例子_matlab emd分解例子_10



 因为这个矩阵M乘以一个向量(x,y)的结果是:


matlab emd分解例子_特征向量_11



上面的矩阵是对称的,所以这个变换是一个对x,y轴的方向一个拉伸变换(每一个对角线上的元素将会对一个维度进行拉伸变换,当值>1时拉长,当值<1时缩短),当矩阵不是对称的时候,假如说矩阵是下面的样子:


matlab emd分解例子_奇异值分解_12



它所描述的变换是下面的样子:


matlab emd分解例子_奇异值分解_13



这其实是在平面上对一个轴进行的拉伸变换(如蓝色的箭头所示),在图中,蓝色的箭头是一个最主要的变化方向(变化方向可能有不止一个),如果我们想要描述好一个变换,那我们就描述好这个变换主要的变化方向就好了。反过头来看看之前特征值分解的式子,分解得到的Σ矩阵是一个对角阵,里面的特征值是由大到小排列的,这些特征值所对应的特征向量就是描述这个矩阵变化方向(从主要的变化到次要的变化排列)
当矩阵是高维的情况下,那么这个矩阵就是高维空间下的一个线性变换,这个线性变化可能没法通过图片来表示,但是可以想象,这个变换也同样有很多的变换方向,我们通过特征值分解得到的前N个特征向量,那么就对应了这个矩阵最主要的N个变化方向。我们利用这前N个变化方向,就可以近似这个矩阵(变换)。也就是之前说的:提取这个矩阵最重要的特征。总结一下,特征值分解可以得到特征值与特征向量,特征值表示的是这个特征到底有多重要,而特征向量表示这个特征是什么,可以将每一个特征向量理解为一个线性的子空间,我们可以利用这些线性的子空间干很多的事情。不过,特征值分解也有很多的局限,比如说变换的矩阵必须是方阵。
 2 奇异值:
下面重点谈谈奇异值分解。特征值分解是一个提取矩阵特征很不错的方法,但是它只是对方阵而言的,在现实的世界中,我们看到的大部分矩阵都不是方阵,比如说有N个学生,每个学生有M科成绩,这样形成的一个N * M的矩阵就不可能是方阵,我们怎样才能描述这样普通的矩阵呢的重要特征呢?奇异值分解可以用来干这个事情,奇异值分解是一个能适用于任意的矩阵的一种分解的方法:



matlab emd分解例子_特征向量_14




matlab emd分解例子_奇异值分解_15



那么奇异值和特征值是怎么对应起来的呢?首先,我们将一个矩阵A的转置 * A,将会得到一个方阵,我们用这个方阵求特征值可以得到:



matlab emd分解例子_特征向量_16


这里得到的v,就是我们上面的右奇异向量。此外我们还可以得到:



matlab emd分解例子_特征值_17



这里的σ就是上面说的奇异值,u就是上面说的左奇异向量。奇异值σ跟特征值类似,在矩阵Σ中也是从大到小排列,而且σ的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。也就是说,我们也可以用前r大的奇异值来近似描述矩阵,这里定义一下部分奇异值分解:


matlab emd分解例子_特征向量_18



 r是一个远小于m、n的数,这样矩阵的乘法看起来像是下面的样子:


matlab emd分解例子_matlab emd分解例子_19



 右边的三个矩阵相乘的结果将会是一个接近于A的矩阵,在这儿,r越接近于n,则相乘的结果越接近于A。而这三个矩阵的面积之和(在存储观点来说,矩阵面积越小,存储量就越小)要远远小于原始的矩阵A,我们如果想要压缩空间来表示原矩阵A,我们存下这里的三个矩阵:U、Σ、V就好了。

  个人感觉SVD最重要的一点就是U矩阵中每一行代表着原来矩阵的一个特征,而矩阵Σ中对角线值的大小代表着这些特征的重要程度。此外,奇异值分解缩小了需要的存储空间,原来需要mn的存储空间,奇异值分解之后就只需要mr + r + n*r的存储空间。

2.HOSVD分解

  HOSVD分解将一个张量分解成一个核心张量(core tensor)和三个正交矩阵。

公式以及图示如下:

matlab emd分解例子_奇异值分解_20


matlab emd分解例子_特征向量_21

其中U1,U2,U3分别是张量做1-mode矩阵化,2-mode矩阵化,3-mode矩阵化后分别进行奇异值分解得到的不同的U。

举个例子:

假如张量为:

matlab emd分解例子_奇异值分解_22


其进行1-mode matricization后得到结果:

matlab emd分解例子_matlab emd分解例子_23

对该矩阵进行奇异值分解得到:

matlab emd分解例子_特征向量_24

则HOSVD中U1为

matlab emd分解例子_特征向量_25


U2,U3以此类推……

而HOSVD中的核心张量g可以用原始张量T和U1,U2,U3算得。

matlab emd分解例子_特征值_26

跟SVD一样,HOSVD中的核心张量core代表着原始张量的某些特征,而U1,U2,U3代表着这些特征的重要程度。具体的还需要后面进一步研究。