想象你是一名新上任的立体仓库主管。仓库里有几百个货架,它们不仅分成前后“排”、左右“列”,还分成上中下“层”。想告诉工人一件货在哪,光说“第三排、第二列”还不够,还得说“在第二层”——这就是三个维度。更麻烦的是,仓库堆得乱七八糟,同类货物散落各地,你既想清点库存,又想把仓库压缩成一张“精益布局图”。张量分解,就是这位帮你把立体仓库重新整理的专家:它能将整仓货物拆成几套“标准货架单元”,再按简单规则原样拼回;也可以先建一个迷你样板仓,再用几条传送带映射回完整仓库。CP分解、Tucker分解、秩这些术语,本质上是这套整理术里的“集装箱”、“传送带”和“货架种类数”。读完这篇文章,你会发现推荐系统、脑电信号、高光谱图像这些看似复杂的高维数据问题,背后都是同一个故事:仓库太乱,需要立体化地拆解。
对 AI 从业者而言,张量分解是处理三维及以上稀疏高维数据的基本功,能在推荐、压缩、特征提取等场景中直接产出可落地的降维方案,是突破矩阵方法瓶颈的必备技能。
可视化演示
展示高维张量的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\) 个时间点的记录。
管好仓库,先学会用“排、列、层”三个坐标说话。张量分解,就是在这套坐标上做文章。
- 张量符号花体 \(\mathcal{X}\) 表示整个高维数组,如同仓库的整体布局图。
- 实数空间\(\mathbb{R}\) 表示每个格子里存的是实数,比如评分、温度、电压。
- 各模式大小\(I_1, I_2, \ldots, I_N\) 依次是第 1 到第 N 个方向上的长度,如排数、列数、层数。
- 阶数 NN 有多大,张量就有多少个方向;三阶就是立体仓库,四阶以上像是“随时间变化的立体仓库”。
- 单个元素\(x_{i_1 i_2 \cdots i_N}\) 用多个下标定位,如同“第 3 排、第 5 列、第 2 层”的坐标。
分解动机
但走进仓库你会发现:货物随意堆叠,明明同类商品散落在不同楼层。若只用传统表格方法按某一层整理,其他楼层依然混乱。矩阵分解就像只治理一层楼,遇到跨楼层的立体规律就无能为力。
矩阵分解(如 SVD、PCA)只能处理二维数据。真实业务中,“用户×商品×时间”“病人×脑电通道×频率”天然是三维以上。如果直接存储,数据量按维度指数膨胀;而且大量格子彼此相关、信息冗余。张量分解的动机,就是用少数“因子结构”近似整仓货物,既压缩存储,又提炼出隐藏特征。
只整理一层楼,永远管不好整栋立体仓库;必须把整仓看作一个整体,用低秩结构一口气压缩。
- 原始存储量\(I_1 I_2 I_3\) 是把三阶张量逐格存放需要的参数个数。
- 低秩存储量分解为 R 个秩一因子后,只需存储 \(R(I_1+I_2+I_3)\) 个参数。
- 秩 RR 表示使用多少个“标准因子”来近似,是压缩程度的核心旋钮。
- 压缩比\(\rho > 1\) 说明分解之后存储更省;\(\rho\) 越小表示越不划算。
- 直观例子当 \(I_1=I_2=I_3=100,\; R=10\) 时,压缩比约达 333 倍。
CP分解
你决定不再一件件登记货物,而是引入“标准集装箱”。每种集装箱形状最简单:一条从原点出发、沿三个方向分别有固定长度的“长条货架”。把若干个这样的标准货架按不同比例叠放,就能拼出整仓货物的分布。
这种“长条货架”在数学上叫“秩一张量”,是三个向量的外积 \(\mathbf{a} \circ \mathbf{b} \circ \mathbf{c}\)。CP 分解把原始张量近似为 R 个秩一张量的加权和。每个秩一张量只捕捉一个方向的“模式”,R 越大,近似越精细。
CP 分解就像用三种颜色的标准集装箱按编号和比例叠放:集装箱种类越全(R 越大),还原出的仓库越像,但堆的箱子也越多。
- 求和\(\sum_{r=1}^{R}\) 表示把 R 个标准货架逐个叠加。
- 权重\(\lambda_r\) 是第 r 个货架的重要程度,类似调音台上的音量推子。
- 外积\(\circ\) 把三个向量组装成一个三维“长条块”,是秩一张量的核心运算。
- 三个方向向量\(\mathbf{a}_r,\mathbf{b}_r,\mathbf{c}_r\) 分别对应排、列、层三个方向上的断面轮廓。
- 近似号\(\approx\) 表示通常只能逼近,不能精确还原,误差大小由 R 控制。
Tucker分解
CP 的“独立集装箱”思路虽然简洁,却忽略了仓库内部各方向之间的交互。于是另一种方案出现了:先建一个迷你样板仓库(核心张量),再用三组传送带分别把“排、列、层”三个方向放大,映射回原始尺寸。
Tucker 分解把张量写成“核心张量 + 每个模式乘一个因子矩阵”。它好比把数据的精华浓缩进一个小张量 \(\mathcal{G}\),再用 \(\mathbf{A},\mathbf{B},\mathbf{C}\) 把精华推回完整空间,因此也被称为“多线性主成分分析”。
迷你样板仓加上三组传送带,能精准复刻整仓货物;若样板仓不允许交叉连线,就退化成普通集装箱叠放——这就是 Tucker 与 CP 的关系。
- 核心张量\(\mathcal{G}\) 是浓缩后的“信息精华”,体型比原始张量小很多。
- 模式乘积\(\times_1\) 表示沿着第 1 个方向做线性变换,相当于启动第一组传送带。
- 因子矩阵\(\mathbf{A},\mathbf{B},\mathbf{C}\) 分别是三个方向的特征映射,把“小仓”放大回“大仓”。
- 维度关系每个模式放大倍数由因子矩阵的列数决定,\(J_n \ll I_n\) 时压缩明显。
- 特例联系当核心张量变成“对角张量”时,Tucker 就退化为 CP。
张量秩
无论用哪种拆法,你都会问同一个问题:至少要几种“标准货架”才能拼出这间仓库?这个“最少种类数”,就是张量的秩。
CP 秩定义为能把张量精确表示成秩一张量之和的最少项数。可惜这个数极难计算,通常属于 NP 难问题。实践上我们退而求其次:给定一个预算 R,找误差最小的秩-R 近似,而不是追求精确的“最少项数”。另外还有 n-秩:把张量沿某一个模式“展平”成矩阵后的矩阵秩,衡量的是该方向上的独立信息量。
现实计算中,我们更常求解低秩近似问题:
货架种类越少,仓库管理越省力,但拼出来的“仿品”和原仓之间总会有误差。张量分解的一切设计,本质上都在权衡这个公式里的“R”和“误差”。
- F 范数\(\|\mathcal{X}-\hat{\mathcal{X}}\|_F\) 把所有格子的误差平方求和再开方。
- 最小化\(\min_{\hat{\mathcal{X}}}\) 表示找一个“最像”原张量的候选。
- 秩约束\(\operatorname{rank}(\hat{\mathcal{X}}) \le R\) 限制候选只能使用不超过 R 个标准货架。
应用与实战
仓库终于整理好了,订单像雪花般飞来。你发现,每个客户、每件商品、每个季节,都能用几条简短的“特征条码”描述。推荐系统不过是:把客户条码、商品条码、场景条码三张条码叠在一起,看看匹配度有多高。
这正是张量分解在推荐系统中的标准做法:把“用户×商品×场景”的交互记录构成三阶张量,分解后得到三组潜在因子,缺失值由因子乘积预测。同理,在信号处理中,脑电数据的“通道×时间×频率”张量经分解可分离出独立脑电节律;在数据压缩中,低秩因子比原始高维数据省下几个数量级的存储。
整仓货架的“条码化”,让推荐系统在几毫秒内就能完成匹配。读懂张量分解,你也就读懂了这类高维数据分析的核心秘密。
---
- 下标含义\(i\) 是用户,\(j\) 是商品,\(k\) 是场景,三者共同定位一个交互记录。
- 用户因子\(a_{ir}\) 表示第 i 个用户在第 r 个潜在主题上的偏好强度。
- 商品因子\(b_{jr}\) 表示第 j 个商品和主题 r 的吻合程度。
- 场景因子\(c_{kr}\) 表示第 k 个场景对主题 r 的调制系数。
- 求和预测把 R 个主题的乘积加总,得到用户 i 在场景 k 下对商品 j 的预测评分。
AI 应用场景
电商推荐系统
阶段:特征工程与模型训练
解决的问题:传统协同过滤只看用户×物品二维评分,忽略时间、场景等上下文信息;张量分解把缺失的“用户×商品×时间”三维交互张量拆成低秩因子,预测更准。
具体案例:某视频平台构造“用户×视频×星期”三阶张量,用 CP 分解得到用户兴趣因子、视频内容因子、星期活跃因子,推荐点击率提升明显。
脑电信号处理
阶段:数据预处理与模式提取
解决的问题:多通道脑电信号是“通道×时间×频率”三阶结构,传统方法逐通道分析会破坏整体性;Tucker 分解能分离出共有脑电节律与不同通道的权重。
具体案例:研究者在癫痫脑电数据上做 Tucker 分解,用核心张量浓缩异常放电模式,显著提高自动检测精度。
高光谱图像压缩
阶段:数据压缩与存储优化
解决的问题:高光谱图像是“宽×高×波段”三阶立方体,体积庞大;低秩 CP/Tucker 分解保留主要光谱特征,大幅压缩存储。
具体案例:遥感团队把 \(1024 \times 1024 \times 128\) 的高光谱立方体用 Tucker 分解成 \(64 \times 64 \times 8\) 核心张量与三个因子矩阵,压缩比超过 20 倍,分类精度几乎不降。
Python 演示
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))
X = np.random.rand(4, 5, 6)生成一个 \(4 \times 5 \times 6\) 的随机三阶张量,模拟三维数据。def cp_als(X, R, iters=50):定义 CP 分解的交替最小二乘函数,R 是秩,iters 是迭代轮数。BC = np.einsum('ir,jr->ijr', B, C).reshape(I2 * I3, R)用 B、C 构造 Khatri-Rao 积,作为更新 A 的回归矩阵。A = np.linalg.lstsq(BC, X1.T, rcond=None)[0].T固定 B、C,把问题转成最小二乘,更新因子矩阵 A。AB = np.einsum('ir,jr->ijr', A, B).reshape(I1 * I2, R)同理构造 A、B 的 Khatri-Rao 积,用于更新 C。X_hat = np.einsum('ir,jr,kr->ijk', A, B, C)用分解出来的三个因子矩阵重建原始张量。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)指的是什么?
- A.张量元素的总个数
- B.张量的维度数量← 正确答案
- C.张量中的最大值
- D.张量的存储大小
答案:B。张量的阶就是维度数。向量是 1 阶,矩阵是 2 阶,三维数组是 3 阶。元素个数、最大值、存储大小都不是阶的定义,因此选 B。
Q2. 一阶张量在数学中通常叫什么?
- A.零维标量
- B.一维向量← 正确答案
- C.二维矩阵
- D.高维数组
答案:B。一阶张量只有一个方向,对应向量;标量是 0 阶,矩阵是 2 阶,高维数组是更高阶张量。所以选 B。
Q3. CP 分解把三阶张量近似表示为?
- A.若干个秩一张量之和← 正确答案
- B.一个核张量与矩阵积
- C.若干二维矩阵的叠加
- D.多个对角矩阵连乘
答案:A。CP 分解是 R 个秩一张量(三个向量外积)的加权和。B 是 Tucker 分解的形式,C 是逐切片分解,D 不是 CP 分解的标准形式,因此选 A。
Q4. 关于 Tucker 分解,下列说法正确的有?
- A.包含一个核心张量← 正确答案
- B.不含任何因子矩阵
- C.可视为多线性主成分分析← 正确答案
- D.核心张量必然对角
答案:AC。Tucker 分解由核心张量 \(\mathcal{G}\) 和三个因子矩阵 A/B/C 组成,因此 A 对、B 错。当核心张量是对角张量时退化为 CP,所以“必然对角”错。Tucker 在每个模式上做线性变换,类似多线性主成分分析,C 对。
Q5. CP 分解中交替最小二乘(ALS)的核心思想是?
- A.每轮只更新一个因子矩阵← 正确答案
- B.一次性更新全部因子
- C.对张量直接求逆
- D.随机采样不做更新
答案:A。ALS 固定其余因子矩阵,把目标变成标准最小二乘问题,更新一个因子后再轮换到下一个。一次性更新全部因子无法解析求解,直接求逆也不可行,因此选 A。
Q6. 关于 CP 秩,下列说法正确的是?
- A.可通过奇异值分解求出
- B.精确求解通常为 NP 难← 正确答案
- C.必然小于张量最大维度
- D.与因子矩阵选择无关
答案:B。CP 秩的精确计算是 NP 难问题,实践中常用低秩近似替代。矩阵 SVD 可以算矩阵秩,但 CP 秩不能直接由奇异值分解得到,所以 A 错、B 对;CP 秩可以与维度无关地很大,C 错;CP 秩由张量本身决定,与具体因子选取无关,但 D 的说法过于笼统,最佳答案是 B。
Q7. 张量分解可以用于哪些场景?
- A.推荐系统三维预测← 正确答案
- B.脑电信号模式提取← 正确答案
- C.高光谱图像压缩← 正确答案
- D.数据库事务回滚
答案:ABC。推荐系统中的“用户×商品×时间”、脑电中的“通道×时间×频率”、高光谱中的“宽×高×波段”都是三阶张量,适合张量分解。数据库事务回滚属于事务机制,与张量分解无关,因此不选 D。
Q8. 低秩张量近似的目标函数通常是?
- A.最小化重建误差← 正确答案
- B.最大化信息熵值
- C.最小化分解阶数
- D.最大化奇异值数
答案:A。低秩近似在秩约束下最小化 Frobenius 范数重建误差,即让近似张量与原始张量的整体误差尽量小。信息熵、分解阶数、奇异值数都不是常用的目标函数,因此选 A。
Q9. 关于张量分解,哪些是常见误区?
- A.认为 CP 秩和矩阵秩一样好算← 正确答案
- B.认为分解结果必然唯一← 正确答案
- C.认为秩越大一定越节省存储← 正确答案
- D.认为分解前需要归一化数据
答案:ABC。CP 秩精确计算是 NP 难问题,A 是误区;张量分解通常不唯一,B 是误区;秩增大会让因子参数变多,压缩比可能小于 1,C 是误区。归一化数据是合理预处理,不算误区,因此不选 D。
Q10. 三阶张量中的“纤维”指的是?
- A.固定两个下标变化一个下标← 正确答案
- B.固定一个下标得到矩阵
- C.所有元素求和后的数
- D.沿对角线展开的向量
答案:A。纤维是只让一个索引变化、固定其余索引得到的一维数组;固定一个下标得到的是二维切片,所有元素求和得到的是标量,因此选 A。