Machine Learning On Spark——第二节:基础数据结构(二)

本节主要内容

  1. IndexedRowMatrix
  2. BlockMatrix

1. IndexedRowMatrix的使用

IndexedRowMatrix,顾名思义就是带索引的RowMatrix,它采用case class IndexedRow(index: Long, vector: Vector)类来表示矩阵的一行,index表示的就是它的索引,vector表示其要存储的内容。其使用方式如下:

package cn.ml.datastruct

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.linalg.distributed.RowMatrix
import org.apache.spark.mllib.linalg.distributed.CoordinateMatrix
import org.apache.spark.mllib.stat.MultivariateStatisticalSummary
import org.apache.spark.mllib.linalg.Matrix
import org.apache.spark.mllib.linalg.SingularValueDecomposition
import org.apache.spark.mllib.linalg.Matrices
import org.apache.spark.mllib.linalg.distributed.IndexedRow
import org.apache.spark.mllib.linalg.distributed.IndexedRowMatrix

object IndexRowMatrixDemo extends App {
  val sparkConf = new SparkConf().setAppName("IndexRowMatrixDemo ").setMaster("spark://sparkmaster:7077")
  val sc = new SparkContext(sparkConf)

  //定义一个隐式转换函数
  implicit def double2long(x:Double)=x.toLong
  //数据中的第一个元素为IndexedRow中的index,剩余的映射到vector
  //f.take(1)(0)获取到第一个元素并自动进行隐式转换,转换成Long类型
  val rdd1= sc.parallelize(
      Array(
          Array(1.0,2.0,3.0,4.0),
          Array(2.0,3.0,4.0,5.0),
          Array(3.0,4.0,5.0,6.0)
          )
      ).map(f => IndexedRow(f.take(1)(0),Vectors.dense(f.drop(1))))
   val indexRowMatrix = new IndexedRowMatrix(rdd1)
   //计算拉姆矩阵
   var gramianMatrix:Matrix=indexRowMatrix.computeGramianMatrix()
   //转换成行矩阵RowMatrix
   var rowMatrix:RowMatrix=indexRowMatrix.toRowMatrix()
   //其它方法例如computeSVD计算奇异值、multiply矩阵相乘等操作,方法使用与RowMaxtrix相同

}

2. BlockMatrix的使用

分块矩阵将一个矩阵分成若干块,例如:

可以将其分成四块

从而矩阵P有如下形式

更多分块矩阵的相关内容包括分块矩阵的转置、分块矩阵的相乘操作可以参见https://en.wikipedia.org/wiki/Block_matrix

package cn.ml.datastruct

import org.apache.spark.mllib.linalg.distributed.BlockMatrix
import org.apache.spark.mllib.linalg.distributed.CoordinateMatrix
import org.apache.spark.mllib.linalg.distributed.MatrixEntry
import org.apache.spark.mllib.linalg.distributed.IndexedRowMatrix
import org.apache.spark.SparkContext
import org.apache.spark.mllib.linalg.distributed.IndexedRow
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.SparkConf

object BlockMatrixDemo extends App {
  val sparkConf = new SparkConf().setAppName("BlockMatrixDemo").setMaster("spark://sparkmaster:7077") //这里指在本地运行,2个线程
  val sc = new SparkContext(sparkConf)

  implicit def double2long(x:Double)=x.toLong
  val rdd1= sc.parallelize(
      Array(
          Array(1.0,20.0,30.0,40.0),
          Array(2.0,50.0,60.0,70.0),
          Array(3.0,80.0,90.0,100.0)
          )
      ).map(f => IndexedRow(f.take(1)(0),Vectors.dense(f.drop(1))))
   val indexRowMatrix = new IndexedRowMatrix(rdd1)
   //将IndexedRowMatrix转换成BlockMatrix,指定每块的行列数
   val blockMatrix:BlockMatrix=indexRowMatrix.toBlockMatrix(2, 2)

   //执行后的打印内容:
  //Index:(0,0)MatrixContent:2 x 2 CSCMatrix
  //(1,0) 20.0
  //(1,1) 30.0
  //Index:(1,1)MatrixContent:2 x 1 CSCMatrix
  //(0,0) 70.0
  //(1,0) 100.0
  //Index:(1,0)MatrixContent:2 x 2 CSCMatrix
  //(0,0) 50.0
  //(1,0) 80.0
  //(0,1) 60.0
  //(1,1) 90.0
  //Index:(0,1)MatrixContent:2 x 1 CSCMatrix
  //(1,0) 40.0
  //从打印内容可以看出:各分块矩阵采用的是稀疏矩阵CSC格式存储
   blockMatrix.blocks.foreach(f=>println("Index:"+f._1+"MatrixContent:"+f._2))

   //转换成本地矩阵
   //0.0   0.0   0.0
   //20.0  30.0  40.0
   //50.0  60.0  70.0
   //80.0  90.0  100.0
   //从转换后的内容可以看出,在indexRowMatrix.toBlockMatrix(2, 2)
   //操作时,指定行列数与实际矩阵内容不匹配时,会进行相应的零值填充
   blockMatrix.toLocalMatrix()

   //块矩阵相加
   blockMatrix.add(blockMatrix)

   //块矩阵相乘blockMatrix*blockMatrix^T(T表示转置)
   blockMatrix.multiply(blockMatrix.transpose)

   //转换成CoordinateMatrix
   blockMatrix.toCoordinateMatrix()

   //转换成IndexedRowMatrix
   blockMatrix.toIndexedRowMatrix()

   //验证分块矩阵的合法性
   blockMatrix.validate()
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-10 07:11:53

Machine Learning On Spark——第二节:基础数据结构(二)的相关文章

【读书笔记】《鸟哥Linux私房菜-基础知识篇》第二节 基础命令

第二节 基础命令 uname –r 查询Linux核心版本. 装置及装置在Linux内的文件名 IDE硬盘机 /dev/hd[a-d] SCSI/SATA/USB硬盘机 /dev/sd[a-p] USB快闪碟 /dev/sd[a-p] 软盘驱动器 /dev/fd[0-1] 打印机 25针:/dev/lp[0-2] USB:/dev/usb/lp[0-15] 鼠标 USB:/dev/usb/mouse[0-15] PS2:/dev/psaux 当前CDROM/DVDROM /dev/cdrom 当

Machine Learning In Action 第二章学习笔记: kNN算法

本文主要记录<Machine Learning In Action>中第二章的内容.书中以两个具体实例来介绍kNN(k nearest neighbors),分别是: 约会对象预测 手写数字识别 通过“约会对象”功能,基本能够了解到kNN算法的工作原理.“手写数字识别”与“约会对象预测”使用完全一样的算法代码,仅仅是数据集有变化. 约会对象预测 1 约会对象预测功能需求 主人公“张三”喜欢结交新朋友.“系统A”上面注册了很多类似于“张三”的用户,大家都想结交心朋友.“张三”最开始通过自己筛选的

浅析基础数据结构-二叉堆

如题,二叉堆是一种基础数据结构 事实上支持的操作也是挺有限的(相对于其他数据结构而言),也就插入,查询,删除这一类 对了这篇文章中讲到的堆都是二叉堆,而不是斜堆,左偏树,斐波那契堆什么的 我都不会啊 一.堆的性质 1.堆是一颗完全二叉树 2.堆的顶端一定是“最大”,最小”的,但是要注意一个点,这里的大和小并不是传统意义下的大和小,它是相对于优先级而言的,当然你也可以把优先级定为传统意义下的大小,但一定要牢记这一点,初学者容易把堆的“大小”直接定义为传统意义下的大小,某些题就不是按数字的大小为优先

Machine Learning With Spark学习笔记(提取10万电影数据特征)

注:原文中的代码是在spark-shell中编写执行的,本人的是在eclipse中编写执行,所以结果输出形式可能会与这本书中的不太一样. 首先将用户数据u.data读入SparkContext中,然后输出第一条数据看看效果,代码如下: val sc = new SparkContext("local", "ExtractFeatures") val rawData = sc.textFile("F:\\ScalaWorkSpace\\data\\ml-10

课程三(Structuring Machine Learning Projects),第二周(ML strategy(2)) —— 0.Learning Goals

Learning Goals Understand what multi-task learning and transfer learning are Recognize bias, variance and data-mismatch by looking at the performances of your algorithm on train/dev/test sets [中文翻译] 学习目标 了解什么是多任务学习和迁移学习 通过在训练/开发/测试集上查看算法的性能, 识别偏差.方差和

Machine Learning With Spark学习笔记(在10万电影数据上训练、使用推荐模型)

我们如今開始训练模型,还输入參数例如以下: rank:ALS中因子的个数.通常来说越大越好,可是对内存占用率有直接影响,通常rank在10到200之间. iterations:迭代次数,每次迭代都会降低ALS的重构误差.在几次迭代之后,ALS模型都会收敛得到一个不错的结果,所以大多情况下不须要太多的迭代(一般是10次). lambda:模型的正则化參数,控制着避免过度拟合.值越大,越正则化. 我们将使用50个因子,8次迭代,正则化參数0.01来训练模型: val model = ALS.trai

深度之眼PyTorch训练营第二期 ---基础数据结构-张量

一.Tensor概念 张量:多维数组,标量.向量.矩阵的高维拓展 Tensor与Variable torch.autograd.Variable:数据类型,主要用于封装Tensor,进行自动求导,五个属性: data:被包装的Tensor grad:data的梯度 grad_fn:创建Tensor的Function,自动求导的关键 requires_grad:指示是否需要梯度 is_leaf:指示是否是叶子结点(张量) PyTorch0.4.0之后,Variable并入Tensor dtype:

NTU-Coursera机器学习:机器学习基石 (Machine Learning Foundations)

课讲内容 这门课以8周设计,分成 4个核心问题,每个核心问题约需2周的时间来探讨.每个约2个小时的录影中,每个小时为一个主题,以会各分成4到5个小段落,每个段落里会有一个后多个随堂的练习.我们在探讨每个核心问题的第二周.依上所述,課程的規畫如下: When Can Machines Learn? [何时可以使用机器学习] 第一周:(NTU-Coursera机器学习:机器学习问题与二元分类) 第一讲:The Learning Problem [机器学习问题]第二讲:Learning to Answ

线段树基础知识----(基础数据结构)--(一)

1.定义 引入:为什么要使用线段树而不用数组模拟呢? answer:因为有些题用数组来做就要超时,用线段树的O(log(n))的时间复杂度刚好可以求解 毫无疑问线段树是一种数据结构,但是它实际是一个类似树状的链表结构(个人认为) ///还是要正经一点(照搬教科书)----------- / ////////////////////////////////////////////////////////////////////// 线段树定义:线段树是一种二叉搜索树,与区间树相似,它将一个区间划分