MXNet中图解稀疏矩阵(Sparse Matrix)的压缩与还原

1、概述

对于稀疏矩阵的解释,就是当矩阵里面零元素远远多于非零元素,且非零元素没有规律,这样的矩阵就叫做稀疏矩阵,反过来就是稠密矩阵,其中非零元素的数量与所有元素的比值叫做稠密度,一般稠密度小于0.05的都叫做稀疏矩阵。
我们知道压缩文件的时候,可以将大文件压缩成一个很小的文件,这是因为存在很多冗余,我们通过压缩算法将其进行压缩,同样的,既然矩阵里面存在很多零元素,我们也是可以将其剔除,这样就可以节省大量的存储空间了,而且可以提高计算的性能节约大量时间。其应用非常广泛,计算流体力学、统计物理、电路模拟、图像处理、纳米材料计算等。

2、压缩稀疏矩阵

那如何对其进行压缩以及还原呢,这里会将稀疏矩阵压缩成三个数组data、indptr、indices,让后通过这三个数组又可以进行还原成原来的矩阵。

data:只存储非零元素
indptr:存储的是非零元素每行的累加数量,这样就能知道每行有多少个非零元素,当然这里为了计算每行的数量,也就是通过indptr[i+1] - indptr[i]可以计算到第i行的数量,为了便于计算第一行的数量,这里数组第一个元素设定为0
indices:存储非零元素所在列的索引值,这样就可以定位其在稀疏矩阵中的位置

通过这三个数组,我们就能够快速地找到任意非零元素的位置,从而进行矩阵运算和求解,大大减少计算时间。
我们通常会使用一种称为压缩稀疏行(Compressed Sparse Row,CSR)或者压缩稀疏矩阵(Compressed Sparse Matrix,CSM)的存储方式。
接下来我们看下载MXNet中的实际应用。

3、示例1

3.1、拆分稀疏矩阵

from mxnet import nd
import mxnet as mx
n1 = nd.array([[1,0,0,0],[4,0,2,0],[0,0,0,3],[5,1,0,0]])
/*
[[1. 0. 0. 0.][4. 0. 2. 0.][0. 0. 0. 3.][5. 1. 0. 0.]]
<NDArray 4x4 @cpu(0)>
*/

稠密矩阵转换成稀疏矩阵 

n1_csr = n1.tostype('csr')
<CSRNDArray 4x4 @cpu(0)>

非零元素

n1_data = n1_csr.data
[1. 4. 2. 3. 5. 1.]
<NDArray 6 @cpu(0)>

非零元素每行的累加数量

n1_indptr = n1_csr.indptr
[0 1 3 4 6]
<NDArray 5 @cpu(0)>

这里就可以得到第几行有几个非零元素,比如第二行有两个非零元素,我们通过 n1_indptr[2]-n1_indptr[1] 即可获取。

非零元素的位置

n1_indices = n1_csr.indices
[0 0 2 3 0 1]
<NDArray 6 @cpu(0)>

这样就将n1这样一个稀疏矩阵拆分成了三个数组,尤其是在实践中会经常碰见大的稀疏矩阵,这样拆分的小数组,就起到了很好的压缩的效果。

3.2、稀疏转换稠密

前面是稠密矩转换成稀疏矩阵,当然也可以将稀疏矩阵转换成稠密矩阵,两种方法,最简单的就是直接强制类型转换:

n1_csr.asnumpy()
array([[1., 0., 0., 0.],[4., 0., 2., 0.],[0., 0., 0., 3.],[5., 1., 0., 0.]], dtype=float32)

另外一种方法就是将三个拆分的数组进行组合:

n1_o = nd.sparse.csr_matrix((n1_data, n1_indices, n1_indptr), shape = (4, 4))
n1_o.asnumpy()
array([[1., 0., 0., 0.],[4., 0., 2., 0.],[0., 0., 0., 3.],[5., 1., 0., 0.]], dtype=float32)

这里还可以对形状进行指定,比如只截取3x3的矩阵:

n1_o = nd.sparse.csr_matrix((n1_data, n1_indices, n1_indptr), shape = (3,3))
n1_o.asnumpy()
array([[1., 0., 0.],[4., 0., 2.],[0., 0., 0.]], dtype=float32)

也可以直接定义为稀疏矩阵:

src = nd.sparse.zeros('csr', (3,3))
<CSRNDArray 3x3 @cpu(0)>

3.3、不同上下文比较

from mxnet import nd
import mxnet as mxx = nd.ones((2,3)) # 默认是CPU
y = x.as_in_context(mx.cpu())
z = x.as_in_context(mx.gpu())y is x # True
z is x # False

就算它们的值是一样的,不在同一个上下文的值也是不能比较,这里很明显一个在CPU上计算,另一个是在GPU上计算。

4、示例2

再来看一个例子进行巩固下,后面也会以这个例子做一张图,了解稀疏矩阵的拆分原理。

也就是在上面例子增加一行全是0元素,这样就更加明白那个累加数量indptr的含义

from mxnet import nd
import mxnet as mxn2 = nd.array([[1,0,0,0],[4,0,2,0],[0,0,0,0],[0,0,0,3],[5,1,0,0]])
[[1. 0. 0. 0.][4. 0. 2. 0.][0. 0. 0. 0.][0. 0. 0. 3.][5. 1. 0. 0.]]
<NDArray 5x4 @cpu(0)>
n2_csr = n2.tostype('csr')
<CSRNDArray 5x4 @cpu(0)>n2_data = n2_csr.data
[1. 4. 2. 3. 5. 1.]
<NDArray 6 @cpu(0)>n2_indptr = n2_csr.indptr
[0 1 3 3 4 6]
<NDArray 6 @cpu(0)>n2_indices = n2_csr.indices
[0 0 2 3 0 1]
<NDArray 6 @cpu(0)>

5、图解

有了以上的介绍,应该都很熟悉这个稀疏矩阵,最后本人画了一张图,这样更能直观感受下稀疏矩阵拆分成三个数组的整个过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/178866.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

今年跳槽成功测试工程师原来是掌握了这3个“潜规则”

随着金九银十逐渐进入尾声&#xff0c;还在观望机会的朋友们已经开始焦躁&#xff1a;“为什么我投的简历还没有回音&#xff1f;要不要趁现在裸辞好好找工作&#xff1f;” “金九银十”作为人们常说的传统“升职加薪”的黄金季节&#xff0c;也是许多人跳槽的理想时机。然而…

云原生下GIS服务规划与设计

作者&#xff1a;lisong 目录 背景云原生环境下GIS服务的相关概念GIS服务在云原生环境下的规划调度策略GIS服务在云原生环境下的调度手段GIS服务在云原生环境下的服务规划调度实践 背景 作为云原生GIS系统管理人员&#xff0c;在面对新建的云GIS系统时&#xff0c;通常需要应对…

【Rust】快速教程——从hola,mundo到所有权

前言 学习rust的前提如下&#xff1a; &#xff08;1&#xff09;先把Rust环境装好 &#xff08;2&#xff09;把VScode中关于Rust的插件装好 \;\\\;\\\; 目录 前言先写一个程序看看Rust的基础mut可变变量let重定义覆盖变量基本数据类型复合类型&#xff08;&#xff09;和 [ …

Java中的继承

文章目录 前言一、为什么需要继承二、继承的概念三、继承的语法四、父类成员访问4.1子类中访问父类的成员变量1.子类和父类不存在同名成员变量2.子类和父类成员变量同名 4.2子类中访问父类的成员方法1.成员方法名字不同2.成员方法&#xff0c;名字相同 五、super和this关键字六…

很多工程师,最后都是被生活裹挟,没法一直在技术路径走到极致

最近比较少更了&#xff0c;但内容一直在写&#xff0c;只是从长文变成了短文&#xff0c;直接发朋友圈了。 如果喜欢我写的内容&#xff0c;请移步到朋友圈。 我是一个不喜欢讲哲理的人&#xff0c;感觉哲学都是理论&#xff0c;都是鸡血&#xff0c;很难落地&#xff0c;我…

有效数字(表示数值的字符串),剑指offer,力扣

目录 题目地址&#xff1a; 我们直接看题解吧&#xff1a; 难度分析&#xff1a; 解题方法&#xff1a; 审题目事例提示&#xff1a; 解题思路&#xff1a; 代码实现&#xff1a; 题目地址&#xff1a; LCR 138. 有效数字 - 力扣&#xff08;LeetCode&#xff09; 难度&#xf…

MySQL 分库分表与 TiDB(平凯数据库),如何选择?

随着互联网行业的飞速发展&#xff0c;数据量不断增长&#xff0c;传统的关系型数据库已经无法满足大规模数据处理的需求。为了解决这一问题&#xff0c;分库分表和分布式数据库应运而生。本文将对比分析 MySQL 分库分表和 TiDB 这两种解决方案&#xff0c;帮助大家更好地选择适…

【VSCode】Visual Studio Code 配置简体中文环境教程

介绍 Visual Studio Code&#xff08;简称 VS Code&#xff09;是一款轻量级的代码编辑器&#xff0c;它支持多种编程语言&#xff0c;并且具有丰富的功能和插件扩展。如果你更喜欢使用简体中文界面&#xff0c;那么本教程将向你展示如何在 VS Code 中配置简体中文环境。 步骤…

Redhat8.3上部署Lustre文件系统

Lustre文件系统 Lustre架构是用于集群的存储架构。Lustre架构的核心组件是Lustre文件系统&#xff0c;它在Linux操作系统上得到支持&#xff0c;并提供了一个符合POSIX *标准的UNIX文件系统接口。 Lustre存储架构用于许多不同类型的集群。它以支持世界上许多最大的拥有数万个…

ubuntu22.04下hadoop3.3.6+hbase2.5.6+phoenix5.1.3开发环境搭建

一、涉及软件包资源清单 1、java 这里使用的是openjdk 2、hadoop-3.3.6.tar.gz 3、hbase-2.5.6-hadoop3-bin.tar.gz 4、phoenix-hbase-2.5-5.13-bin.tar.gz 5、apache-zookeeper-3.8.3-bin.tar.gz 6、openssl-3.0.12.tar.gz 二、安装 1、操作系统环境准备 换源 sudo vim /et…

uniapp基础学习笔记01

文章目录 本博客根据黑马教程学习uniapp一、技术架构二、创建项目2.1 Hbuilder创建2.2 插件安装2.3 微信开发者工具配置与运行2.3.1 简单修改基础页面 2.4 pages.json和tabBar2.4.1 pages.json与tabBar配置2.4.2 案例 三、uniapp与原生开发的区别 本博客根据黑马教程学习uniapp…

推出链上美债产品的 ProsperEx:RWA 衍生品赛道的早期玩家

美债是目前 RWA 市场中进展较快的领域之一&#xff0c;目前该市场的规模&#xff08;TVL&#xff09;已经达到了 $770 M&#xff0c;并且美债 RWA 市场目前正在以每月大约 10% 的增长速度扩大规模。 图源&#xff1a;app.rwa.xyz/treasuries 在该领域&#xff0c;固定收益类美债…