二、张量 CP 分解

1. 张量的几个概念


  1. 张量的内积

           相同大小的两个张量 X , Y ∈ R I 1 × I 2 × ⋯ × I N \mathcal{X},\mathcal{Y} \in \mathbb{R}^{I_1 \times I_2 \times \dots \times I_N} X,YRI1×I2××IN ,其内积为对应位置的元素相乘后,将所有位置的乘积累加,可以用公式表示为:
    ⟨ X , Y ⟩ = ∑ i 1 = 1 I 1 ∑ i 2 = 1 I 2 ⋯ ∑ i N = 1 I N x i 1 i 2 … i N y i 1 i 2 … i N \langle\mathcal{X}, \mathcal{Y} \rangle = \sum_{i_1=1}^{I_1}\sum_{i_2=1}^{I_2} \dots \sum_{i_N=1}^{I_N} x_{i_1i_2\dots i_N} y_{i_1i_2\dots i_N} X,Y=i1=1I1i2=1I2iN=1INxi1i2iNyi1i2iN

  2. 张量的范数

           张量的范数可以类比矢量的模,它表示为张量自身的内积再开平方,对张量 X ∈ R I 1 × I 2 × ⋯ × I N \mathcal{X} \in\mathbb{R}^{I_1 \times I_2 \times \dots \times I_N} XRI1×I2××IN 其范数为:
    ∣ ∣ X ∣ ∣ = ∑ i 1 = 1 I 1 ∑ i 2 = 1 I 2 ⋯ ∑ i N = 1 I N x i 1 i 2 … i N 2 ||\mathcal{X}|| = \sqrt{\sum_{i_1=1}^{I_1}\sum_{i_2=1}^{I_2}\dots\sum_{i_N=1}^{I_N}x^2_{i_1i_2\dots i_N}} X=i1=1I1i2=1I2iN=1INxi1i2iN2

  3. 矢量的外积

           两个矢量的外积是一个矩阵,三个矢量的外积是一个三阶矩阵。计算三个矢量的外积,我们可以用前两个矢量外积的矩阵,分别乘以第三个矢量的每个元素,得到第若干个矩阵按照正面切片拼接为新的张量。

           对矢量 a ⃗ = ( 1 , 2 ) T , b ⃗ = ( 3 , 4 ) T , c ⃗ = ( 5 , 6 , 7 ) T \vec{a}=(1,2)^T,\vec{b}=(3,4)^T,\vec{c}=(5,6,7)^T a =(1,2)Tb =(3,4)Tc =(5,6,7)T 其外积记为
    X = a ⃗ ∘ b ⃗ ∘ c ⃗ \mathcal{X}=\vec{a} \circ \vec{b} \circ \vec{c} X=a b c

    先来看 a ⃗ ∘ b ⃗ \vec{a} \circ \vec{b} a b ,可以得到
    a ⃗ ∘ b ⃗ = [ 1 2 ] [ 3 4 ] = [ 3 4 6 8 ] \vec{a} \circ \vec{b}= \begin{bmatrix} 1 \\ 2 \end{bmatrix} \begin{bmatrix} 3 & 4 \end{bmatrix}= \begin{bmatrix} 3 & 4 \\ 6 & 8 \end{bmatrix} a b =[12][34]=[3648]

    我们用 c ⃗ \vec{c} c 的第一个元素和上面的矩阵相乘,得到第一个切片,即
    X : : 1 = 5 [ 3 4 6 8 ] = [ 15 20 30 40 ] \mathcal{X}_{::1}=5 \begin{bmatrix} 3 & 4 \\ 6 & 8 \end{bmatrix}=\begin{bmatrix} 15 & 20 \\ 30 & 40 \end{bmatrix} X::1=5[3648]=[15302040]

    X : : 2 = 6 [ 3 4 6 8 ] = [ 18 24 36 48 ] \mathcal{X}_{::2}=6 \begin{bmatrix} 3 & 4 \\ 6 & 8 \end{bmatrix}=\begin{bmatrix} 18 & 24 \\ 36 & 48 \end{bmatrix} X::2=6[3648]=[18362448]

    X : : 3 = 7 [ 3 4 6 8 ] = [ 21 28 42 56 ] \mathcal{X}_{::3}=7 \begin{bmatrix} 3 & 4 \\ 6 & 8 \end{bmatrix}=\begin{bmatrix} 21 & 28 \\ 42 & 56 \end{bmatrix} X::3=7[3648]=[21422856]

  4. 秩一张量

           对于一个 N N N 阶张量 X ∈ R I 1 × I 2 × ⋯ × I N \mathcal{X} \in\mathbb{R}^{I_1 \times I_2 \times \dots \times I_N} XRI1×I2××IN ,如果可以被写成 N N N 个向量的外积,则这个张量的秩为 1 ,这个张量称为秩一张量,记为:
    X = a ( 1 ) ∘ a ( 2 ) ∘ ⋯ ∘ a ( N ) \mathcal{X} = a^{(1)} \circ a^{(2)} \circ \dots \circ a^{(N)} X=a(1)a(2)a(N)

           每个张量的元素都可以写成这些向量对应位置元素之积:
    x i 1 i 2 … i N = a i 1 ( 1 ) ∘ a i 2 ( 2 ) ∘ ⋯ ∘ a i N ( N ) x_{i_1i_2\dots i_N} = a^{(1)}_{i_1} \circ a^{(2)}_{i_2} \circ \dots \circ a^{(N)}_{i_N} xi1i2iN=ai1(1)ai2(2)aiN(N)

  5. 张量的秩

           张量 X \mathcal{X} X 的秩定义为用秩一张量之和来精确表示 X \mathcal{X} X 所需要的秩一张量的最少个数,记为 r a n k ( X ) rank(\mathcal{X}) rank(X)

  6. 对称和对角

    立方张量:各 mode 的长度相等的张量。

    对称张量:如果一个立方张量的各元素再下标的任意排列下是常数,称该张量是对称的。

    超对称张量:当立方张量中的任何一个元素的索引被置换后元素值不变时,称这个张量为超对称的。如,对于一个三阶张量,如果各元素满足以下等式,则被称之为超对称。
    x i j k = x i k j = x j i k = x j k i = x k i j = x k j i i , j , k = 1 , … , I x_{ijk} = x_{ikj} = x_{jik} = x_{jki} = x_{kij} = x_{kji} \quad i, j, k = 1,\dots,I xijk=xikj=xjik=xjki=xkij=xkjii,j,k=1,,I

    对角张量:如果一个张量 X ∈ R I 1 × I 2 × ⋯ × I N \mathcal{X} \in\mathbb{R}^{I_1 \times I_2 \times \dots \times I_N} XRI1×I2××IN 的任何元素只有在 i 1 = i i = ⋯ = i N i_1 = i_i= \cdots =i_N i1=ii==iN 的时候不为零,被称为对角张量。


2. 矩阵的分解


矩阵分解是指将一个矩阵分解成两个或者多个矩阵的乘积。这里我们先介绍几种矩阵分解的方式。

2.1 非负矩阵分解

定义:对于矩阵 X ∈ R D × N X \in R^{D \times N} XRD×N ,非负矩阵分解的目的是找到两个非负 U D × R , V R × N U^{D \times R},V^{R \times N} UD×R,VR×N ,使得它们的乘积近似等于 X X X 即:
X ≈ U V T X \approx UV^T XUVT

可以看出,非负矩阵的目的就是找到 U , V U,V U,V 使得 U V T UV^T UVT 最大可能的和 X X X 相等。这里我们定义一种方式来衡量 U V T UV^T UVT X X X 接近的程度,称为代价函数。如果两个非负矩阵 A A A B B B ,我们定义它们之间的代价函数为
∥ A − B ∥ 2 = ∑ i j ( A i j − B i j ) 2 \|A-B\|^2=\sum_{ij}(A_{ij}-B_{ij})^2 AB2=ij(AijBij)2

那么非负矩阵的分解的目的就可以演变为求
m i n { ∥ X − U V T ∥ } min\{\|X-UV^T\|\} min{XUVT}

即使以上等式最接近 0 的 U , V U,V U,V的最优解。

上述关于 U , V U,V U,V 的代价函数是非凸的,基本的做法是交替优化 U 和 V 从而得到 一个局部最优解。


2.2 本征值分解(EVD)

       给定一个 m × m m \times m m×m 的矩阵 A A A m m m 维归一向量 v \pmb{v} vvv 与标量 λ \lambda λ ,当其满足 A v = λ v A\pmb{v}=\lambda\pmb{v} Avvv=λvvv 时,称 v \pmb{v} vvv λ \lambda λ 分别为 A A A 的本征值和本征向量,我们可以通过线性代数中求特征值和特征向量的方式求出所有的本征值和本征向量。

       本征值分解就是对于一个 m × m m \times m m×m 的矩阵 A A A (即 A = A T A=A^T A=AT) ,可以将其分解为如下的形式
A = Q Λ Q T A = Q \Lambda Q^T A=QΛQT

其中 Q Q Q A A A 的本征向量组成的正交矩阵, Λ \Lambda Λ 是本征值为对角线元素构成的对角矩阵,也称为本征谱。

       在特征值分解中有一个 最大本征值问题 :假设矩阵本征值为实数,求解给定矩阵的最大本征值及其对应的本征向量。该问题可以转化为如下问题,给定矩阵 A A A ,求解归一化向量 v \pmb{v} vvv ,使得函数
f = ∣ v T A v ∣ f=|v^TAv| f=vTAv

的值极大化。

从线性代数可以证明,该问题的解为 A A A 的绝对值最大的本征向量,而且对应的 f f f 的值为该本征向量对应的本征值,也是最大的一个本征值。

最大本征值问题有一种求解方法为幂级数法,通过证明我们可以得到如下等式:
lim ⁡ K → ∞ M K = Γ 0 K u ( 0 ) u ( 0 ) T \lim_{K\rightarrow\infty} M^K=\Gamma_0^K u_{(0)}u_{(0)}^T KlimMK=Γ0Ku(0)u(0)T

其中, Γ 0 \Gamma_0 Γ0 u ( 0 ) u_{(0)} u(0) 是绝对值最大的本征值与对应的本征向量。


用 python 求解本征值和本征向量

我们可以用 numpy 库中的函数来求解本征值和本征向量,代码如下:

import numpy as np
dim = 4          #设置矩阵的维数
M = np.random.randn(dim, dim)      #随机化一个 dim × dim 大小的矩阵
M = M + M.T  # 对称化以保证本征分解存在; .T 是对矩阵进行转置
print(M)    

lm, u = np.linalg.eig(M)      #该函数计算矩阵 M 的本征值和本征向量,并将本征值组成列表返回给 lm ,将每个本征向量作为 u 的一列,组成矩阵
print('\n Eigenvalues:')
print(lm)
print('\n Eigenvectors:')
print(u)

输出结果如下
在这里插入图片描述


2.3 奇异值分解(SVD)

       特征值分解对矩阵有着较高的要求,它需要被分解的矩阵 A A A 为实对称矩阵,但是现实中,我们所遇到的问题一般不是实对称矩阵,奇异值分解就是将一个一般性的 m × n m \times n m×n 的矩阵 A A A ,分解为
A = U Σ V T A = U\Sigma V^T A=UΣVT

的形式,其中 U , V U,V U,V 均为单位正交矩阵,即有 U U T = I UU^T=I UUT=I V V T = I VV^T=I VVT=I U U U 称为 左奇异矩阵 V V V 称为 右奇异矩阵 Σ \Sigma Σ 是将 A A A 的特征值降序排列在主对角线上的对角矩阵,对角线上的值称为 奇异值 。其中矩阵 U ∈ R m × m ,   Σ ∈ R m × n ,   V ∈ R n × n U \in R^{m\times m},\ \Sigma \in R^{m\times n},\ V \in R^{n\times n} URm×m, ΣRm×n, VRn×n

在这里插入图片描述

我们如何对奇异值和奇异矩阵求解呢?通过上面的式子,我们可以得到如下的等式:
A A T = U Σ V T V Σ T U T = U Σ Σ T U T AA^T =U\Sigma V^TV\Sigma^TU^T =U\Sigma \Sigma^TU^T AAT=UΣVTVΣTUT=UΣΣTUT

A T A = V Σ T U T U Σ V T = V Σ T Σ V T A^TA=V\Sigma^TU^TU\Sigma V^T=V\Sigma^T\Sigma V^T ATA=VΣTUTUΣVT=VΣTΣVT

因为 A A T AA^T AAT A A T AA^T AAT 是对称矩阵,则通过对上面两个等式求它们的特征值和特征向量,就可以求出 U , V , Σ U,V,\Sigma U,V,Σ

奇异值分解的性质:

  1. 奇异值分解可以降维
           如果 A A A 表示 n n n m m m 维向量,可以通过奇异值分解表示成 m + n m+n m+n r r r 维向量。若A的秩远远小于 m m m n n n ,则通过奇异值分解可以降低 A A A 的维数。可以计算出,当 r < m n m + n + 1 r < \frac{mn}{m+n+1} r<m+n+1mn 时,可以达到降维的目的,同时可以降低计算机对存储器的要求。
  2. 奇异值对矩阵的扰动不敏感
           特征值对矩阵的扰动是敏感的。在数学上可以证明,奇异值的变化不会超过相应矩阵的变化,即对任何的相同阶数的实矩阵 A 、 B A、B AB 按从大到小排列的奇异值 α i \pmb{\alpha}_i αααi ω i \pmb{\omega}_i ωωωi
    ∑ ∣ α i − ω i ∣ ≤ ∥ A − B ∥ 2 \sum |\pmb{\alpha}_i - \pmb{\omega}_i| \leq \|A-B\|_2 αααiωωωiAB2
  3. 奇异值具有比例不变性。
           即 α A \alpha A αA 的奇异值是 A A A 的奇异值的 ∣ α ∣ |\alpha| α 倍。
  4. 奇异值具有旋转不变性。
           若 P P P 是正交矩阵, P A PA PA 的奇异值与 A A A 的奇异值相同。

矩阵的低秩近似问题

首先我们来定义矩阵的秩,在奇异值分解中,非零奇异值的个数称为该矩阵的秩。那么我们便可以引出矩阵的低秩近似问题,该问题可以描述为:对于给定的 m × n m×n m×n 的矩阵 A A A ,设其秩为 R R R ,求解秩为 R ′ R^{'} R 的矩阵 M ′ M^{'} M ,其中 R > R ′ > 0 R>R^{'}>0 R>R>0 ,使两矩阵之间的范数最小,即求尽可能小的 ε \varepsilon ε
ε = ∥ M − M ′ ∥ = ∑ i j ( M i j − M i j ′ ) 2 ∼ ∥ Σ R ′ : R − 1 ∥ \varepsilon=\|M-M^{'}\|=\sqrt{\sum_{ij}(M_{ij} - M_{ij}^{'})^2 } \sim \| \Sigma_{R^{'}:R-1}\| ε=MM=ij(MijMij)2 ΣR:R1

ε \varepsilon ε 又称为裁剪误差,上式后面的式子为 Σ \Sigma Σ 的后面几个奇异值的范数,我们可以直接求出裁剪误差。

该低秩问题的最优解为:
M ′ = U [ : , 0 : R ′ − 1 ]   Σ [ 0 : R ′ − 1 , 0 : R ′ − 1 ]   V [ : , 0 : R ′ − 1 ] M^{'}=U[:,0:R^{'}-1] \ \Sigma [0:R^{'}-1,0:R^{'}-1] \ V[:,0:R^{'}-1] M=U[:,0:R1] Σ[0:R1,0:R1] V[:,0:R1]

即取 U U U 的前 R ′ R^{'} R 个列向量组成的矩阵, Σ \Sigma Σ 的前 R ′ R^{'} R 个特征值组成的对角阵, V V V 的前 R ′ R^{'} R 个列向量组成的矩阵的转置,它们的乘积得到的矩阵就是 M ′ M^{'} M 。即下图所示:
在这里插入图片描述

用 python 实现奇异值分解

奇异值分解我们可以直接使用 np.linalg.svd 函数来实现,具体代码如下:

import numpy as np
M=M = np.random.randn(5, 5)
U, S, V = np.linalg.svd(M)  #返回三个矩阵使得 M=USV
print(U)
print(S)
print(V)

运行结果为:
在这里插入图片描述

通过奇异值的低秩近似可以用来压缩图片,一张图片可以视为一个矩阵 M M M,我们对该矩阵进行奇异值分解,用上面的低秩近似的方法求秩为 R ′ R^{'} R R ′ R^{'} R 的大小可以自由选择, R ′ R^{'} R 越大,图片越清晰,但是压缩率越小)的矩阵,也就是对求得的 U , Σ , V U,\Sigma ,V U,Σ,V 取前 R ′ R^{'} R 个向量和值的乘积构成新的图片,也就是压缩后的图片。下面的代码展示了这个应用:

import numpy as np
import cv2
import matplotlib.pyplot as plt
import scipy.sparse.linalg as la

img = cv2.imread('./Imgs/example2.jpg')  # 读取RGB图片
img = np.sum(img, axis=2) / 3      #将RGB图片的三张分量R,G,B矩阵相加后每个元素除以三,得到灰度图

def img_compress(img, k):        
    u, lm, v = la.svds(img, k=k)   #该函数可以直接求出取k个特征值和特征向量时的奇异值分解
    img1 = u.dot(np.diag(lm)).dot(v)   #将奇异值分解得到的矩阵相乘得到压缩后的图片
    return img1

img1 = img_compress(img, 20)     #取前 20 个特征值进行压缩后的图片
img2 = img_compress(img, 200)    #取前 200 个特征值进行压缩后的图片

plt.subplot(1,3,1)               #用 1 × 3 的排列方式在第一个位置显示图片
plt.imshow(img)
plt.subplot(1,3,2)               #用 1 × 3 的排列方式在第二个位置显示图片
plt.imshow(img1)
plt.subplot(1,3,3)               #用 1 × 3 的排列方式在第三个位置显示图片
plt.imshow(img2)

plt.show()                       #显示整张图

得到的结果图片如下,可以发现,随着选取特征值个数的增多,图片更加清晰,但是压缩率会更小。
在这里插入图片描述


3. CP 分解


       CP 分解是一种对张量进行拆分的方法,其核心思想是用有限个秩一张量的和来 近似 地表示该张量。
在这里插入图片描述
       如上图所示,如果要把一个三阶张量 X ∈ R I × J × K \mathcal{X}\in\mathbb{R}^{I \times J \times K} XRI×J×K 进行分解,我们期望结果如下:
X ≈   a 1 ∘ b 1 ∘ c 1 + a 2 ∘ b 2 ∘ c 2 + ⋯ + a R ∘ b R ∘ c R = ∑ r = 1 R a r ∘ b r ∘ c r \begin{aligned} \mathcal{X} \approx & \ a_1 \circ b_1 \circ c_1 + a_2 \circ b_2 \circ c_2 + \cdots + a_R \circ b_R \circ c_R \\ = &\sum_{r=1}^R a_r \circ b_r \circ c_r \end{aligned} X= a1b1c1+a2b2c2++aRbRcRr=1Rarbrcr

如果我们记
A = [ a 1 a 2 … a R ] \mathrm{A} = \begin{bmatrix} a_1 & a_2 & \dots & a_R \end{bmatrix} A=[a1a2aR]

B = [ b 1 b 2 … b R ] \mathrm{B} = \begin{bmatrix} b_1 & b_2 & \dots & b_R\end{bmatrix} B=[b1b2bR]

C = [ c 1 c 2 … c R ] \mathrm{C} = \begin{bmatrix} c_1 & c_2 & \dots &c_R\end{bmatrix} C=[c1c2cR]

我们称 A , B , C A,B,C A,B,C 为因子矩阵,则张量可以表示为
X ≈ [  ⁣ [ A , B , C ]  ⁣ ] ≡ ∑ r = 1 R a r ∘ b r ∘ c r \mathcal{X} \approx [\![\mathrm{A,B,C}]\!] \equiv \sum_{r=1}^R \mathrm{a}_r \circ \mathrm{b}_r \circ \mathrm{c}_r X[[A,B,C]]r=1Rarbrcr

这个公示就是张量的 CP 分解。

这里有个性质: R a n k ( A ) + R a n k ( B ) + R a n k ( C ) ≥ 2 R + 2 Rank(A)+Rank(B)+Rank(C) \geq 2R+2 Rank(A)+Rank(B)+Rank(C)2R+2

       通常为了计算便利,我们假设 A , B A,B A,B C C C 的列向量都是归一化的,我们引入一个权重向量 λ ∈ R R \lambda\in\mathbb{R}^R λRR,来表示每个秩一矩阵所占权重,则分解可以记为如下形式:
X ≈ [  ⁣ [ λ   ;   A , B , C ]  ⁣ ] ≡ ∑ r = 1 R λ r   a r ∘ b r ∘ c r \mathcal{X} \approx [\![\lambda \, ; \, \mathrm{A,B,C}]\!] \equiv \sum_{r=1}^R \lambda_r \: \mathrm{a}_r \circ \mathrm{b}_r \circ \mathrm{c}_r X[[λ;A,B,C]]r=1Rλrarbrcr

       三阶张量是应用当中最为广泛也往往是足够满足我们需求的张量。但是对于一个N阶的张量 X ∈ R I 1 × I 2 × ⋯ × I N \mathcal{X}\in\mathbb{R}^{I_1\times I_2 \times \dots \times I_N} XRI1×I2××IN ,其 CP 分解可以被写为:
X ≈ [  ⁣ [ λ   ; A ( 1 ) , A ( 2 ) , … , A ( N ) ]  ⁣ ] ≡ ∑ r = 1 R λ r   a r ( 1 ) ∘ a r ( 1 ) ∘ ⋯ ∘ a r ( N ) \mathcal{X} \approx [\![\lambda \:; \mathrm{A}^{(1)}, \mathrm{A}^{(2)},\dots,\mathrm{A}^{(N)}]\!] \equiv \sum_{r=1}^R \lambda_r \: \mathrm{a}_r^{(1)} \circ \mathrm{a}_r^{(1)}\circ \dots \circ \mathrm{a}_r^{(N)} X[[λ;A(1),A(2),,A(N)]]r=1Rλrar(1)ar(1)ar(N)

其中 λ ∈ R R \lambda \in \mathbb{R}^R λRR A ( n ) ∈ R I n   ×   R \mathrm{A}^{(n)}\in \mathbb{R}^{I_n\,\times \ R} A(n)RIn× R

分解的切片表示

       利用因子矩阵,一个三阶张量的 CP 分解可以被等价写作以下矩阵形式,其左侧都是张量的对应的 mode 的矩阵化:
X ( 1 ) ≈ A ( C ⊙ B ) T X ( 2 ) ≈ B ( C ⊙ A ) T X ( 3 ) ≈ C ( B ⊙ A ) T \mathrm{X}_{(1)} \approx \mathrm{A}(\mathrm{C}\odot \mathrm{B})^\mathsf{T}\\ \mathrm{X}_{(2)} \approx \mathrm{B}(\mathrm{C}\odot \mathrm{A})^\mathsf{T}\\ \mathrm{X}_{(3)} \approx \mathrm{C}(\mathrm{B}\odot \mathrm{A})^\mathsf{T} X(1)A(CB)TX(2)B(CA)TX(3)C(BA)T

以上的模型还可以用张量的正面切片方式表示为:
X ( k ) ≈ A D ( k ) B T \mathcal{X}_{(k)} \approx \mathrm{A}\mathrm{D}^{(k)}\mathrm{B}^\mathsf{T} X(k)AD(k)BT

其中 D ( k ) ≡ diag ( c k : ) , k = 1 , . . . , K \mathrm{D}^{(k)} \equiv \text{diag}(c_{k:}),k=1,...,K D(k)diag(ck:),k=1,...,K ,整个表示可以用下图表示:

在这里插入图片描述对于高维的张量,其 mode - n 矩阵化可以写为:
X ( n ) ≈ A ( n ) Λ ( A ( N ) ∘ ⋯ ∘ A ( n + 1 ) ∘ A ( n − 1 ) ⋅ ⋯ ⋅ A ( 1 ) ) T \mathrm{X}_{(n)}\approx \mathrm{A}^{(n)}\Lambda(\mathrm{A}^{(N)}\circ \dots \circ \mathrm{A}^{(n+1)} \circ \mathrm{A}^{(n-1)} \cdot \dots \cdot \mathrm{A^{(1)})^\mathsf{T}} X(n)A(n)Λ(A(N)A(n+1)A(n1)A(1))T

其中 Λ = d i a g ( λ ) \Lambda = diag(\lambda) Λ=diag(λ)


张量的秩分解

       上面我们已经介绍了张量的秩,其值为为表示张量所需秩一张量的最小数目,精确确定表示张量的每个秩一张量就是 秩分解 。CP 分解是对张量的近似表示,因此可以将秩分解视为 CP 分解的特例。

       虽然张量秩的定义和矩阵类似,但他们的性质之间存在很多不同。其中一个不同便是在 R \R R C \mathbb{C} C 之下, 张量可以存在不同的秩。如,对于正面切片如下的张量:
X 1 = [ 1 0 0 1 ] , X 2 = [ 0 1 − 1 0 ] \mathrm{X}_1 = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} \quad ,\quad \mathrm{X}_2 = \begin{bmatrix} 0 & 1 \\ -1 & 0\end{bmatrix} X1=[1001]X2=[0110]

这个张量在 R \R R 下的秩为 3 ,但是在 C \mathbb{C} C 下的秩为 2 。其 R \R R 下的秩分解 X = [  ⁣ [ A , B , C ]  ⁣ ] \mathcal{X} = [\![\mathrm{A}, \mathrm{B}, \mathrm{C}]\!] X=[[A,B,C]] 为:
A = [ 1 0 1 0 1 − 1 ] , B = [ 1 0 1 0 1 1 ] , C = [ 1 1 0 − 1 1 1 ] \mathrm{A} = \begin{bmatrix}1 & 0 & 1 \\ 0 & 1 & -1 \end{bmatrix}, \quad \mathrm{B} = \begin{bmatrix}1 & 0 & 1 \\ 0 & 1 & 1 \end{bmatrix}, \quad \mathrm{C} = \begin{bmatrix}1 & 1 & 0 \\ -1 & 1 & 1 \end{bmatrix} A=[100111],B=[100111],C=[111101]

C \mathbb{C} C 之下的秩分解为:
A = 1 2 [ 1 1 − i i ] , B = 1 2 [ 1 1 i − i ] , C = 1 2 [ 1 1 i − i ] \mathrm{A} = \frac{1}{\sqrt{2}}\begin{bmatrix} 1 & 1 \\ -i & i \end{bmatrix}, \quad \mathrm{B} = \frac{1}{\sqrt{2}}\begin{bmatrix} 1 & 1 \\ i & -i \end{bmatrix}, \quad \mathrm{C} = \frac{1}{\sqrt{2}}\begin{bmatrix} 1 & 1 \\ i & -i \end{bmatrix} A=2 1[1i1i],B=2 1[1i1i],C=2 1[1i1i]

注意:张量的秩没有一个简单直接的求法,直接求秩本身已被证明是 NP - hard 问题。


CP 分解的计算

       张量的秩没有直接的求法,但是如果想要进行 CP 分解,必须要知道张量的秩,那么我们怎么计算 CP 分解呢?从理想上说,如果数据是没有噪音的而且在确定了张量的秩后,其 CP 分解的计算方法是已知的,那么我们可以假设张量的秩依次为 R = 1 , 2 , 3 , ⋯ R=1,2,3,\cdots R=1,2,3, ,用该秩去计算 CP 分解,直到得到分解的拟合精度达到 100%。

       那么如果我们假设了张量的秩为 R ,那么计算方法是什么样的呢?现在在给定秩之后计算 CP 分解的方法有很多,其中的一种方法 ALS(alternating least squares)(交替最小方差法),是一类比较有效的算法。

       在数学最优化问题中,拉格朗日乘数法是用来寻找多元函数的极值的方法。这种方法将一个有 n n n 个变量与 k k k 个约束条件的最优化问题转换为一个有 n + k n + k n+k 个变量的方程组的极值问题,其变量不受任何约束。这种方法引入了一种新的标量未知数,即拉格朗日乘数:即形成方程的线性组合里每个矢量的系数。CP 分解的计算可以转换为 ALS 的一个子问题。

       我们用非负矩阵里面的代价函数来衡量 CP 分解得到结果的相似度,以三阶张量为例,我们令
X ^ = [  ⁣ [ λ   ;   A , B , C ]  ⁣ ] ≡ ∑ r = 1 R λ r   a r ∘ b r ∘ c r \hat{\mathcal{X}}= [\![\lambda \, ; \, \mathrm{A,B,C}]\!] \equiv \sum_{r=1}^R \lambda_r \: \mathrm{a}_r \circ \mathrm{b}_r \circ \mathrm{c}_r X^=[[λ;A,B,C]]r=1Rλrarbrcr

那么 CP 分解的计算就转变为求
min ⁡ ∥ X − X ^ ∥ \min \| \mathcal{X}-\hat{\mathcal{X}}\| minXX^

求使上式尽可能小的 X ^ \hat{\mathcal{X}} X^ 就能得到最终的结果。

上面的问题可以作为 ALS 的一个子问题,因为分解可以表示为
X ( 1 ) ≈ A ( C ⊙ B ) T \mathrm{X}_{(1)} \approx \mathrm{A}(\mathrm{C}\odot \mathrm{B})^\mathsf{T} X(1)A(CB)T

则问题可以转变为固定 B , C B,C B,C ,求解
min ⁡ ∥ X ( 1 ) − A  diag ( λ ) ( C ⊙ B ) T ∥ \min \| \mathrm{X}_{(1)}-A \ \text{diag}(\lambda)(C \odot B)^T \| minX(1)A diag(λ)(CB)T

可以得到
A  diag ( λ ) = X ( 1 ) [ ( C ⊙ B ) T ] H = X ( 1 ) ( C ⊙ B ) ( C T C ∗ B T B ) H A \ \text{diag}(\lambda)= \mathrm{X}_{(1)}\big[(\mathrm{C}\odot \mathrm{B})^{\mathsf{T}}\big]^H = \mathrm{X}_{(1)}(\mathrm{C} \odot \mathrm{B})(\mathrm{C}^{\mathsf{T}}\mathrm{C} * \mathrm{B}^{\mathsf{T}}\mathrm{B})^H A diag(λ)=X(1)[(CB)T]H=X(1)(CB)(CTCBTB)H

再通过归一化分别求出 A A A λ \lambda λ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值