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.mzph.cn/news/145675.shtml

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

相关文章

搭建知识付费系统的最佳实践是什么

在数字化时代&#xff0c;搭建一个高效且用户友好的知识付费系统是许多创业者和内容创作者追求的目标。本文将介绍一些搭建知识付费系统的最佳实践&#xff0c;同时提供一些基本的技术代码示例&#xff0c;以帮助你快速入门。 1. 选择合适的技术栈&#xff1a; 搭建知识付费…

Vim + YCM + clangd

目录 1. Vim的安装 1.1 Vim安装vim-plug2. 安装YCM3. 进行语言补全配置 3.1 测试效果 1. 目的&#xff1a;让 Vim 像 C/C IDE 一样具备自动补全代码等功能 2. YCM&#xff1a;YouCompleteMe GitHub - ycm-core/YouCompleteMe: A code-completion engine for Vi…

C#asp.net考试系统+sqlserver

C#asp.net简易考试系统 sqlserver在线考试系统学生登陆 判断学生是否存在 选择课程名 科目 可以进行答题操作&#xff0c;已经考试的课程不能再次答题&#xff0c; 自动根据课程名对应的题库生成试卷界面 加入选项类容 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数…

【机器学习】线性回归算法:原理、公式推导、损失函数、似然函数、梯度下降

1. 概念简述 线性回归是通过一个或多个自变量与因变量之间进行建模的回归分析&#xff0c;其特点为一个或多个称为回归系数的模型参数的线性组合。如下图所示&#xff0c;样本点为历史数据&#xff0c;回归曲线要能最贴切的模拟样本点的趋势&#xff0c;将误差降到最小。 2. 线…

Android并发编程与多线程

一、Android线程基础 1.线程和进程 一个进程最少一个线程&#xff0c;进程可以包含多个线程进程在执行过程中拥有独立的内存空间&#xff0c;而线程运行在进程内 2.线程的创建方式 new Thread&#xff1a; 缺点&#xff1a;缺乏统一管理&#xff0c;可能无限制创建线程&…

卷积神经网络(CNN)mnist手写数字分类识别的实现

文章目录 前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;我的环境&#xff1a; 2. 导入数据3.归一化4.可视化5.调整图片格式 二、构建CNN网络模型三、编译模型四、训练模型五、预测六、知识点详解1. MNIST手写数字数据集介绍2. 神经网络程序说明3. 网…

servlet页面以及控制台输出中文乱码

如图&#xff1a; servlet首页面&#xff1a; servlet映射页面&#xff1a; 以及控制台输出打印信息&#xff1a; 以上页面均出现中文乱码 下面依次解决&#xff1a; 1、首页面中文乱码 检查你的html或者jsp页面中meta字符集 如图设置成utf-8 然后重启一下tomcat 2、servl…

企业数字化过程中数据仓库与商业智能的目标

当前环境下&#xff0c;各领域企业通过数字化相关的一切技术&#xff0c;以数据为基础、以用户为核心&#xff0c;创建一种新的&#xff0c;或对现有商业模式进行重塑就是数字化转型。这种数字化转型给企业带来的效果就像是一次重构&#xff0c;会对企业的业务流程、思维文化、…

【数据结构与算法】JavaScript实现树结构(一)

文章目录 一、树结构简介1.1.简单了解树结构1.2.树结构的表示方式 二、二叉树2.1.二叉树简介2.2.特殊的二叉树2.3.二叉树的数据存储 三、二叉搜索树3.1.认识二叉搜索树3.2.二叉搜索树应用举例 一、树结构简介 1.1.简单了解树结构 什么是树&#xff1f; 真实的树&#xff1a;…

VS2017 IDE 编译时的 X86、x64位 是干什么的

指定编译出的程序是x86架构下的32位程序还是64位程序 VS2017项目配置X86改配置x64位_winform:把项目由x86改为x64-CSDN博客 vs平台选项&#xff1a;Any CPU,x86,x64_vs anycpu-CSDN博客

Jenkins中强制停止停不下来的job

# Script console 执行脚本 Jenkins 的提供了 script console 的功能&#xff0c;允许你写一些脚本&#xff0c;来调度 Jenkins 执行一些任务。 我们就可以利用 script console 来强制停止 job 执行。 首先进入 Jenkins 的 script console 页面&#xff1a; script console 路…

如何利用TSINGSEE青犀智能分析网关算法从人员、设备、行为三大角度进行监狱智能化升级改造

监狱作为关押犯人的重要场所&#xff0c;十分需要全天候全方位无死角的监控&#xff0c;但由于狱警人力有限&#xff0c;无法达到目前的监控需求。并且在监狱中&#xff0c;犯人众多也极易发生口角冲突&#xff0c;如若没有及时处理&#xff0c;就会发生难以挽回的意外。如何更…

MySQL分页查询的工作原理

前言 MySQL 的分页查询在我们的开发过程中还是很常见的&#xff0c;比如一些后台管理系统&#xff0c;我们一般会有查询订单列表页、商品列表页等。 示例&#xff1a; SELECT * FROM goods order by create_time limit 0,10; 在了解order by和limit的工作原理之前&#xff0c…

Python | 机器学习之逻辑回归

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《人工智能奇遇记》&#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 目录结构 1. 机器学习之逻辑回归概念 1.1 机器学习 1.2 逻辑回归 2. 逻辑回归 2.1 实验目的…

开发一款小程序游戏需要多少钱?

小程序游戏的开发成本因多种因素而异&#xff0c;无法提供具体的固定数字。以下是影响小程序游戏开发成本的一些关键因素&#xff1a; 游戏规模和复杂度&#xff1a; 小程序游戏可以是简单的休闲游戏&#xff0c;也可以是更复杂的策略游戏。规模和复杂度会影响开发所需的时间和…

字节跳动小程序开发:探索创新的数字化世界

在数字化时代&#xff0c;字节跳动小程序开发成为企业数字化转型的关键一环。通过这一平台&#xff0c;企业能够借助先进的技术和丰富的功能&#xff0c;实现创新、引领市场潮流。本文将通过一些简单的技术代码示例&#xff0c;带你深入了解字节跳动小程序开发的魅力。 1. 小…

科研学习|研究方法——python T检验

一、单样本T检验 目的&#xff1a;检验单样本的均值是否和已知总体的均值相等前提条件&#xff1a; &#xff08;1&#xff09;总体方差未知&#xff0c;否则就可以利用 Z ZZ 检验&#xff08;也叫 U UU 检验&#xff0c;就是正态检验&#xff09;&#xff1b; &#xff08;2&a…

Android SmartTable根据int状态格式化文字及颜色

private void initData() {List<UserInfo> list new ArrayList<>();list.add(new UserInfo("一年级", "李同学", 6, 1, 120, 1100, 450, 0));list.add(new UserInfo("一年级", "张同学", 6, 2, 120, 1100, 450, 1));list…

工业数据采集分析 数据跨层次、跨环节、跨系统大整合

在“工业4.0”、“智能制造”、“工业互联网”的大背景下&#xff0c;数据采集早就成为一个广泛关注的热点话题&#xff0c;不论智能制造发展到何种程度&#xff0c;数据采集都是生产过程中应用非常频繁的需求&#xff0c;也是工业物联网不可或缺的一环。 利用工业数据采集系统…

处理机器学习数据集中字符串列(pandas.get_dummies)

如图&#xff0c;在数据集中week列的数据不是数值型&#xff0c;会导致我们在训练过程中难以处理。 而pandas库中有一个非常好用的函数&#xff0c;独热编码pandas.get_dummies(df) 使用此函数之后&#xff0c;会在原数据中新建各列代表Fri-Sun&#xff0c;值为0或1&#xff…