想象你是一名新上任的立体仓库主管。仓库里有几百个货架,它们不仅分成前后“排”、左右“列”,还分成上中下“层”。想告诉工人一件货在哪,光说“第三排、第二列”还不够,还得说“在第二层”——这就是三个维度。更麻烦的是,仓库堆得乱七八糟,同类货物散落各地,你既想清点库存,又想把仓库压缩成一张“精益布局图”。张量分解,就是这位帮你把立体仓库重新整理的专家:它能将整仓货物拆成几套“标准货架单元”,再按简单规则原样拼回;也可以先建一个迷你样板仓,再用几条传送带映射回完整仓库。CP分解、Tucker分解、秩这些术语,本质上是这套整理术里的“集装箱”、“传送带”和“货架种类数”。读完这篇文章,你会发现推荐系统、脑电信号、高光谱图像这些看似复杂的高维数据问题,背后都是同一个故事:仓库太乱,需要立体化地拆解。

岗位关联

对 AI 从业者而言,张量分解是处理三维及以上稀疏高维数据的基本功,能在推荐、压缩、特征提取等场景中直接产出可落地的降维方案,是突破矩阵方法瓶颈的必备技能。

目录
  1. 可视化演示
  2. 张量基础概念
  3. 分解动机
  4. CP分解
  5. Tucker分解
  6. 张量秩
  7. 应用与实战
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示高维张量的CP分解(秩1张量之和)与Tucker分解(核心张量+因子矩阵),直观对比两种降维方法的结构差异。

本节配有交互动效(进入视口后自动加载,约 3KB)。

CP分解 3阶张量T∈ℝ^{I×J×K}分解为R个秩1张量 每个秩1分量:a_r∘b_r∘c_r外积 因子矩阵A,B,C的列向量组合 T ≈ Σ_{r=1}^{R} a_r ∘ b_r ∘ c_r CP分解为最小秩分解

张量基础概念

你第一次走进一栋立体仓库:地面上是编号的“排”与“列”,头顶还有三层楼板,每层放着不同的货。光说“第三排第二列”还不够,你还得说“在三楼”。当数据有了三个甚至更多的“方向”,我们就不再叫它表格或矩阵,而是叫它“张量”。

一维数组是一排货架,二维矩阵是一层平面图,三维及以上的数组就是立体库房。专业上,张量的“维度数”叫“阶”,也叫“模式数”。例如“用户×商品×时间”的数据是三阶张量:每个元素由三个下标唯一锁定,\(x_{ijk}\) 表示第 \(i\) 个用户、第 \(j\) 个商品、第 \(k\) 个时间点的记录。

管好仓库,先学会用“排、列、层”三个坐标说话。张量分解,就是在这套坐标上做文章。

X∈RI1×I2×⋯×IN\mathcal{X} \in \mathbb{R}^{I_1 \times I_2 \times \cdots \times I_N}
  1. 张量符号花体 \(\mathcal{X}\) 表示整个高维数组,如同仓库的整体布局图。
    X\mathcal{X}
  2. 实数空间\(\mathbb{R}\) 表示每个格子里存的是实数,比如评分、温度、电压。
    R\mathbb{R}
  3. 各模式大小\(I_1, I_2, \ldots, I_N\) 依次是第 1 到第 N 个方向上的长度,如排数、列数、层数。
    I1=排数,  I2=列数,  I3=层数I_1 = \text{排数},\; I_2 = \text{列数},\; I_3 = \text{层数}
  4. 阶数 NN 有多大,张量就有多少个方向;三阶就是立体仓库,四阶以上像是“随时间变化的立体仓库”。
    N=张量的阶数N = \text{张量的阶数}
  5. 单个元素\(x_{i_1 i_2 \cdots i_N}\) 用多个下标定位,如同“第 3 排、第 5 列、第 2 层”的坐标。
    xi1i2⋯iN∈Rx_{i_1 i_2 \cdots i_N} \in \mathbb{R}

分解动机

但走进仓库你会发现:货物随意堆叠,明明同类商品散落在不同楼层。若只用传统表格方法按某一层整理,其他楼层依然混乱。矩阵分解就像只治理一层楼,遇到跨楼层的立体规律就无能为力。

矩阵分解(如 SVD、PCA)只能处理二维数据。真实业务中,“用户×商品×时间”“病人×脑电通道×频率”天然是三维以上。如果直接存储,数据量按维度指数膨胀;而且大量格子彼此相关、信息冗余。张量分解的动机,就是用少数“因子结构”近似整仓货物,既压缩存储,又提炼出隐藏特征。

只整理一层楼,永远管不好整栋立体仓库;必须把整仓看作一个整体,用低秩结构一口气压缩。

ρ=I1I2I3R(I1+I2+I3)\rho = \frac{I_1 I_2 I_3}{R(I_1 + I_2 + I_3)}
  1. 原始存储量\(I_1 I_2 I_3\) 是把三阶张量逐格存放需要的参数个数。
    I1I2I3I_1 I_2 I_3
  2. 低秩存储量分解为 R 个秩一因子后,只需存储 \(R(I_1+I_2+I_3)\) 个参数。
    R(I1+I2+I3)R(I_1 + I_2 + I_3)
  3. 秩 RR 表示使用多少个“标准因子”来近似,是压缩程度的核心旋钮。
    RR
  4. 压缩比\(\rho > 1\) 说明分解之后存储更省;\(\rho\) 越小表示越不划算。
    ρ=原始参数分解参数\rho = \frac{\text{原始参数}}{\text{分解参数}}
  5. 直观例子当 \(I_1=I_2=I_3=100,\; R=10\) 时,压缩比约达 333 倍。
    ρ≈100310×300≈333.3\rho \approx \frac{100^3}{10 \times 300} \approx 333.3

CP分解

你决定不再一件件登记货物,而是引入“标准集装箱”。每种集装箱形状最简单:一条从原点出发、沿三个方向分别有固定长度的“长条货架”。把若干个这样的标准货架按不同比例叠放,就能拼出整仓货物的分布。

这种“长条货架”在数学上叫“秩一张量”,是三个向量的外积 \(\mathbf{a} \circ \mathbf{b} \circ \mathbf{c}\)。CP 分解把原始张量近似为 R 个秩一张量的加权和。每个秩一张量只捕捉一个方向的“模式”,R 越大,近似越精细。

CP 分解就像用三种颜色的标准集装箱按编号和比例叠放:集装箱种类越全(R 越大),还原出的仓库越像,但堆的箱子也越多。

X≈∑r=1Rλr ar∘br∘cr\mathcal{X} \approx \sum_{r=1}^{R} \lambda_r \, \mathbf{a}_r \circ \mathbf{b}_r \circ \mathbf{c}_r
  1. 求和\(\sum_{r=1}^{R}\) 表示把 R 个标准货架逐个叠加。
    ∑r=1R\sum_{r=1}^{R}
  2. 权重\(\lambda_r\) 是第 r 个货架的重要程度,类似调音台上的音量推子。
    λr\lambda_r
  3. 外积\(\circ\) 把三个向量组装成一个三维“长条块”,是秩一张量的核心运算。
    ar∘br∘cr\mathbf{a}_r \circ \mathbf{b}_r \circ \mathbf{c}_r
  4. 三个方向向量\(\mathbf{a}_r,\mathbf{b}_r,\mathbf{c}_r\) 分别对应排、列、层三个方向上的断面轮廓。
    ar∈RI1,br∈RI2,cr∈RI3\mathbf{a}_r \in \mathbb{R}^{I_1}, \mathbf{b}_r \in \mathbb{R}^{I_2}, \mathbf{c}_r \in \mathbb{R}^{I_3}
  5. 近似号\(\approx\) 表示通常只能逼近,不能精确还原,误差大小由 R 控制。
    X≈⋯\mathcal{X} \approx \cdots

Tucker分解

CP 的“独立集装箱”思路虽然简洁,却忽略了仓库内部各方向之间的交互。于是另一种方案出现了:先建一个迷你样板仓库(核心张量),再用三组传送带分别把“排、列、层”三个方向放大,映射回原始尺寸。

Tucker 分解把张量写成“核心张量 + 每个模式乘一个因子矩阵”。它好比把数据的精华浓缩进一个小张量 \(\mathcal{G}\),再用 \(\mathbf{A},\mathbf{B},\mathbf{C}\) 把精华推回完整空间,因此也被称为“多线性主成分分析”。

迷你样板仓加上三组传送带,能精准复刻整仓货物;若样板仓不允许交叉连线,就退化成普通集装箱叠放——这就是 Tucker 与 CP 的关系。

X≈G×1A×2B×3C\mathcal{X} \approx \mathcal{G} \times_1 \mathbf{A} \times_2 \mathbf{B} \times_3 \mathbf{C}
  1. 核心张量\(\mathcal{G}\) 是浓缩后的“信息精华”,体型比原始张量小很多。
    G∈RJ1×J2×J3\mathcal{G} \in \mathbb{R}^{J_1 \times J_2 \times J_3}
  2. 模式乘积\(\times_1\) 表示沿着第 1 个方向做线性变换,相当于启动第一组传送带。
    ×1\times_1
  3. 因子矩阵\(\mathbf{A},\mathbf{B},\mathbf{C}\) 分别是三个方向的特征映射,把“小仓”放大回“大仓”。
    A,B,C\mathbf{A},\mathbf{B},\mathbf{C}
  4. 维度关系每个模式放大倍数由因子矩阵的列数决定,\(J_n \ll I_n\) 时压缩明显。
    Jn≪InJ_n \ll I_n
  5. 特例联系当核心张量变成“对角张量”时,Tucker 就退化为 CP。
    G=diag(λ1,…,λR)\mathcal{G} = \text{diag}(\lambda_1,\dots,\lambda_R)

张量秩

无论用哪种拆法,你都会问同一个问题:至少要几种“标准货架”才能拼出这间仓库?这个“最少种类数”,就是张量的秩。

CP 秩定义为能把张量精确表示成秩一张量之和的最少项数。可惜这个数极难计算,通常属于 NP 难问题。实践上我们退而求其次:给定一个预算 R,找误差最小的秩-R 近似,而不是追求精确的“最少项数”。另外还有 n-秩:把张量沿某一个模式“展平”成矩阵后的矩阵秩,衡量的是该方向上的独立信息量。

现实计算中,我们更常求解低秩近似问题:

货架种类越少,仓库管理越省力,但拼出来的“仿品”和原仓之间总会有误差。张量分解的一切设计,本质上都在权衡这个公式里的“R”和“误差”。

rank⁡CP(X)=min⁡{R:X=∑r=1Rar∘br∘cr}\operatorname{rank}_{\mathrm{CP}}(\mathcal{X}) = \min \left\{ R : \mathcal{X} = \sum_{r=1}^{R} \mathbf{a}_r \circ \mathbf{b}_r \circ \mathbf{c}_r \right\}
  1. F 范数\(\|\mathcal{X}-\hat{\mathcal{X}}\|_F\) 把所有格子的误差平方求和再开方。
    ∥X−X^∥F\|\mathcal{X} - \hat{\mathcal{X}}\|_F
  2. 最小化\(\min_{\hat{\mathcal{X}}}\) 表示找一个“最像”原张量的候选。
    min⁡X^\min_{\hat{\mathcal{X}}}
  3. 秩约束\(\operatorname{rank}(\hat{\mathcal{X}}) \le R\) 限制候选只能使用不超过 R 个标准货架。
    rank⁡(X^)≤R\operatorname{rank}(\hat{\mathcal{X}}) \le R

应用与实战

仓库终于整理好了,订单像雪花般飞来。你发现,每个客户、每件商品、每个季节,都能用几条简短的“特征条码”描述。推荐系统不过是:把客户条码、商品条码、场景条码三张条码叠在一起,看看匹配度有多高。

这正是张量分解在推荐系统中的标准做法:把“用户×商品×场景”的交互记录构成三阶张量,分解后得到三组潜在因子,缺失值由因子乘积预测。同理,在信号处理中,脑电数据的“通道×时间×频率”张量经分解可分离出独立脑电节律;在数据压缩中,低秩因子比原始高维数据省下几个数量级的存储。

整仓货架的“条码化”,让推荐系统在几毫秒内就能完成匹配。读懂张量分解,你也就读懂了这类高维数据分析的核心秘密。

---

x^ijk=∑r=1Rairbjrckr\hat{x}_{ijk} = \sum_{r=1}^{R} a_{ir} b_{jr} c_{kr}
  1. 下标含义\(i\) 是用户,\(j\) 是商品,\(k\) 是场景,三者共同定位一个交互记录。
    i,j,ki, j, k
  2. 用户因子\(a_{ir}\) 表示第 i 个用户在第 r 个潜在主题上的偏好强度。
    aira_{ir}
  3. 商品因子\(b_{jr}\) 表示第 j 个商品和主题 r 的吻合程度。
    bjrb_{jr}
  4. 场景因子\(c_{kr}\) 表示第 k 个场景对主题 r 的调制系数。
    ckrc_{kr}
  5. 求和预测把 R 个主题的乘积加总,得到用户 i 在场景 k 下对商品 j 的预测评分。
    x^ijk=∑r=1Rairbjrckr\hat{x}_{ijk} = \sum_{r=1}^{R} a_{ir} b_{jr} c_{kr}

AI 应用场景

电商推荐系统

阶段:特征工程与模型训练

解决的问题:传统协同过滤只看用户×物品二维评分,忽略时间、场景等上下文信息;张量分解把缺失的“用户×商品×时间”三维交互张量拆成低秩因子,预测更准。

具体案例:某视频平台构造“用户×视频×星期”三阶张量,用 CP 分解得到用户兴趣因子、视频内容因子、星期活跃因子,推荐点击率提升明显。

脑电信号处理

阶段:数据预处理与模式提取

解决的问题:多通道脑电信号是“通道×时间×频率”三阶结构,传统方法逐通道分析会破坏整体性;Tucker 分解能分离出共有脑电节律与不同通道的权重。

具体案例:研究者在癫痫脑电数据上做 Tucker 分解,用核心张量浓缩异常放电模式,显著提高自动检测精度。

高光谱图像压缩

阶段:数据压缩与存储优化

解决的问题:高光谱图像是“宽×高×波段”三阶立方体,体积庞大;低秩 CP/Tucker 分解保留主要光谱特征,大幅压缩存储。

具体案例:遥感团队把 \(1024 \times 1024 \times 128\) 的高光谱立方体用 Tucker 分解成 \(64 \times 64 \times 8\) 核心张量与三个因子矩阵,压缩比超过 20 倍,分类精度几乎不降。

Python 演示

python28 行
import numpy as np np.random.seed(0)X = np.random.rand(4, 5, 6)  # 一个 4x5x6 的三阶张量 def cp_als(X, R, iters=50):    I1, I2, I3 = X.shape    A = np.random.rand(I1, R)    B = np.random.rand(I2, R)    C = np.random.rand(I3, R)    for _ in range(iters):        BC = np.einsum('ir,jr->ijr', B, C).reshape(I2 * I3, R)        X1 = X.reshape(I1, I2 * I3)        A = np.linalg.lstsq(BC, X1.T, rcond=None)[0].T         AC = np.einsum('ir,jr->ijr', A, C).reshape(I1 * I3, R)        X2 = X.transpose(1, 0, 2).reshape(I2, I1 * I3)        B = np.linalg.lstsq(AC, X2.T, rcond=None)[0].T         AB = np.einsum('ir,jr->ijr', A, B).reshape(I1 * I2, R)        X3 = X.transpose(2, 0, 1).reshape(I3, I1 * I2)        C = np.linalg.lstsq(AB, X3.T, rcond=None)[0].T    return A, B, C A, B, C = cp_als(X, R=3)X_hat = np.einsum('ir,jr,kr->ijk', A, B, C)err = np.linalg.norm(X - X_hat) / np.linalg.norm(X)print('相对误差:', round(err, 4))
目的:用交替最小二乘(ALS)实现三阶张量的 CP 分解,并计算低秩重建的相对误差。
  1. X = np.random.rand(4, 5, 6)生成一个 \(4 \times 5 \times 6\) 的随机三阶张量,模拟三维数据。
  2. def cp_als(X, R, iters=50):定义 CP 分解的交替最小二乘函数,R 是秩,iters 是迭代轮数。
  3. BC = np.einsum('ir,jr->ijr', B, C).reshape(I2 * I3, R)用 B、C 构造 Khatri-Rao 积,作为更新 A 的回归矩阵。
  4. A = np.linalg.lstsq(BC, X1.T, rcond=None)[0].T固定 B、C,把问题转成最小二乘,更新因子矩阵 A。
  5. AB = np.einsum('ir,jr->ijr', A, B).reshape(I1 * I2, R)同理构造 A、B 的 Khatri-Rao 积,用于更新 C。
  6. X_hat = np.einsum('ir,jr,kr->ijk', A, B, C)用分解出来的三个因子矩阵重建原始张量。
  7. err = np.linalg.norm(X - X_hat) / np.linalg.norm(X)计算相对误差,衡量秩 R 近似的质量。

常见误区

误区我觉得张量分解就是把三维数组切成一堆二维矩阵,再逐个做 SVD 或 PCA,最后拼起来就行了。

正解真正的张量分解把整仓货物当作一个立体整体来拆,CP 和 Tucker 都是通过低秩因子结构一次性逼近整个张量,而不是逐片做矩阵分解。逐个切片分解会破坏模式之间的关联,就像只修理每块木板而不看整个货架结构。

为何常见:因为大多数人先学矩阵分解,遇到三维数据时很自然会用“切片”思路去线性外推。

误区我以为张量秩和矩阵秩一样,用奇异值分解数一下非零奇异值就能算出来。

正解CP 秩是“最少秩一张量之和的项数”,精确计算通常是 NP 难的;n-秩只是把张量沿某个方向展平成矩阵后的矩阵秩。二者名字都带“秩”,含义却大不相同。

为何常见:矩阵 SVD 太深入人心,看到“rank”就会联想到奇异值,忽略了张量秩的非凸与组合本质。

误区我以为只要分解方法相同,谁来做结果都一样,就像矩阵 SVD 有明确顺序。

正解张量分解(尤其 CP)一般不唯一,因子之间可以相互“旋转”或缩放而不改变乘积。实际工程中需要加非负约束、稀疏约束或正交约束,才能得到可解释的稳定解。

为何常见:矩阵 SVD 的奇异值排序有较强唯一性,这种经验被错误地推广到高阶张量上。

误区我以为张量分解能自动压缩数据,秩设得越大信息保留越多,存储也一定更省。

正解低秩存储量是 \(R(I_1+I_2+I_3)\),R 越大,因子参数越多。当 R 接近原始维度时,分解后的参数反而可能超过原始数据体积,压缩比 \(\rho\) 会小于 1,完全不划算。

为何常见:只关注“降维”的宣传,忽略了秩与参数量的正比关系。

误区我以为 Tucker 分解里的核心张量就是类似 PCA 的主成分,直接拿它当特征矩阵用就行。

正解核心张量是多维交互系数,它必须与三个因子矩阵配合才能解释数据;单独看核心张量并不能直接得到“主成分”。它更像迷你样板仓里各角落的货物清单,而不是某面墙上的货架编号。

为何常见:PCA 的“得分矩阵”概念太深入人心,容易把核心张量错当成低维特征空间。

面试题

Q1. 张量的“阶”(order)指的是什么?

单选题 · easy

  • A.张量元素的总个数
  • B.张量的维度数量← 正确答案
  • C.张量中的最大值
  • D.张量的存储大小

答案:B。张量的阶就是维度数。向量是 1 阶,矩阵是 2 阶,三维数组是 3 阶。元素个数、最大值、存储大小都不是阶的定义,因此选 B。

Q2. 一阶张量在数学中通常叫什么?

单选题 · easy

  • A.零维标量
  • B.一维向量← 正确答案
  • C.二维矩阵
  • D.高维数组

答案:B。一阶张量只有一个方向,对应向量;标量是 0 阶,矩阵是 2 阶,高维数组是更高阶张量。所以选 B。

Q3. CP 分解把三阶张量近似表示为?

单选题 · mid

  • A.若干个秩一张量之和← 正确答案
  • B.一个核张量与矩阵积
  • C.若干二维矩阵的叠加
  • D.多个对角矩阵连乘

答案:A。CP 分解是 R 个秩一张量(三个向量外积)的加权和。B 是 Tucker 分解的形式,C 是逐切片分解,D 不是 CP 分解的标准形式,因此选 A。

Q4. 关于 Tucker 分解,下列说法正确的有?

多选题 · mid

  • A.包含一个核心张量← 正确答案
  • B.不含任何因子矩阵
  • C.可视为多线性主成分分析← 正确答案
  • D.核心张量必然对角

答案:AC。Tucker 分解由核心张量 \(\mathcal{G}\) 和三个因子矩阵 A/B/C 组成,因此 A 对、B 错。当核心张量是对角张量时退化为 CP,所以“必然对角”错。Tucker 在每个模式上做线性变换,类似多线性主成分分析,C 对。

Q5. CP 分解中交替最小二乘(ALS)的核心思想是?

单选题 · mid

  • A.每轮只更新一个因子矩阵← 正确答案
  • B.一次性更新全部因子
  • C.对张量直接求逆
  • D.随机采样不做更新

答案:A。ALS 固定其余因子矩阵,把目标变成标准最小二乘问题,更新一个因子后再轮换到下一个。一次性更新全部因子无法解析求解,直接求逆也不可行,因此选 A。

Q6. 关于 CP 秩,下列说法正确的是?

单选题 · hard

  • A.可通过奇异值分解求出
  • B.精确求解通常为 NP 难← 正确答案
  • C.必然小于张量最大维度
  • D.与因子矩阵选择无关

答案:B。CP 秩的精确计算是 NP 难问题,实践中常用低秩近似替代。矩阵 SVD 可以算矩阵秩,但 CP 秩不能直接由奇异值分解得到,所以 A 错、B 对;CP 秩可以与维度无关地很大,C 错;CP 秩由张量本身决定,与具体因子选取无关,但 D 的说法过于笼统,最佳答案是 B。

Q7. 张量分解可以用于哪些场景?

多选题 · mid

  • A.推荐系统三维预测← 正确答案
  • B.脑电信号模式提取← 正确答案
  • C.高光谱图像压缩← 正确答案
  • D.数据库事务回滚

答案:ABC。推荐系统中的“用户×商品×时间”、脑电中的“通道×时间×频率”、高光谱中的“宽×高×波段”都是三阶张量,适合张量分解。数据库事务回滚属于事务机制,与张量分解无关,因此不选 D。

Q8. 低秩张量近似的目标函数通常是?

单选题 · hard

  • A.最小化重建误差← 正确答案
  • B.最大化信息熵值
  • C.最小化分解阶数
  • D.最大化奇异值数

答案:A。低秩近似在秩约束下最小化 Frobenius 范数重建误差,即让近似张量与原始张量的整体误差尽量小。信息熵、分解阶数、奇异值数都不是常用的目标函数,因此选 A。

Q9. 关于张量分解,哪些是常见误区?

多选题 · hard

  • A.认为 CP 秩和矩阵秩一样好算← 正确答案
  • B.认为分解结果必然唯一← 正确答案
  • C.认为秩越大一定越节省存储← 正确答案
  • D.认为分解前需要归一化数据

答案:ABC。CP 秩精确计算是 NP 难问题,A 是误区;张量分解通常不唯一,B 是误区;秩增大会让因子参数变多,压缩比可能小于 1,C 是误区。归一化数据是合理预处理,不算误区,因此不选 D。

Q10. 三阶张量中的“纤维”指的是?

单选题 · easy

  • A.固定两个下标变化一个下标← 正确答案
  • B.固定一个下标得到矩阵
  • C.所有元素求和后的数
  • D.沿对角线展开的向量

答案:A。纤维是只让一个索引变化、固定其余索引得到的一维数组;固定一个下标得到的是二维切片,所有元素求和得到的是标量,因此选 A。