稀疏矩阵:只存非零项的工程
约 14 分钟
网页、有限元网格和推荐系统的矩阵维度巨大,却只有少量非零元素。稀疏表示只保存非零值及其位置,使原本无法装入内存的问题可计算;但算法和存储格式必须配合。
常见格式
COO保存行、列、值三数组,便于构建;CSR按行压缩,适合矩阵乘向量和行访问;CSC按列压缩,适合列操作。转换有成本,按主要计算模式选择。
零不是缺失
推荐矩阵中“没有评分”不一定表示评分为0。若把未知值填0,会改变目标和偏差。稀疏结构的语义必须与数学零区分。
填充现象
稀疏矩阵做高斯消元或分解时,原来为零的位置可能出现非零,叫填充。重新排列变量可显著减少内存和计算,矩阵稀疏不保证分解也稀疏。
复杂度看非零数
稀疏矩阵—向量乘成本通常与非零项数量成正比,而非维数平方。基准测试要报告维度、非零数、分布和硬件,单一规模结论不能外推。
不要过早稀疏化
小而密的块可能用稠密算法更快;频繁随机插入CSR也低效。先理解数据流,再决定构建、压缩和计算阶段。
还要警惕稀疏矩阵在广播、加常数或某些分解时悄悄变稠密,操作前估算峰值内存,并在小数据上检查返回类型。
练习:把一个小图邻接矩阵写成COO与CSR,手算矩阵—向量乘,并比较存储数量。
小纸条
稀疏数据中的“未观测”为什么不能总当成数值零?