mlib中的稠密矩阵和稀疏矩阵

  • 1.矩阵
    •  1.1. mlib中的矩阵特质(Matrix)
    •  1.1. Matrix定义的基本方法
  • 2. 稠密矩阵
    •  1.1. mlib中的稠密矩阵(DenseMatrix)
    •   1.1.1. Matrices类中的稠密矩阵构造
    •  1.2. DenseMatrix相关方法
    •   1.2.1. 构造方法
    •   1.2.2. 成员方法
  • 3. 稀疏矩阵
    •  2.1. mlib中的稀疏矩阵(SparseMatrix)
    •   1.1.1. Matrices类中的稀疏矩阵构造
    •  2.2. SparseMatrix相关方法
    •   1.2.1. 构造方法
    •   1.2.2. 成员方法
  • 4. 总结

1.矩阵

 1.1. mlib中的矩阵特质(Matrix)

  Matrix特质是DenseMatrix和SparseMatrix的共同基类,其只包含1个公共变量:

  可以看到isTransposed“是否转置”变量默认为false,所以如果在DenseMatrix或SparseMatrix实例创建时,若未传入isTransposed = true的参数,则将以列主序存储矩阵。

 1.1. Matrix定义的基本方法

  这些在特质中实现的基本方法在其子类中几乎不被重写,有很高的复用性。

//sealed trait Matrix in "Matrices.scala"返回矩阵元素数组:
toArray: Array[Double]返回矩阵行迭代器:
rowIter: Iterator[Vector]
·实现是将矩阵转置后再调用子类实现的列迭代器:this.transpose.colIter返回两个矩阵乘法结果:
multiply(y: DenseMatrix): DenseMatrix
返回矩阵向量乘法结果:
multiply(y: DenseVector): DenseVector
返回矩阵向量乘法结果:
multiply(y: Vector): DenseVector返回矩阵形式字符串:
toString: String
·调用私有方法asBreeze.toString()
返回以最大行列数控制的矩阵的字符串:
toString(maxLines: Int, maxLineWidth: Int): String
·(这个我一直测试不成功,或者我理解的不对?暂时无解)返回列主序的稀疏矩阵:
toSparseColMajor: SparseMatrix
返回行主序的稀疏矩阵:
toSparseRowMajor: SparseMatrix
返回对应的稀疏矩阵:
toSparse: SparseMatrix
·底层调用子类重写的私有方法toSparseMatrix(colMajor = true/false/isColMajor)类似上面的稀疏矩阵,返回稠密矩阵,同样调用子类重写的私有方法:
toDenseColMajor: DenseMatrix
toDenseRowMajor: DenseMatrix
toDense: DenseMatrix·注意:以上两类转换方法仅仅转换主序,并不转换元素。
·所以转换前后的矩阵元素大小及位置是不变的,仅仅变化的是矩阵的主序存储形式。返回压缩后的矩阵,该矩阵可能为稠密或稀疏、列主序或行主序的矩阵:
compressed: Matrix
返回压缩后的列主序矩阵:
compressedColMajor: Matrix
返回压缩后的行主序矩阵:
compressedRowMajor: Matrix
·底层实现用多个计算矩阵所占字节数的私有方法,对矩阵进行计算比较,对存储方式进行选择。

2. 稠密矩阵

 1.1. mlib中的稠密矩阵(DenseMatrix)

  mlib中存储稠密矩阵的形式只有两种,都需要给定行数和列数,以及数值数组,而后分为按列主序存储(默认)和按行主序存储。

  在mlib中创建稠密矩阵的方法有两种,分别是利用Matrices中的静态方法创建不同类型的稠密矩阵,或直接创建DenseMatrix对象,接下来将对这两种方法进行详细解析。

  1.1.1. Matrices类中的稠密矩阵构造

  先来看一下Matrix类中给出的创建DenseMatrix的方法:

//object Matrices in "Matrices.scala"创建稠密矩阵:
dense(numRows: Int, numCols: Int, values: Array[Double]): Matrix
创建0矩阵:
zeros(numRows: Int, numCols: Int): Matrix
创建1矩阵:
ones(numRows: Int, numCols: Int): Matrix
创建nxn的单位矩阵:
eye(n: Int): Matrix
生成一个符合均匀分布的随机矩阵:
rand(numRows: Int, numCols: Int, rng: Random): Matrix
生成一个符合高斯分布的随机矩阵:
randn(numRows: Int, numCols: Int, rng: Random): Matrix
生成对角阵:
diag(vector: Vector): Matrix
将矩阵数组横向拼接:
horzcat(matrices: Array[Matrix]): Matrix
将矩阵数组纵向拼接:
vertcat(matrices: Array[Matrix]): Matrix

  其中除了horzcat和vertcat外都调用DenseMatrix类中的方法,而行拼接和列拼接方法中对数组中矩阵的类型进行了判断,矩阵可以为Matrix的两个子类DenseMatrix和SparseMatrix,从而以不同的方式返回拼接结果。

 1.2. DenseMatrix相关方法

  1.2.1. 构造方法

  DenseMatrix底层直接以Array[Double]数组存储矩阵数据:

  当参数列表缺少isTransposed参数时,默认为false,也就是默认按列主序存储:

  Matrices中创建稠密矩阵的方法调用了DenseMatrix的Object类中的静态方法,而这些方法其实就是对DenseMatrix对象创建参数列表中的行列值和数值数组进行简单的运算,也可以直接通过DenseMatrix的静态类中的方法进行直接创建。

//object DenseMatrix in "Matrices.scala"创建0矩阵:
zeros(numRows: Int, numCols: Int): DenseMatrix创建1矩阵:
ones(numRows: Int, numCols: Int): DenseMatrix
·内部利用数组方法实现:Array.fill(numRows * numCols)(1.0)创建nxn的单位矩阵:
eye(n: Int): DenseMatrix
·与ones方法不同,并且也不调用ones方法(这点不太明白为什么这样设计)
·内部利用一个私有的update方法遍历设置:identity.update(i, i, 1.0)
·(这个update方法如此好用却是私有,也很令人困惑,导致mlib中的矩阵无法单独修改某个元素的值)生成一个符合均匀分布的随机矩阵:
rand(numRows: Int, numCols: Int, rng: Random): DenseMatrix
·内部利用数组方法实现:Array.fill(numRows * numCols)(rng.nextDouble())生成一个符合高斯分布的随机矩阵:
randn(numRows: Int, numCols: Int, rng: Random): DenseMatrix
·内部利用数组方法实现:Array.fill(numRows * numCols)(rng.nextGaussian())生成对角阵:
diag(vector: Vector): DenseMatrix
·利用循环进行设置:matrix.update(i, i, values(i))

  1.2.2. 成员方法

  DenseMatrix类重写的方法:

//class DenseMatrix in "Matrices.scala"判断两个矩阵是否完全相等:
equals(o: Any): Boolean返回Hash值:
hashCode: Int返回指定位置元素:
apply(i: Int, j: Int): Double复制矩阵:
copy: DenseMatrix对矩阵进行转置,调换行列主序:
transpose: DenseMatrix定义函数,利用行列下标和对应元素值进行计算:
foreachActive(f: (Int, Int, Double) => Unit): Unit
·该方法不改变矩阵元素返回矩阵中非0元素个数:
numNonzeros: Int
·内部利用数组方法实现:values.count(_ != 0)返回矩阵中元素个数:
numActives: Int返回列迭代器:
colIter: Iterator[Vector]

3. 稀疏矩阵

 2.1. mlib中的稀疏矩阵(SparseMatrix)

  mlib中的SparseMatrix稀疏矩阵以列起始号、行号、元素数值三个数组进行存储,具体的构造方法在之后的内容中将体现,我们先以一张示意图看一下mlib是如何以稀疏矩阵的形式存储矩阵的:

  SparseMatrix和DenseMatrix一样,可以通过Matrices静态类或SparseMatrix类提供的方法进行构造。

  1.1.1. Matrices类中的稀疏矩阵构造

//object Matrices in "Matrices.scala"创建稀疏矩阵:
sparse(numRows: Int,numCols: Int,colPtrs: Array[Int],rowIndices: Array[Int],values: Array[Double]): Matrix
创建nxn的单位矩阵:
speye(n: Int): Matrix
生成一个符合均匀分布的随机矩阵:
sprand(numRows: Int, numCols: Int, density: Double, rng: Random): Matrix
生成一个符合高斯分布的随机矩阵:
sprandn(numRows: Int, numCols: Int, density: Double, rng: Random): Matrix
将矩阵数组横向拼接:
horzcat(matrices: Array[Matrix]): Matrix
将矩阵数组纵向拼接:
vertcat(matrices: Array[Matrix]): Matrix

  可以看出,稀疏矩阵除了构造的方式与稠密矩阵不同外,其它大部分方法是相同的,因为稀疏矩阵和稠密矩阵本身就是矩阵存储的两种方式。

 2.2. SparseMatrix相关方法

  1.2.1. 构造方法

  SparseMatrix底层也是与DenseMatrix一样只采用数组形式存储数据,并没有复杂的数据结构,只不过由三个数组共同存储,当矩阵含大量0元素时,这样的存储形式对比稠密矩阵存储能够节省大量的存储空间:

  SparseMatrix同样有isTransposed“是否转置”参数,并由此控制列主序还是行主序,默认情况下为列主序:

  SparseMatrix静态类中同样有被Matrices构造方法调用的静态构造方法,其中有一个fromCOO方法为SparseMatrix独有的方法,可以传入SparseMatrix数据结构的迭代器生成新的矩阵,这个在矩阵拆分时有很大用处。

//object SparseMatrix in "Matrices.scala"利用SparseMatrix数据结构的迭代器创建稀疏矩阵:
fromCOO(numRows: Int, numCols: Int, entries: Iterable[(Int, Int, Double)]): SparseMatrix创建nxn的单位矩阵:
speye(n: Int): SparseMatrix生成一个符合均匀分布的随机矩阵:
sprand(numRows: Int, numCols: Int, density: Double, rng: Random): SparseMatrix生成一个符合高斯分布的随机矩阵:
sprandn(numRows: Int, numCols: Int, density: Double, rng: Random): SparseMatrix生成对角阵:
spdiag(vector: Vector): SparseMatrix

  1.2.2. 成员方法

  SparseMatrix与DenseMatrix一样重写了父类Matrix的部分方法,并且十分相似:

//class SparseMatrix in "Matrices.scala"判断两个矩阵是否完全相等:
equals(o: Any): Boolean
返回Hash值:
hashCode(): Int
返回指定位置元素:
apply(i: Int, j: Int): Double
复制矩阵:
copy: SparseMatrix
对矩阵进行转置,调换行列主序:
transpose: SparseMatrix
定义函数,利用行列下标和对应元素值进行计算:
foreachActive(f: (Int, Int, Double) => Unit): Unit
返回矩阵中非0元素个数:
numNonzeros: Int
返回矩阵中元素个数:
numActives: Int
返回列迭代器:
colIter: Iterator[Vector]

4. 总结

  mlib中的矩阵定义的方法还不是很复杂,通过源码可以比较清晰地了解矩阵库运行的底层形式,为学习和使用提供了很大便利。当然,随着对Mlib矩阵库的了解不断加深,加上通过对源码的探究,mlib中部分设计会令人费解或不适用,这时就需要我们亲自操刀,充分利用库的架构和现有的代码给我们带来的便利,让mlib结合Spark发挥出更加强大的作用!

【Scala-spark.mlib】稠密矩阵和稀疏矩阵的创建及操作相关推荐

  1. spark mlib坐标矩阵(Coordinate Matrix)

    坐标矩阵CoordinateMatrix是一个基于矩阵项构成的RDD的分布式矩阵.每一个矩阵项MatrixEntry都是一个三元组:(i: Long, j: Long, value: Double), ...

  2. spark mlib行索引矩阵

    索引行矩阵IndexedRowMatrix与RowMatrix相似,但它的每一行都带有一个有意义的行索引值,这个索引值可以被用来识别不同行,或是进行诸如join之类的操作. 其数据存储在一个由Inde ...

  3. Spark MLib 数据类型

    Spark MLib 数据类型 1.  MLlib Apache Spark's scalable machine learning library, with APIs in Java, Scala ...

  4. 利用Spark MLIB实现电影推荐

    利用Spark MLIB实现电影推荐 源码及数据集:https://github.com/luo948521848/BigData Spark 机器学习库MLLib MLlib是Spark的机器学习( ...

  5. spark mlib行矩阵(RowMatrix)入门

    行矩阵RowMatrix是最基础的分布式矩阵类型. 每行是一个本地向量,行索引无实际意义(即无法直接使用). 数据存储在一个由行组成的RDD中,其中每一行都使用一个本地向量来进行存储. 由于行是通过本 ...

  6. sbt構建一個spark工程(scala+spark+sbt)

    準備工作,文件結構如下: (python2.7) appleyuchi@ubuntu:~/Desktop/WordCount$ tree . ├── build.sbt ├── src │      ...

  7. fpgrowth算法实战 mlib_【spark】41.Spark Mlib:FPGrowth算法

    简介 FP-Growth算法是韩嘉炜等人在2000年提出的关联分析算法,它采取如下分治策略:将提供频繁项集的数据库压缩到一棵频繁模式树(FP-tree),但仍保留项集关联信息. 在算法中使用了一种称为 ...

  8. Spark Mlib TFIDF源码详读 笔记

    2019独角兽企业重金招聘Python工程师标准>>> 在提取文本特征时,经常用到TF-IDF算法.Spark Mlib实现了该算法.下面是Spark Mlib中,TF_IDF算法调 ...

  9. 并行算法第三讲:稠密矩阵乘法

    并行算法设计与分析课程总结 第三讲:稠密矩阵乘法 Cannon 乘法 Fox 乘法 Systolic乘法 脉动阵列 dns(CC)乘法

最新文章

  1. 【 Notes 】 AGPS or Assisted GPS
  2. Office下Word直接转换成Pdf格式!
  3. [python]逆水行舟不进则退(1)
  4. k8s强制删除一直处于terminating状态的pod
  5. 洛谷P2463 [SDOI2008]Sandy的卡片(后缀数组SA + 差分 + 二分答案)
  6. Windows Phone7 手机越狱教程
  7. 求一个数的最大公约数
  8. CAD建模软件:BricsCAD 22 for Mac
  9. 约瑟夫环c语言程序完整版,约瑟夫环的c语言实现(代码已实现)
  10. wap2.0技巧篇(转)
  11. 下载mysql驱动jar包教程
  12. 手把手教你安装破解IAR For ARM 6.3
  13. LNK1169 LNK2005错误
  14. HTML5网页设计的基本知识-几个概念
  15. Ubuntu中扩大虚拟机硬盘容量
  16. BCM业务连续性管理
  17. 2023华东交通大学计算机考研信息汇总
  18. Niushop开源商城:618电商大趴开始预热啦!你的开源商城系统呢?
  19. excel怎么启用宏_怎么使用Excel制作条形码?操作如此简单
  20. 第十四篇,STM32的CAN总线通信

热门文章

  1. 数据科学教育白皮书联合发布!顶级数据人才成长路径
  2. LoveLive!出了一篇AI论文:生成模型自动写曲谱
  3. 你掌握了什么概念或技术使你感觉自我提升突飞猛进?
  4. Transformer的前世今生
  5. 知乎热议:985 计算机视觉研究生找不到工作怎么办?
  6. 大陆唯一7nm光刻机被抵押!武汉千亿投资、台积电大牛掌舵的芯片项目官宣停摆...
  7. 疫情之下,村干部们的智慧越来越...
  8. 线性回归之数学:求导公式
  9. 实验四 JSP数据库编程基础
  10. 干货|(DL~3)deep learning中一些层的介绍