稀疏矩阵

介绍

稀疏矩阵(Sparse Matrix) 是数值计算、数据科学和机器学习中非常核心的概念,指的是绝大多数元素为零(或默认值),仅少数元素为非零有效值的矩阵。

定义

在数学与计算机领域,稀疏矩阵是指非零元素的数量远少于零元素数量,且非零元素分布无规律的矩阵。
简单说:零元素占绝对主导,非零元素稀疏分布。

判定标准

没有绝对统一的数学阈值,但行业内通用的经验标准是:
非零元素占比 ≤ 5%(即每100个元素中,非零元素不超过5个),即可视为稀疏矩阵。
反之,非零元素占比高的矩阵称为稠密矩阵(Dense Matrix)。

直观示例

一个 6×6 的稀疏矩阵(非零元素仅 4 个,占比约 4/36 ≈ 11%,接近稀疏特征,更大规模矩阵会更典型):

如果是 10000×10000 的矩阵,仅 1000 个非零元素,就是典型的稀疏矩阵。


核心问题:存储冗余

稀疏矩阵需要特殊处理的核心原因:如果用 普通二维数组(稠密存储)存储稀疏矩阵,会出现严重的空间浪费。

  • 比如 10000×10000 的矩阵,稠密存储需要 1亿个元素的空间;

  • 即便只有 1000 个非零元素,仍要为9999万个零元素分配内存,完全冗余。

因此,稀疏矩阵的核心研究方向是:设计高效的压缩存储结构,只存非零元素及其位置,不存零元素。


存储方式

稀疏矩阵的存储结构有多种,按复杂度和应用场景分为基础结构和高效结构,分别适配教学、小规模场景和工业级、大规模场景。

三元组顺序表(最基础,对应“稀疏数组”)

这是最易理解的压缩存储方式,也是你之前问的稀疏数组的底层逻辑,核心是用三元组(行号,列号,值) 记录每个非零元素。

结构设计
  • 用一个二维数组存储,每行是一个三元组;
  • 第一行存储 元信息:矩阵总行数、总列数、非零元素总数;
  • 后续每行存储一个非零元素的(行,列,值)。
示例:上面6×6矩阵的三元组存储
6   6   4  \\ 元信息:6行、6列、4个非零元素
1   1   5  \\ 非零元素1:行1列1,值5
2   4   9  \\ 非零元素2:行2列4,值9
4   5   7  \\ 非零元素3:行4列5,值7

原本需要36个存储单元,现在仅需12个,空间大幅压缩。

十字链表(链式存储)

三元组是顺序存储,插入/删除非零元素效率低(需要移动数组元素),十字链表用链式结构解决这个问题:

  • 每个非零元素是一个节点,包含:行号、列号、值、行方向指针(指向同行下一个非零元素)、列方向指针(指向同列下一个非零元素);
  • 形成“行链表+列链表”的十字交叉结构,插入/删除仅需修改指针,效率高;
  • 缺点:指针占用额外空间,实现复杂,适合频繁修改的稀疏矩阵。

CSR/CSC 压缩存储(工业级主流)

这是机器学习、数值计算中 最常用的高效存储方式,分为 CSR(行压缩)和 CSC(列压缩),核心是用 三个一维数组存储所有信息,无冗余、访问效率高。

以 CSR(Compressed Sparse Row,行压缩)为例,三个数组:

  1. val:按行优先顺序,存储所有非零元素的值;
  2. col_ind:存储val中每个元素对应的列号;
  3. row_ptr:记录每行第一个非零元素在val中的起始索引,长度为“行数+1”,最后一位是总非零元素数。
示例:上面6×6矩阵的CSR存储
  • val = [5, 9, 7](非零元素按行排列)
  • col_ind = [1, 4, 5](对应每个元素的列号)
  • row_ptr = [0, 0, 1, 2, 2, 3, 3]
    • row_ptr[0]=0:第0行第一个非零元素在val的索引0(无元素);
    • row_ptr[1]=0:第1行第一个非零元素在val的索引0;
    • row_ptr[2]=1:第2行第一个非零元素在val的索引1;
    • row_ptr[6]=3:总非零元素数为3。

CSR/CSC 优势:内存占用极小、矩阵乘法等运算效率极高,是Scipy、PyTorch、TensorFlow中稀疏矩阵的默认存储方式。


优缺点

优点

  • 空间效率极高:仅存储非零元素,大规模稀疏矩阵可节省95%以上的内存;
  • 计算效率优化:运算时跳过零元素,避免无效计算(如乘法中零元素相乘可直接忽略);
  • 适配大规模数据:机器学习、推荐系统中,数据天然稀疏(如用户-商品评分矩阵,99%为零),只能用稀疏矩阵处理。

缺点

  • 实现与操作复杂:相比稠密矩阵,压缩存储的索引计算、元素访问逻辑更复杂;
  • 部分运算效率低:如随机访问某个元素、插入/删除元素,需要遍历索引或修改指针,不如稠密矩阵直接;
  • 工具支持有限:部分基础库对稀疏矩阵的运算支持不如稠密矩阵完善,需依赖专业库(如Scipy、PyTorch Sparse)。

应用场景

稀疏矩阵的应用几乎覆盖所有“数据天然稀疏”的领域,核心场景包括:

  1. 推荐系统:用户-商品交互矩阵(大部分用户未购买/评分,值为零);
  2. 自然语言处理(NLP):词袋模型(BoW)、TF-IDF矩阵(一篇文档仅含少量词汇,其余词汇对应值为零);
  3. 图计算:图的邻接矩阵(节点数多,边数少,非零元素对应边);
  4. 数值分析:有限元分析、偏微分方程求解中的系数矩阵(天然稀疏);
  5. 计算机图形学:三维模型的稀疏纹理矩阵、稀疏光照矩阵;
  6. 搜索引擎:网页-关键词索引矩阵(每个网页仅含少量关键词)。

总结

  1. 核心本质:稀疏矩阵是非零元素占比极低的矩阵,核心问题是存储冗余;
  2. 与稀疏数组的关系:稀疏数组是稀疏矩阵的基础压缩存储实现(三元组顺序表),是“逻辑对象-存储方案”的关系;
  3. 存储方案:基础用三元组(稀疏数组),工业级用CSR/CSC,频繁修改用十字链表;
  4. 核心价值:用压缩存储解决大规模稀疏数据的内存与计算效率问题,是大数据、机器学习的基础数据结构。

原文出处:/show_1GW2hHCtUXaL.html