理解Compressed Sparse Column Format (CSC)

2023-05-16

最近在看《Spark for Data Science》这本书,阅读到《Machine Learning》这一节的时候被稀疏矩阵的存储格式CSC给弄的晕头转向的。所以专门写一篇文章记录一下我对这种格式的理解。

目的

Compressed Sparse Column Format (CSC)的目的是为了压缩矩阵,减少矩阵存储所占用的空间。这很好理解,手法无法就是通过增加一些"元信息"来描述矩阵中的非零元素存储的位置(基于列),然后结合非零元素的值来表示矩阵。这样在一些场景下可以减少矩阵存储的空间。

Spark API

在Spark中我们一般创建这样的稀疏矩阵的API为:

   package org.apache.spark.ml.linalg
     /**
   * Creates a column-major sparse matrix in Compressed Sparse Column (CSC) format.
   *
   * @param numRows number of rows
   * @param numCols number of columns
   * @param colPtrs the index corresponding to the start of a new column
   * @param rowIndices the row index of the entry
   * @param values non-zero matrix entries in column major
   */
  @Since("2.0.0")
  def sparse(
     numRows: Int,
     numCols: Int,
     colPtrs: Array[Int],
     rowIndices: Array[Int],
     values: Array[Double]): Matrix = {
    new SparseMatrix(numRows, numCols, colPtrs, rowIndices, values)
  }

使用CSC格式表示稀疏矩阵

例如我们想创建一下如下的3x3的稀疏矩阵:

    1   0   4
    0   3   5
    2   0   6

我们就可以使用上面的这个api:

    import org.apache.spark.ml.linalg.{Matrix,Matrices}
    val sm: Matrix = Matrices.sparse(3,3, Array(0,2,3,6), Array(0,2,1,0,1,2), Array(1.0,2.0,3.0,4.0,5.0,6.0))
    输出如下:
    sm: org.apache.spark.ml.linalg.Matrix = 3 x 3 CSCMatrix
(0,0) 1.0
(2,0) 2.0
(1,1) 3.0
(0,2) 4.0
(1,2) 5.0
(2,2) 6.0

也就是说上面的3x3的矩阵,可以表示为下面3个数组:

    Array(0, 2, 3, 6)
    Array(0, 2, 1, 0, 1, 2)
    Array(1, 2, 3, 4, 5, 6)

说实话我第一次看到这个api的时候有点蒙。下面因为没太看懂上面三个Array中的第一个Array(0, 2, 3, 6)是怎么的出来的。也翻看了比较权威的资料(本文最下方的参考资料),但是感觉说的比较不清楚,因此下面谈谈我是如何理解的。

我的理解

上面的3个Array:(为了便于书写我没有写1.0,而是直接写为1)

    Array(0, 2, 3, 6)
    Array(0, 2, 1, 0, 1, 2)
    Array(1, 2, 3, 4, 5, 6)

其中第三个Array很好理解。它的值就是按照,依次按照顺序记录的矩阵中的非零值。

第二个Array也比较好理解,他表示的是每一列,非零元素所在的行号,行号从0开始。比如上面的矩阵中,第一列元素1在第0行,元素2在第2行。

至于第1个Array理解起来稍微麻烦一些。我的总结就是:

  • 第一个Array的元素个数就是(矩阵的列数+1),也就是矩阵是3列,那么这个Array的个数就是4.
  • 第一个元素一直是0。第二个元素是第一列的非零元素的数量
  • 后续的值为前一个值 + 下一列非零元素的数量

上面的总结可能看起来比较模糊,根据上面的例子我来分析一下:

  • 首先矩阵的3x3的,所以第一个Array会有4个元素。第一个元素是0。得到Array(0)。
  • 矩阵第一列有2个非零元素,所以得到Array的第二个元素为2.得到Array(0, 2)
  • 矩阵的第二列有1个非零元素,那么第三个元素的数量为当前Array的最后一个元素加1,也就是2 + 1=3. 得到Array(0,2, 3)
  • 矩阵的第三列有3个非零元素,那么Array的最后一个元素的值为 3 + 3 = 6. 得到Array(0, 2, 3, 6)

验证例子

对于下面的这个3x3的矩阵:

    1   0   2
    0   0   3
    4   5   6

我们可以得到3个Array为:

Array(0, 2, 3, 6)
Array(0, 2, 2, 0, 1, 2)
Array(1, 4, 5, 2, 3, 6)

对于下面的矩阵:

    9   0
    0   8
    0   6

我们可以得到3个Array来表示他:

    Array(0, 1, 3)
    Array(0, 1, 2)
    Array(9, 8, 6)

对于下面的矩阵:

    9   0   0   0
    0   8   6   5

我们可以表示为:

    Array(0, 1, 2, 3, 4)
    Array(0, 1, 1, 1)
    Array(9, 8, 6, 5)

根据CSC表示法,画出原始矩阵

上面展示了如何把稀疏矩阵使用CSC表示,那么反过来应该怎么操作呢,

假设有一个2x4的矩阵,他的CSC表示为:

    Array(0, 1, 2, 3, 4)
    Array(0, 1, 1, 1)
    Array(9, 8, 6, 5)

我大致描述一下还原的过程:

  • 首先我们知道是2x4的矩阵,并且第一个Array的第二个元素是1,而且后续的每一个元素都比前一个元素大1,说明每一列都只有1个非零元素。
  • 根据第二个数组,我们可以知道只有第一列的非零元素在第一行,2,3,4列的非零元素都在第二行
  • 根据第三个Array,我们就可以比较简单的画出原始矩阵。

参考资料

  • Sparse matrix
  • Compressed Sparse Column Format (CSC)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

理解Compressed Sparse Column Format (CSC) 的相关文章

  • 如何自定义Boost.Log的“TimeStamp”格式

    我想得到年 月 日时 分 秒 分数 2位数字 如果我使用 Y m d H M S f 我几乎得到了什么我想要秒的小数部分 最后一部分 例外 它在我的 Windows XP 上显示 6 位数字 我不知道如何只获取 2 位数字 知道吗 我正在用
  • 将字符串转换为带时区的日期

    我有一个格式为 yyyy MM dd hh mm a 的字符串 我可以单独获取时区对象 其中上面的字符串代表日期 我想将其转换为以下格式 yyyy MM dd HH mm ss Z 我怎样才能做到这一点 您可以使用简单日期格式 http d
  • 如何使用excel-vba创建word文档删除部分

    您好 提前谢谢您 我正在使用 VBA 从 Excelfile 创建一个非常复杂的 Word 文档 应可以激活某些内容 并且单元格中写入的文本应传输到 Word 文档 我已经做好了 但如果它没有被激活 标签 将被删除 不留下任何东西 这意味着
  • 使用 to_char 函数解析为字符串时,如何从 Oracle 中的日期和月份值中删除前导零?

    我想检索 select 语句中日期和月份值前面没有前导零的日期 如果我执行以下查询 select to char sysdate dd mm yyyy from dual 我将得到 21 03 2014 结果 此外 如果今天是 2014 年
  • xcode4模板格式问题

    xcode4 使用新的项目模板格式 xctemplate 使用现有模板 我可以获得所需的一切 除了将文件添加到项目中而不复制它 我需要从我的模板创建的所有项目都使用共享资源 这样我就可以一次更新所有项目 只更新一个文件 谢谢 您是否尝试从模
  • 是否可以在没有 Visual Studio 的情况下安装 C# 编译器?

    我想从命令行构建项目 是否可以在不安装的情况下部署 C 编译器视觉工作室 http en wikipedia org wiki Microsoft Visual Studio 当然 该框架包含一个编译器 csc exe 看着本文 https
  • CodeDomProvider:LIB环境变量位于哪里?

    我正在使用一个System CodeDom Compiler CodeDomProvider CreateProvider CSharp 动态编译 C 类 最近 我从 Visual Studio 2010 切换到 Vistual Studi
  • 在 String.format (Java) 中使用“%1$#”是什么意思?

    语言是Java 什么是 1 意思是在 static String padright String str int num return String format 1 num str str 在 Java API 中 String form
  • 从 tkinter 中的文本小部件复制格式化文本

    我正在使用 tkinter 在 Python 中开发 APA 引文制作器 我使用文本小部件在生成引文后显示引文 但每当我复制文本 目前使用 ctrl c 快捷方式 时 它都会丢失其格式 是否有某种方法可以从文本小部件复制格式化文本 例如斜体
  • DateTime ParseExact 字符串未被识别为 DateTime C#

    我正在尝试将字符串解析为 DateTime 但出现错误 这是我的代码 return DateTime ParseExact 01 01 0001 12 00 00 AM dd MM yyyy HH mm ss tt CultureInfo
  • 为什么 New Date() 总是返回 null?

    如果日期格式是 scope timestamp 2016 12 16 07 02 15 am 我想格式化为16 12 2016 07 02 15 am 我已经尝试过下面的代码并且运行良好 scope originalStamp filter
  • 为什么Python有格式化函数和格式化方法

    The format http docs python org 2 library functions html format内置函数中的函数似乎是str format http docs python org 2 library stdt
  • 将 pandas 中的数字格式化为以千或百万为单位的货币

    我有一个数据框 pd DataFrame Amount 19000000 9873200 823449242 我需要将数字转换为以百万计的货币 即 19 00MM 9 88MM 和 823 45MM 有谁知道一个快速的方法来做到这一点 Th
  • 减去 r 中的时间

    我有一个包含两个时间变量的数据集 EndVisitTime and BoxTime 我每天都会制作数据集 因此这些观察结果都是在一天内进行的 Date lt 2014 8 12 EndVisitTime lt c 00 00 32 00 0
  • 使用 Powershell 在单独的单独行上列出完全路径文件名?

    如果我执行 Get ChildItem ext recurse 输出由一系列目录部分组成 后跟由所述目录部分分隔的每个匹配文件的一列或多列信息 有类似 Unix find 命令的东西吗 其中每个匹配的文件名及其完整的相对路径都出现在一行中
  • 如何以良好的格式结果格式化 python 列表

    我有很多列表 如下所示 通过打印data并将其与字符串连接起来check str如下最后一条语句所示 需要帮助以在字符串连接后更好地格式化列表值 如预期所示 print data printing lists in this variabl
  • Fortran:向文件添加列(即跳过不同数量的水平空格)

    我是 Fortran f90 的初学者 一些看似简单的问题结果却导致严重头痛 感谢您帮助我解决这个问题 我的代码运行一个循环 处理数据并将它们写入文件 我希望将这些数据写入同一文件的列中 直到循环完成 OPEN unit 11 file f
  • Lisp 格式和强制输出

    我不明白为什么这段代码在不同的实现中表现不同 format t asdf setq var read 在 CLISP 中 它的行为与预期一致 先打印提示 然后读取 但在 SBCL 中 它显示 then输出 我在网上查了一下 修改了一下 fo
  • printf 字符串,可变长度项

    define SIZE 9 int number 5 char letters SIZE this wont be null terminated char fmt string 20 sprintf fmt string d ds SIZ
  • PHP 日期/时间格式,需要一些帮助

    你能帮我使用 PHP 格式化以下日期吗 变量 start 包含以下日期 这个日期 Wed Feb 01 2012 05 00 00 GMT 080 应该成为 2012 02 01T13 00 00 我知道如何使用基本的 PHP 日期 时间格

随机推荐

  • 解析FAT16文件系统

    引导扇区的信息例如以下 xff1a 1 偏移地址00H xff0c 长度3 xff0c 内容 xff1a EB 3C 90 跳转指令 2 偏移地址03H xff0c 长度8 内容 xff1a 4D 53 44 4F 53 35 2E 30
  • 将 n个球放入M个盒子中, 设每个球落入各个盒子是等可能的,求有球的盒子数X 的期望...

    将 n个球放入M个盒子中 设每个球落入各个盒子是等可能的 求有球的盒子数X 的期望 引入随机变量 xi 表示第i个盒子有没有球 则 X 61 X1 43 X2 43 43 XM 于是 E X 61 E X1 43 E X2 43 43 E
  • Navicat for MySQL Mac 破解版

    今天在macOS 系统下搭建 Java开发环境 xff0c 需要配置MySQL xff0c 按照Windows的习惯 xff0c 使用Navicat for MySQL 操作比较习惯 然后找不到比较好的破解版 xff0c 这里介绍一个老版的
  • Echarts中X轴只显示最大值和最小值

    目标 xff1a 本篇文章是介绍使用Echarts时设置X轴上的刻度只显示最大值和最小值 xff0c 不显示其他的刻度 这个我在做项目的过程中遇到的一个需求 xff0c 我花费了很长的时间才找到的一种解决办法 xff0c 希望对后面遇到此坑
  • 机器学习期中考复习(md全是证明题)

    佛了
  • 页面字体随窗口变化大小

    详细描述 遇到了一个手机页面字体不能定死的问题 xff0c 页面会随着页面改变 xff0c 而改变大小 师弟遇到的问题 xff0c 我也遇到过 xff0c 我感觉这个东西可能还会有人遇到 截图 分辨是1000px的字体大小和400px的字体
  • 从Hadoop URL中读取数据

    为什么80 的码农都做不了架构师 xff1f gt gt gt 要从Hadoop文件系统中读取文件 xff0c 一个最简单的方法是使用java net URL对象来打开一个数据流 xff0c 从而从中读取数据 一般的格式如下 xff1a 1
  • 【01月11日】【精彩电影合集】【10部】【亲测】【Lsyq5647发布】

    今日电影更新 10部 1 爱情 07最新动作大片DVD中字 2 国家宝藏2 xff1a 神秘书 美国2008 动作大片DVD中文字幕 3 龙过鼠年 范伟 赵本山2008贺岁大片国语DVD版 4 本能 沙郎斯通性感演绎DVD未删减版 5 黑水
  • 关于ElasticsearchRepository的使用笔记

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一个很全的API链接文档 以下是使用Spring data Jpa操作ES的一些记录 在ElasticsearchRepository中我们可以使用Not Add Like
  • Java 判断实体类属性是否为空工具类

    2019独角兽企业重金招聘Python工程师标准 gt gt gt import org apache commons lang StringUtils import java lang reflect Field import java
  • TLS Error: TLS handshake failed解决办法

    直接修改端口号 服务器端和客服端都要改哟 转载于 https blog 51cto com luoguoling 1080298
  • windows禁用rc4 算法

    公司的Windows服务器被扫描出安全漏洞 SSL TLS 受诫礼 BAR MITZVAH 漏洞 CVE 2015 2808 和安全厂家沟通 xff0c 漏洞是由rc4算法 xff0c 引起的 xff01 把服务里面的rc4算法禁用就行了
  • iOS 抓取 UIwebview 上 所有 图片 并进行滚动播放

    关于在UIwebview上添加滚动图片 两种滚动手势会混淆 xff0c 应为webview有webview scrollview的属性 故参照昨天的随笔 scrollview嵌套解决方案 本篇随笔主要讲循环使用正则表达式 xff0c 本人在
  • 优化网络爬虫

    Date 2019 07 03 Author Sun 优化之前的网络爬虫代码如下 xff1a code coding utf 8 author 61 39 sun 39 date 61 39 2019 7 3 上午10 53 39 from
  • 如何使用SendMessage发送按键组合,例如:Ctrl+A

    代码 var hwnd Integer begin hwnd 61 FindWindow 39 Notepad 39 nil SetForegroundWindow hwnd keybd event VK CONTROL MapVirtua
  • 算法题:按规律输出

    编写算法 xff1a 打印具有下面规律的图形 1 5 2 8 6 3 10 9 7 4 输入 xff1a 手动输入n 输出 xff1a 格式输出n行 思路 xff1a 1 定义100x100的二维数组并给其赋值 a30a31a32a33a2
  • Python聚类色彩提取——Scipy-kmeans

    一 聚类 xff1a 物以类聚 数组可以进行聚类 xff0c 并找到数组的聚类中心 使用的第三方库是scipy xff0c 需要pip install scipy xff0c 先安装该库 数组聚类代码 xff1a import numpy
  • 推荐 3 款实用 Node.js 版本管理工具

    为了能够对 Node js 版本进行版本管理 xff0c 我整理了 3 款非常实用的 Node js 版本管理工具 xff0c 让大家能够自由地切换本地环境不同的 Node js 版本 1 nvm Github stars 60K 43 n
  • ipv6 neutron应用(一)

    一 neutron支持ipv6 xff0c 有2个重要的属性 1 ipv6 ra mode 2 ipv6 address mode 这2个属性都可以设置下面三个值 1 slaac 2 dhcpv6 stateful 3 dhcpv6 sta
  • 理解Compressed Sparse Column Format (CSC)

    最近在看 Spark for Data Science 这本书 xff0c 阅读到 Machine Learning 这一节的时候被稀疏矩阵的存储格式CSC给弄的晕头转向的 所以专门写一篇文章记录一下我对这种格式的理解 目的 Compres