张量
张量是向量或矩阵在维度空间上的高阶扩展。
一个
(
p
,
q
)
(p,q)
(p,q)型的张量
T
T
T被定义为一个多重线性映射。
T
:
V
∗
×
⋯
×
V
∗
×
V
×
⋯
×
V
↦
R
,
T:V^* \times \dots \times V^* \times V \times \dots \times V \mapsto \R,
T:V∗×⋯×V∗×V×⋯×V↦R,
其中
V
V
V 是向量空间,
V
∗
V^∗
V∗ 是其对偶空间。
有两种定义张量的方法:
- 通常定义张量的物理学或传统数学方法,是把张量看成一个多维数组,当变换坐标或变换基底时,其分量会按照一定变换的规则,这些规则有两种:即协变或逆变转换。
- 通常现代数学中的方法,是把张量定义成某个向量空间或其对偶空间上的多重线性映射,这向量空间在需要引入基底之前不固定任何坐标系统。
1.一阶张量(向量)
T
j
=
[
T
1
T
2
.
.
.
.
.
.
T
n
]
T_j = [T_1 \space T_2\space ...... \space T_n]
Tj=[T1 T2 ...... Tn]
一阶张量(向量)可以用一个行矩阵表示。
2.二阶张量
T
j
=
[
[
T
1
T
2
T
3
]
[
T
4
T
5
T
6
]
.
.
.
.
.
.
[
T
n
−
2
T
n
−
1
T
n
]
]
T_j=[[T_1 \space T_2 \space T_3][T_4 \space T_5 \space T_6]......[T_{n-2} \space T_{n-1} \space T_n]]
Tj=[[T1 T2 T3][T4 T5 T6]......[Tn−2 Tn−1 Tn]]
一个二阶张量可以用一个矩阵表示。
import numpy as np
x = np.array([[5, 78, 2, 34, 0],
[6, 79, 3, 35, 1],
[7, 80, 4, 36, 2]])
print(x.ndim)
3.三阶张量
“n张平面”构成一个“立方体”
import numpy as np
x = np.array([[[5, 78, 2, 34, 0],
[6, 79, 3, 35, 1],
[7, 80, 4, 36, 2]],
[[5, 78, 2, 34, 0],
[6, 79, 3, 35, 1],
[7, 80, 4, 36, 2]],
[[5, 78, 2, 34, 0],
[6, 79, 3, 35, 1],
[7, 80, 4, 36, 2]]])
print(x.ndim)
4.高阶张量
将多个 3D 张量组合成一个数组,可以创建一个 4D 张量,以此类推。
实例:
- 向量数据:2D 张量,形状为 (samples, features) 。
- 时间序列数据或序列数据:3D 张量,形状为 (samples,
timesteps, features) 。 - 图像:4D张量,形状为 (samples, height, width, channels)
或 (samples, channels, height, width) 。 - 视频:5D张量,形状为 (samples, frames,
height, width, channels) 或 (samples,frames, channels, height, width)。
张量操作
纤维(Fibre)
纤维是指从张量中抽取向量的操作。在矩阵中固定其中一个维度,可以得到行或者列。类似于矩阵操作,固定其它维度,只保留一个维度变化,可以得到有纤维的概念。
假设存在三阶张量
A
∈
R
i
×
j
×
k
\mathcal A \in \R^{i \times j \times k}
A∈Ri×j×k,其列纤维、行纤维和管纤维分别为
A
(
:
,
j
,
k
)
、
A
(
i
,
:
,
k
)
\mathcal A(:,j,k)、\mathcal A(i,:,k)
A(:,j,k)、A(i,:,k) 和
A
(
i
,
j
,
:
)
。
\mathcal A(i,j,:)。
A(i,j,:)。
切片(Slice)
切片操作是指在张量中抽取矩阵的操作。将其中一维固定,变化的维度成为两个维度,可以得到三种张量切片。其中 A ( i , : , : ) 、 A ( : , j , : ) \mathcal A(i,:,:)、\mathcal A(:,j,:) A(i,:,:)、A(:,j,:) 和 A ( : , : , k ) \mathcal A(:,:,k) A(:,:,k)分别表示三维张量的水平切片、侧面切片和前向切片。
张量分解
cp分解
CP分解就是将一个张量分解成多个单秩张量的和。
给定一个三阶张量
X
∈
R
I
×
J
×
K
\mathcal X \in \R^{I \times J \times K}
X∈RI×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
\mathcal X \approx a_1 \circ b_1 \circ c_1 +a_2 \circ b_2 \circ c_2 + \dots +a_R \circ b_R \circ c_R = \sum_{r=1}^{R}a_r \circ b_r \circ c_r
X≈a1∘b1∘c1+a2∘b2∘c2+⋯+aR∘bR∘cR=r=1∑Rar∘br∘cr,
如果记
A
=
[
a
1
a
2
.
.
.
a
R
]
B
=
[
b
1
b
2
.
.
.
b
R
]
C
=
[
c
1
c
2
.
.
.
c
R
]
\\ A=[a_1 \space a_2 \space ... \space a_R] \ B=[b_1 \space b_2 \space ... \space b_R] \ C=[c_1 \space c_2 \space ... \space c_R ]
A=[a1 a2 ... aR] B=[b1 b2 ... bR] C=[c1 c2 ... cR]称
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 \llbracket A,B,C\rrbracket = \sum_{r=1}^{R}a_r \circ b_r \circ c_r
X≈[[A,B,C]]=r=1∑Rar∘br∘cr即为 cp 分解。
CP分解的目标是通过使用低秩矩阵的乘积来近似原始张量,以达到降低维度和提取张量中的潜在结构的目的。
Tuker 分解
HOSVD分解又称作Tucker分解。HOSVD全名为high order SVD,即高阶的SVD。
Tucker分解可以看作是主成分分析(PCA)的一种高阶版本,其将张量分解为一个核张量与每一维度上对应矩阵的乘积。
以三阶张量
X
∈
R
I
×
J
×
K
\mathcal X \in \R^{I\times J \times K}
X∈RI×J×K为例,其 Tuker 分解为:
X
≈
G
×
1
A
×
2
B
×
3
C
=
∑
p
=
1
P
∑
q
=
1
Q
∑
r
=
1
R
=
g
p
q
r
a
p
∘
b
q
∘
c
r
=
⟮
G
;
A
,
B
,
C
⟯
\mathcal X \approx \mathcal G \times_1A \times_2 B \times_3C = \sum_{p=1}^{P}\sum_{q=1}^{Q}\sum_{r=1}^{R}=g_{pqr}a_p \circ b_q \circ c_r = ⟮\mathcal G;A,B,C⟯
X≈G×1A×2B×3C=p=1∑Pq=1∑Qr=1∑R=gpqrap∘bq∘cr=⟮G;A,B,C⟯其中,
A
∈
R
I
×
P
,
B
∈
R
J
×
Q
,
C
∈
R
K
×
R
A\in \R^{I \times P},B\in \R^{J \times Q},C\in \R^{K \times R}
A∈RI×P,B∈RJ×Q,C∈RK×R是不同维度上的因子矩阵,这些矩阵通常被认为是不同维度上的主成分。
G
∈
R
P
×
Q
×
R
\mathcal G \in \R^{P \times Q \times R}
G∈RP×Q×R 称为核张量,其中每个元素代表了不同成分之间的交互程度。
从元素的角度看,Tuker 分解可以写为 x i j k = ∑ p = 1 P ∑ q = 1 Q ∑ r = 1 R g p q r a i p b j q c k r , i = 1 , 2 , . . . , I , j = 1 , 2 , . . . , J , k = 1 , 2 , . . . , K x_{ijk}=\sum_{p=1}^{P}\sum_{q=1}^{Q}\sum_{r=1}^{R}g_{pqr}a_{ip}b_{jq}c_{kr},i=1,2,...,I,j=1,2,...,J,k=1,2,...,K xijk=p=1∑Pq=1∑Qr=1∑Rgpqraipbjqckr,i=1,2,...,I,j=1,2,...,J,k=1,2,...,KP,Q 和 R 是因子矩阵 A,B,C \textbf{A,B,C} A,B,C的成分数(例如因子矩阵的列数)。如果 P,Q 和 R 小于 I,J,K,那么张量 G \mathcal{G} G 可以被认为是张量 X \mathcal{X} X 的压缩版本。
Tucker分解的目标是通过使用核张量和模式矩阵的乘积来近似原始张量,以达到降低维度、提取潜在特征和压缩数据的目的。
BTD 分解
BTD分解是一种将高阶张量分解为块张量乘积的方法。
定义一个张量
T
∈
R
I
×
J
×
K
\mathcal T \in \R^{I\times J \times K}
T∈RI×J×K,在CP分解中,张量
T
\mathcal T
T 分解为 R 个秩一张量的形式。低秩往往是一些局部的特征,但是在一些应用中,我们想要得到多尺度的特征,这个时候CP分解就无法直观地做到了。
如果CP分解中的一个秩一张量与另一个秩一张量的转置的乘积不是一个秩一的矩阵,而是一个秩为 K 的矩阵,那么这两个向量则应该是秩为
L
r
L_r
Lr 的矩阵。
数学表达式为 T = ∑ r = 1 R D r × 1 A r × 2 B r × 3 C r \mathcal T =\sum_{r=1}^{R}\mathcal D_r \times_1 A_r \times_2 B_r \times_3 C_r T=r=1∑RDr×1Ar×2Br×3Cr其中, D r ∈ K K × M × N \mathcal D_r \in {\mathbb K} ^{K \times M \times N} Dr∈KK×M×N 是 满秩 Rank − ( L r , M r , N r ) \text {Rank}-(L_r,M_r,N_r) Rank−(Lr,Mr,Nr) 张量,而 A r ∈ K I × L ( I ≥ L ) , A_r \in \mathbb K^{I \times L}(I \geq L), Ar∈KI×L(I≥L), B r ∈ K J × M ( J ≥ M ) , B_r \in \mathbb K^{J \times M}(J \geq M), Br∈KJ×M(J≥M), C r ∈ K K × N ( K ≥ N ) C_r \in \mathbb K^{K \times N}(K \geq N) Cr∈KK×N(K≥N)都是全列秩,且 1 ≤ r ≤ R . 1 \leq r \leq R. 1≤r≤R.
BTD 分解可以看作是 CP 分解和 Tucker 分解的组合形式:
当 R = 1 的时候,成员张量只有一个,此时这个分解就是
Rank
−
(
L
,
M
,
N
)
\text{Rank}−(L,M,N)
Rank−(L,M,N) 的 Tucker 分解;
当每一个成员张量是一个秩一分解的时候,该分解退化为一个CP分解 (CP分解是将一个张量
T
\mathcal T
T 分解为 R 个秩为1的张量形式)
BTD分解的目标是通过使用块张量的乘积来近似原始张量,以实现降低维度、提取潜在特征和压缩数据的目的。BTD分解可以看作是对高阶张量进行多维矩阵分解(Multilinear Matrix Decomposition)的推广。
维基百科:张量
博客:什么是张量(Tensor)
博客:张量分解算法