0

0

高效计算超大规模稀疏矩阵的行范数(L2范数)

碧海醫心

碧海醫心

发布时间:2026-03-01 18:12:11

|

866人浏览过

|

来源于php中文网

原创

高效计算超大规模稀疏矩阵的行范数(L2范数)

本文介绍如何在内存受限条件下,高效、稳定地计算百万级稀疏矩阵(如 500,000×500,000)每行的 L2 范数,避免 np.linalg.norm 崩溃或 OOM,重点推荐 scipy.sparse.linalg.norm 及底层等效实现。

本文介绍如何在内存受限条件下,高效、稳定地计算百万级稀疏矩阵(如 500,000×500,000)每行的 l2 范数,避免 `np.linalg.norm` 崩溃或 oom,重点推荐 `scipy.sparse.linalg.norm` 及底层等效实现。

对于超大规模稀疏矩阵(例如 500,000 × 500,000),直接调用 numpy.linalg.norm(A, axis=1) 会失败——不仅因 np.linalg.norm 不支持稀疏矩阵输入(抛出 AxisError: axis 1 is out of bounds for array of dimension 0),更关键的是,若先转为稠密格式(如 A.toarray() 或 A.A),将瞬间触发内存溢出(OOM),导致 Google Colab 内核崩溃。

幸运的是,scipy.sparse 提供了专为稀疏结构优化的范数计算接口:scipy.sparse.linalg.norm。它原生支持 CSR/CSC 格式,在不展开矩阵的前提下,仅遍历非零元素即可完成计算,时间与空间复杂度均正比于非零元数量(nnz),而非矩阵总尺寸。

✅ 推荐方案:使用 scipy.sparse.linalg.norm

from scipy import sparse
import numpy as np

# 假设 a 是 CSR 或 CSC 格式的稀疏矩阵(强烈建议预转换)
# a = sparse.csr_matrix(your_sparse_data)  # 确保是 csr_array 或 csr_matrix
row_norms = sparse.linalg.norm(a, axis=1)  # 返回 shape=(n_rows,) 的 numpy.ndarray

✅ 优势:简洁、健壮、无需分块;自动适配 CSR/CSC;支持 ord=2(默认)、ord=1、ord=np.inf 等常见范数。

? 底层原理与手动实现(可选进阶)

linalg.norm(a, axis=1) 对 L2 范数等价于:

Gatekeep
Gatekeep

Gatekeep AI是一个专注于将文本转化为教学视频的智能教学工具,主要用于数学和物理等学科的教育。

下载
  1. 对每个非零元平方(a.power(2),稀疏运算,不增加存储);
  2. 沿行方向求和(.sum(axis=1)),返回 (n_rows, 1) 矩阵;
  3. 开方并展平为一维数组。
# 等效手动实现(兼容旧版 scipy,返回 np.ndarray)
row_sums_of_squares = a.power(2).sum(axis=1)  # 输出 matrix 或 ndarray,取决于版本
row_norms = np.sqrt(np.asarray(row_sums_of_squares).ravel())  # 安全展平

⚠️ 注意:a.power(2) 是稀疏安全的(仍为 CSR),但 .sum(axis=1) 在旧版 scipy = 1.8)推荐使用 csr_array 替代 csr_matrix,其 .sum() 直接返回 ndarray:

a = sparse.csr_array(a)  # 显式升级为 array 类型(推荐)
row_norms = np.sqrt(a.power(2).sum(axis=1))  # 直接得到 (n_rows,) ndarray

❌ 为什么其他方法不可行?

  • np.linalg.norm(a.A, axis=1):强制稠密化,500K×500K 单精度浮点需约 1000 GB 内存,必然崩溃。
  • 分块 numpy.linalg.norm(如问题中 g() 函数):对稀疏矩阵 a[i:u] 切片仍会隐式转稠密(尤其 CSR 行切片效率低),且未利用稀疏性,性能差、内存波动大。
  • np.asarray(a, dtype=np.float32):同样触发稠密化,无效。

✅ 最佳实践总结

步骤 操作 说明
1. 确保格式 a = sparse.csr_array(a) 或 a = a.tocsr() CSR 格式对行范数计算最高效;csr_array 是 SciPy 1.8+ 推荐类型
2. 直接调用 norms = sparse.linalg.norm(a, axis=1) 零配置、最简、最稳
3. 内存监控 print(f"NNZ: {a.nnz}, Density: {a.nnz / (a.shape[0]*a.shape[1]):.2e}") 验证稀疏度,确保 nnz

? 提示:若需列范数(axis=0),同样适用;若需 Frobenius 范数(整个矩阵),用 sparse.linalg.norm(a)(无 axis 参数)即可,其内部也基于 a.power(2).sum() 实现。

通过上述方法,你可在数秒内完成 500,000 行稀疏矩阵的 L2 行范数计算,全程内存占用仅与非零元数量成正比,彻底规避崩溃风险。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

17

2026.02.03

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1728

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

549

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2335

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

42

2026.01.19

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1728

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

549

2025.10.17

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

24

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号