MLlib支持几种数据类型:本地向量(local vectors),和存储在一个简单机器中的矩阵(matrices),以及由一个或多个RDDs组成的分布式矩阵.
1,本地向量(Local Vector)
    一个本地向量是由从0开始的整型下标和double型值组成,存储在一个单机节点上.MLlib支持两种类型的本地向量:密集的和稀疏的.密集向量用一个double数组来存储值.而一个稀疏向量由两个并列的数组,下表和值组成.例如,一个向量(1.0, 0.0, 3.0)可以由密集的数组[1.0,0.0,3.0]表示,或者可以由(3,[0,2],[1.0,3.0])表示,其中3是指向量大小.后面表示,第0个元素是1.0,第2个元素是3.0.由此可看出,0.0在稀疏向量中可省略不写.
    本地向量的基本类型是Vector,并且有两个子类型:DenseVector,SparseVector.建议使用Vectors中的工厂方法来创建本地向量.
    import org.apache.spark.mllib.linalg.{Vector,Vectors}
    //创建一个密集向量(1.0,0.0,3.0)
    val dv:Vector = Vectors.dense(1.0,0.0,3.0)
    //通过设置非零元素的下标和值来创建一个稀疏向量(1.0,0.0,3.0)
    val sv1:Vector = Vectors.sparse(3,Array(0,2),Array(1.0,3.0))
    //通过另一种方式创建稀疏向量,采用下标,值对形式
    val sv2:Vector = Vectors.sparse(3,Seq((0,1.0),(2,3.0)))
注意:Scala默认imports scala.collection.immutable.Vector,所以一定要记得手动引入MLlib的Vector类

2,带标签的点(Labeled point)
    带标签的点实质上是一个本地向量(既可以是密集向量也可以是稀疏向量)和类标签(label/response).在MLlib中,带标签的点一般用在有监督学习算法中.用double数据存储一个标签,所以可以把带标签的点用在回归和分类算法(regression and classification)中.对于二分型分类算法,标签用0和1表示.对多分型分类算法,标签可以用从0开始的下标表示:0,1,2.....
    MLlib中带标签的点用LabeledPoint类表示
    import org.apache.spark.mllib.linglg.Vectors
    import org.apache.spark.mllib.regression.LabeledPoint
    //创建一个标签为1,数据为密集型向量构成的带标签点
    val pos = LabeledPoint(1.0, Vectors.dense(1.0,0.0,3.0))
    //创建一个标签为0,数据为稀疏型向量构成的带标签点
    val neg = LabeledPoint(0.0, Vectors.sparse(3,Array(0,2),Array(1.0,3.0)))

    (1)稀疏数据(sparse data)
    使用稀疏数据是很普遍的现象.MLlib支持读取以LIBSVM格式存储的训练数据,LIBSVM是LIBSVM和LIBLINEAR默认的格式.它是一种text格式的数据,里面的每一行代表一个含类标签的稀疏向量,格式如下:
    label index1:value1 index2:value2 .....
    LIBSVM中index是从1开始的,在加载完成后索引被转换成从0开始.
    用MLUtins.loadLibSVMFile从LIBSVM格式中读取数据
    import org.apache.spark.mllib.regression.LabeledPoint
    import org.apache.spark.mllib.util.MLUtils
    import org.apache.spark.rdd.RDD

    val examples:RDD[LabeledPoint] = MLUtils.loadLibSVMFile(sc, "data/mllib/sample_libsvm_data.txt")
    SPARK_HOME/data/mllib/sample_libSVM_data.txt中数据格式如下

红色方框中的0和1代表标签类型

3,本地矩阵(Local matrix)
     本地矩阵由下标和double型的数值组成,其中下标是由整型数据表示行和列,保存在单个机器中。MLlib支持稀疏矩阵和密集矩阵,密集矩阵的值存在一个double数组中,一列列的进行存储。如下所示为一个密集矩阵
     
表示一个size为(3,2)的密集矩阵,其值存在一个一维数组中,数组值为[1.0, 3.0, 5.0, 2.0, 4.0, 6.0]。稀疏矩阵的非零元素值都保存在压缩的稀疏列(Compressed Sparse Column,CSC)中,按列优先的顺序存储。
     本地矩阵基本类型为Matrix,有两个子类型:DenseMatrix和SparseMatrix。推荐使用Matrices的工厂方法来生成本地矩阵。必须牢记,MLlib中的本地矩阵数值是按列的顺序进行存储的。
     import org.apache.spark.mllib.linalg.{Matrix,Matrices}
     //创建一个密集矩阵((1.0, 2.0), (3.0, 4.0), (5.0, 6.0))
     val dm:Matrix = Matrices.dense(3,2, Array(1.0, 3.0, 5.0, 2.0, 4.0, 6.0))
     //创建一个稀疏矩阵((9.0, 0.0), (0.0, 8.0), (0.0, 6.0))
     val sm:Matrix = Matrices.sparse(3,2,Array(0,1,3),Array(0,2,1),Array(9,6,8))
注:稀疏矩阵解释,首先指定矩阵是3行2列,Array(0,1,3)是指,第0个非零元素为一列,第1,第二个非零元素为第二列.Array(0,2,1)是指,第一个非零元素在第0行,第二个非零元素在第2行,第三个非零元素在第1行.此处设计比较好,假设100个元素分两列,不需要把每个元素所在列都标出来,只需要记录3个数字即可.
Array(9,6,8)表示按顺序存储非零元素.

4,分布式矩阵(Distributed Matrix)
     一个分布式矩阵也是由下标和double型的值组成,不过分布式矩阵的下标不是Int型,而是long型,数据分布式保存在一个或多个RDD中。选择正确的格式来保存海量和分布式的矩阵是非常重要的。将分布式矩阵转换成不同的格式需要一个全局的shuffle(global shuffle),而全局shuffle的代价会非常高。到目前为止,已经实现了三种分布式矩阵。
     最基本的分布式矩阵是RowMatrix,它是一个行式的分布式矩阵,没有行索引。比如一系列特征向量的集合。RowMatrix由一个RDD代表所有的行,每一行是一个本地向量。假设一个RowMatrix的列数不是特别巨大,那么一个简单的本地向量能够与driver进行联系,并且数据可以在单个节点上保存或使用。IndexedRowMatrix与RowMatrix类似但是有行索引,行索引可以用来区分行并且进行连接等操作。CoordinateMatrix是一个以协同列表(coordinate list)格式存储数据的分布式矩阵,数据以RDD形式存储。
     注意:因为我们需要缓存矩阵的大小,所以分布式矩阵的RDDs格式是需要确定的,使用非确定RDDs的话会报错。
     (1)RowMatrix
     RowMatrix,它是一个行式的分布式矩阵,没有行索引。比如一系列特征向量的集合。RowMatrix由一个RDD代表所有的行,每一行是一个本地向量。因为每一行代表一个本地向量,所以它的列数被限制在Integer.max的范围内,在实际应用中不会太大。
     一个RowMatrix可以由一个RDD[Vector]的实例创建。因此我们可以计算统计信息或者进行分解。QR分解(QR decomposition)是A=QR,其中Q是一个矩阵,R是一个上三角矩阵。对sigular value decomposition(SVD)和principal component analysis(PCA),可以去参考降维的部分。
     import org.apache.spark.mllib.linalg.Vector
     import org.apache.spark.mllib.linalg.distributed.RowMatrix

     val rows:RDD[Vector] = ....//一个本地向量的RDD
     //从RDD[Vector]创建一个RowMatrix
     val mat: RowMatrix = new RowMatrix(rows)
     //获取RowMatrix的维度
     val m = mat.numRows()
     val n = mat.numCols()
     //QR降维
     val qrResult = mat.takkSkinnyQR(true)

     (2)IndexedRowMatrix
     IndexedRowMatrix与RowMatrix类似,但是它有行索引。由一个行索引RDD表示,索引每一行由一个long型行索引和一个本地向量组成。
     一个IndexedRowMatrix可以由RDD[IndexedRow]的实例来生成,IndexedRow是一个(Long, Vector)的封装。去掉 行索引,IndexedRowMatrix能够转换成RowMatrix。
     import org.apache.spark.mllib.linalg.distributed.{IndexedRow, IndexedRowMatrix,RowMatrix}
     
     val rows: RDD[IndexedRow] = ...//一个indexed rows的RDD
     //从RDD[IndexedRow]创建一个IndexedRowMatrix
     val mat:IndexedMatrix = new IndexedRowMatrix(rows)
     //获取维度
     val m = mat.numRows()
     val n = mat.numCols()
     //去掉行索引,转换成RowMatrix
     val rowMat:RowMatrix = mat.toRowMatrix()

     (3)CoordinateMatrix
     CoordinateMatrix是一个分布式矩阵,其实体集合是一个RDD,每一个是一个三元组(i:Long, j:Long, value:Double)。其中i是行索引,j是列索引,value是实体的值。当矩阵的维度很大并且是稀疏矩阵时,才使用CoordinateMatrix。
     一个CoordinateMatrix可以通过一个RDD[MatrixEntry]的实例来创建,MatrixEntry是一个(Long, Long, Double)的封装。CoordinateMatrix可以通过调用toIndexedRowMatrix转换成一个IndexedRowMatrix。CoordinateMatrix的其他降维方法暂时还不支持(Spark-1.5)。
     import org.apache.spark.mllib.linalg.distributed.{CoordinateMatrix,MatrixEntry}
     
     val entries:RDD[MatrixEntry] = ...//一个matrix entries的RDD
     //由RDD[MatrixEntry]创建一个CoordinateMatrix
     val mat:CoordinateMatrix = new CoordinateMatrix(entries)
     //获取矩阵的维度
     val m = mat.numRows()
     val n = mat.numCols()
     //调用toIndexedRowMatrix转换成IndexedRowMatrix,它的行都是稀疏向量
     vavl indexedRowMatrix = mat.toIndexedRowMatrix()

     (4)BlockMatrix
     一个BlockMatrix是一个分布式的矩阵,由一个MatrixBlocks的RDD组成。MatrixBlock是一个三元组((Int, Int), Matrix),其中(Int, Int)是block的索引,Matrix是一个维度为rowsPerBlock * colsPerBlock的矩阵子矩阵

Spark MLlib数据类型的更多相关文章

  1. Spark Mllib里的Mllib基本数据类型(图文详解)

    不多说,直接上干货! Spark Mllib基本数据类型,根据不同的作用和应用场景,分为四种不同的类型 1.Local  vector : 本地向量集,主要向spark提供一组可进行操作的数据集合 2 ...

  2. spark MLlib DataType ML中的数据类型

    package ML.DataType; import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaRDD; im ...

  3. 《Spark MLlib机器学习实践》内容简介、目录

      http://product.dangdang.com/23829918.html Spark作为新兴的.应用范围最为广泛的大数据处理开源框架引起了广泛的关注,它吸引了大量程序设计和开发人员进行相 ...

  4. Spark MLlib Data Type

    MLlib 支持存放在单机上的本地向量和矩阵,也支持通过多个RDD实现的分布式矩阵.因此MLlib的数据类型主要分为两大类:一个是本地单机向量:另一个是分布式矩阵.下面分别介绍一下这两大类都有哪些类型 ...

  5. Spark入门实战系列--8.Spark MLlib(下)--机器学习库SparkMLlib实战

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .MLlib实例 1.1 聚类实例 1.1.1 算法说明 聚类(Cluster analys ...

  6. Spark MLib 数据类型

    1.  MLlib Apache Spark's scalable machine learning library, with APIs in Java, Scala and Python. 2. ...

  7. Spark MLlib知识点学习整理

    MLlib的设计原理:把数据以RDD的形式表示,然后在分布式数据集上调用各种算法.MLlib就是RDD上一系列可供调用的函数的集合. 操作步骤: 1.用字符串RDD来表示信息. 2.运行MLlib中的 ...

  8. spark MLLib的基础统计部分学习

    参考学习链接:http://www.itnose.net/detail/6269425.html 机器学习相关算法,建议初学者去看看斯坦福的机器学习课程视频:http://open.163.com/s ...

  9. 使用Spark MLlib进行情感分析

    使用Spark MLlib进行情感分析             使用Spark MLlib进行情感分析 一.实验说明 在当今这个互联网时代,人们对于各种事情的舆论观点都散布在各种社交网络平台或新闻提要 ...

随机推荐

  1. iOS核心面试题

    1,请简述你对协议的理解?    protocol无论是在那个领域都是一种约束,规范.在OC中的协议主要用于在各个类之间进行回调传值. 协议有 委托方,代理方, 委托方是协议的制定者,需要声明协议的方 ...

  2. Tomcat和JDK的内存配置

    1.jvm内存管理机制: 1)堆(Heap)和非堆(Non-heap)内存 按照官方的说法:"Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在 Ja ...

  3. Python中enumerate用法详解

    enumerate()是python的内置函数.适用于python2.x和python3.xenumerate在字典上是枚举.列举的意思enumerate参数为可遍历/可迭代的对象(如列表.字符串)e ...

  4. python的模块与包的导入

    类似于C语言的包含头文件去引用其他文件的函数,python也有类似的机制,常用的引入方法有以下 import 模块名 #模块名就是py文件名 #使用这种方法以后调用函数的时候要使用模块名.函数名()这 ...

  5. Objective-C中的消息发送总结

    关于OC中的消息发送的实现,在去年也看过一次,当时有点不太理解,但是今年再看却很容易理解. 我想这跟知识体系的构建有关,如果你不认识有砖.水泥等这些建筑的基本组成部分,那么我们应该很难理解建筑是怎么建 ...

  6. 排查Full GC

    我们的Java应用因频繁FULL GC导致性能降低很多,经过多人的定位也没有结论,于是我自主请命,经过一天的研究终于搞定了,现把经验与大家共享,相关的gc日志如下: 4.758: [Full GC [ ...

  7. markdown绘图插件----mermaid简介

    作者:黄永刚 mermaid简介 当撰写文档的时候,对于流程图的生成大多使用Visio等繁重的工具,没有一种轻便的工具能够画图从而简化文档的编写,就像markdown那样. mermaid解决这个痛点 ...

  8. 【Android应用开发】 Universal Image Loader ( 使用简介 | 示例代码解析 )

    作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50824912 相关地址介绍 : -- Universal I ...

  9. [Vim]vim学习笔记--多个文件打开,切换,关闭

    一种情况是在shell中用vim打开多个文件,另一种是在vim编辑器中打开多个文件 同时打开多个文件 vim file1 file2  打开文件并水平窗口显示 vim -o file1 file2 打 ...

  10. ORACLE数据库学习之数据库的优化

     数据库的优化 概述 影响数据库性能的因素包括:系统.数据库.网络. 数据库的优化包括:优化数据库磁盘I/O.优化回滚段.优化Rrdo日志.优化系统全局区.优化数据库对象. 监控数据库的性能: 在 ...