CP分解和HOSVD分解

时间:2024-03-27 16:16:29

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

在上一节,学习向量乘积的时候,我们看到两个向量外积产生一个矩阵。我们可以推断出,三个向量做外积得出一个三维张量(其实是一种extension)。
数学上,我们可以用以下公式表示:
CP分解和HOSVD分解

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

matlab实例程序如下
CP分解和HOSVD分解

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

CP分解和HOSVD分解

CP分解和HOSVD分解

我们可以以公式写出秩R的张量T:
CP分解和HOSVD分解
其中 A = (a1,a2……aR) , B = (b1,b2……bR) , C = (c1,c2……cR)。A,B,C称为因子矩阵。
这个公式即是张量的CP分解。

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

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

1.SVD矩阵分解

该段内容参考自文章:https://blog.csdn.net/shenziheng1/article/details/52916278

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



特征值分解和奇异值分解两者有着很紧密的关系,特征值分解和奇异值分解的目的都是一样,就是提取出一个矩阵最重要的特征。先谈谈特征值分解吧:
1 特征值
如果说一个向量v是方阵A的特征向量,将一定可以表示成下面的形式:
CP分解和HOSVD分解
这时候λ就被称为特征向量v对应的特征值,一个矩阵的一组特征向量是一组正交向量。特征值分解是将一个矩阵分解成下面的形式:
CP分解和HOSVD分解
其中Q是这个矩阵A的特征向量组成的矩阵,Σ是一个对角阵,每一个对角线上的元素就是一个特征值。首先,要明确的是,一个矩阵其实就是一个线性变换,因为一个矩阵乘以一个向量后得到的向量,其实就相当于将这个向量进行了线性变换。比如说下面的一个矩阵:
CP分解和HOSVD分解
 它其实对应的线性变换是下面的形式:
CP分解和HOSVD分解
 因为这个矩阵M乘以一个向量(x,y)的结果是:
CP分解和HOSVD分解
上面的矩阵是对称的,所以这个变换是一个对x,y轴的方向一个拉伸变换(每一个对角线上的元素将会对一个维度进行拉伸变换,当值>1时拉长,当值<1时缩短),当矩阵不是对称的时候,假如说矩阵是下面的样子:
CP分解和HOSVD分解
它所描述的变换是下面的样子:
CP分解和HOSVD分解
这其实是在平面上对一个轴进行的拉伸变换(如蓝色的箭头所示),在图中,蓝色的箭头是一个最主要的变化方向(变化方向可能有不止一个),如果我们想要描述好一个变换,那我们就描述好这个变换主要的变化方向就好了。反过头来看看之前特征值分解的式子,分解得到的Σ矩阵是一个对角阵,里面的特征值是由大到小排列的,这些特征值所对应的特征向量就是描述这个矩阵变化方向(从主要的变化到次要的变化排列)
当矩阵是高维的情况下,那么这个矩阵就是高维空间下的一个线性变换,这个线性变化可能没法通过图片来表示,但是可以想象,这个变换也同样有很多的变换方向,我们通过特征值分解得到的前N个特征向量,那么就对应了这个矩阵最主要的N个变化方向。我们利用这前N个变化方向,就可以近似这个矩阵(变换)也就是之前说的:提取这个矩阵最重要的特征。总结一下,特征值分解可以得到特征值与特征向量,特征值表示的是这个特征到底有多重要,而特征向量表示这个特征是什么,可以将每一个特征向量理解为一个线性的子空间,我们可以利用这些线性的子空间干很多的事情。不过,特征值分解也有很多的局限,比如说变换的矩阵必须是方阵。
 2 奇异值:
下面重点谈谈奇异值分解。特征值分解是一个提取矩阵特征很不错的方法,但是它只是对方阵而言的,在现实的世界中,我们看到的大部分矩阵都不是方阵,比如说有N个学生,每个学生有M科成绩,这样形成的一个N * M的矩阵就不可能是方阵,我们怎样才能描述这样普通的矩阵呢的重要特征呢?奇异值分解可以用来干这个事情,奇异值分解是一个能适用于任意的矩阵的一种分解的方法:
CP分解和HOSVD分解
 假设A是一个N * M的矩阵,那么得到的U是一个N * N的方阵(里面的向量是正交的,U里面的向量称为左奇异向量),Σ是一个N * M的矩阵(除了对角线的元素都是0,对角线上的元素称为奇异值),V’(V的转置)是一个N * N的矩阵,里面的向量也是正交的,V里面的向量称为右奇异向量),如下图所示:
CP分解和HOSVD分解
那么奇异值和特征值是怎么对应起来的呢?首先,我们将一个矩阵A的转置 * A,将会得到一个方阵,我们用这个方阵求特征值可以得到:
CP分解和HOSVD分解
这里得到的v,就是我们上面的右奇异向量。此外我们还可以得到:
CP分解和HOSVD分解
这里的σ就是上面说的奇异值,u就是上面说的左奇异向量。奇异值σ跟特征值类似,在矩阵Σ中也是从大到小排列,而且σ的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。也就是说,我们也可以用前r大的奇异值来近似描述矩阵,这里定义一下部分奇异值分解:
CP分解和HOSVD分解
 r是一个远小于m、n的数,这样矩阵的乘法看起来像是下面的样子:
CP分解和HOSVD分解

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

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

2.HOSVD分解
  HOSVD分解将一个张量分解成一个核心张量(core tensor)和三个正交矩阵。
公式以及图示如下:
CP分解和HOSVD分解
CP分解和HOSVD分解

其中U1,U2,U3分别是张量做1-mode矩阵化,2-mode矩阵化,3-mode矩阵化后分别进行奇异值分解得到的不同的U。
举个例子:
假如张量为:
CP分解和HOSVD分解
其进行1-mode matricization后得到结果:
CP分解和HOSVD分解

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

则HOSVD中U1为CP分解和HOSVD分解
U2,U3以此类推……
而HOSVD中的核心张量g可以用原始张量T和U1,U2,U3算得。
CP分解和HOSVD分解

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