MLlib支持存储在单个机器上的局部向量和矩阵,以及由一个或多个RDD支持的分布式矩阵。 局部向量和局部矩阵是用作公共接口的简单数据模型。 底层线性代数操作由Breeze提供。 在监督学习中使用的训练示例在MLlib中称为“标记点”。


一、本地向量

局部向量具有整数类型和基于0的索引和双类型值,存储在单个机器上。 MLlib支持两种类型的局部向量:密集和稀疏。 密集向量由表示其条目值的双数组支持,而稀疏向量由两个并行数组支持:索引和值。 例如,矢量(1.0,0.0,3.0)可以以密集格式表示为[1.0,0.0,3.0],或者以稀疏格式表示为(3,[0,2],[1.0,3.0]),其中3是 矢量的大小。

//创建一个稠密本地向量

Vector v1 = Vectors.dense(0.0, 10.0, 0.5);

//创建一个稀疏向量

Vector v2 = Vectors.sparse(3, new int[]{0, 1}, new  double[]{-2.0, 2.3});

二、向量标签(标记点)(LabeledPoint)

向量标签LabeledPoint是一种带有标签(Label/Response)的本地向量,它可以是稠密或者是稀疏的。 在MLlib中,标记点用于监督学习算法。由于标签是用双精度浮点型来存储的,故标注点类型在回归(Regression)和分类(Classification)问题上均可使用。例如,对于二分类问题,则正样本的标签为1,负样本的标签为0,而对于多类别的分类问题来说,标签则应是一个以0开始的索引序列:0, 1, 2 ...

//创建一个标签为1.0(分类中可视为正样本)的稠密向量标注点

LabeledPoint L1 = new LabeledPoint(1.0,Vectors.dense(2.0, 3.0, 3.0));

//创建一个标签为0.0(分类中可视为负样本)的稀疏向量标注点

LabeledPoint L2 = new LabeledPoint(0.0,Vectors.sparse(3, new int[]{0, 1}, new  double[]{-2.0, 2.3}));

在实际的机器学习问题中,稀疏向量数据是非常常见的,MLlib提供了读取LIBSVM格式数据的支持,该格式被广泛用于LIBSVM、LIBLINEAR等机器学习库。在该格式下,每一个带标注的样本点由以下格式表示:

label    index1:value1   index2:value2   index3:value3  ...

其中label是该样本点的标签值,一系列index:value对则代表了该样本向量中所有非零元素的索引和元素值。这里需要特别注意的是,index是以1开始并递增的。 MLlib在org.apache.spark.mllib.util.MLUtils工具类中提供了读取LIBSVM格式的方法loadLibSVMFile,其使用非常方便。

SparkSession spark = SparkSession.builder().appName("VectorsTest").master("local[2]").getOrCreate();

SparkContext sparkContext = spark.sparkContext();

JavaRDD<LabeledPoint> examples=MLUtils.loadLibSVMFile(sparkContext,"data/mllib/sample_libsvm_data.txt").toJavaRDD();

(0.0,(692,[127,128,129,130,131,154,155,156,157,158,159,181,182,183,184,185,186,187,188,189,207,208,209,210,211,212,213,214,215,216,217,235,236,237,238,239,240,241,242,243,244,245,262,263,264,265,266,267,268,269,270,271,272,273,289,290,291,292,293,294,295,296,297,300,301,302,316,317,318,319,320,321,328,329,330,343,344,345,346,347,348,349,356,357,358,371,372,373,374,384,385,386,399,400,401,412,413,414,426,427,428,429,440,441,442,454,455,456,457,466,467,468,469,470,482,483,484,493,494,495,496,497,510,511,512,520,521,522,523,538,539,540,547,548,549,550,566,567,568,569,570,571,572,573,574,575,576,577,578,594,595,596,597,598,599,600,601,602,603,604,622,623,624,625,626,627,628,629,630,651,652,653,654,655,656,657],[51.0,159.0,253.0,159.0,50...

每个标注点共有692个维,其中第127列对应的值是51.0,第128列对应的值是159.0,依此类推。

三、本地矩阵

局部矩阵具有整数类型的行和列索引以及双类型值,存储在单个机器上。 MLlib支持密集矩阵,其条目值以列主要顺序存储在单个双数组中,以及稀疏矩阵,其非零条目值以列主要顺序存储在压缩稀疏列(CSC)格式中。 例如,以下密集矩阵:

 
存储在具有矩阵大小(3,2)的一维阵列[1.0,3.0,5.0,2.0,4.0,6.0]中。

//创建稠密矩阵((1.0, 2.0), (3.0, 4.0), (5.0, 6.0))

Matrix d = Matrices.dense(3, 2, new  double[]{1.0, 3.0, 5.0, 2.0, 4.0, 6.0});

//创建稀疏矩阵((9.0, 0.0), (0.0, 8.0), (0.0, 6.0))

Matrix s = Matrices.sparse(3, 2, new  int[]{0, 1,3}, new int[]{0, 1,1}, new  double[]{9.0, 6.0,8.0});

这里,创建一个3行2列的稀疏矩阵[ [9.0,0.0], [0.0,8.0], [0.0,6.0]]。Matrices.sparse的参数中,3表示行数,2表示列数。第1个数组参数表示列指针,即每一列元素的开始索引值, 第二个数组参数表示行索引,即对应的元素是属于哪一行;第三个数组即是按列先序排列的所有非零元素,通过列指针和行索引即可判断每个元素所在的位置。比如取每个数组的第2个元素为2,1,6,表示第2列第1行的元素值是6.0。

四、分布式矩阵

分布式矩阵具有长类型的行和列索引以及双类型值,分布式地存储在一个或多个RDD中。选择正确的格式来存储大型和分布式矩阵非常重要。将分布式矩阵转换为不同的格式可能需要全局混洗,这非常昂贵。到目前为止已经实现了四种类型的分布式矩阵。

基本类型称为RowMatrix。 RowMatrix是行方向的分布式矩阵,没有有意义的行索引,例如特征向量的集合。它由行的RDD支持,其中每行是本地向量。我们假设RowMatrix的列数不是很大,因此单个本地向量可以合理地传递给驱动程序,也可以使用单个节点进行存储/操作。 IndexedRowMatrix类似于RowMatrix,但具有行索引,可用于标识行和执行连接。 CoordinateMatrix是以坐标列表(COO)格式存储的分布式矩阵,由其条目的RDD支持。 BlockMatrix是由MatrixBlock的RDD支持的分布式矩阵,它是(Int,Int,Matrix)的元组。

4.1、行矩阵(RowMatrix)

RowMatrix是面向行的分布式矩阵,没有有意义的行索引,由其行的RDD支持,其中每行是本地向量。 由于每一行都由局部向量表示,因此列数受整数范围的限制,但在实践中它应该小得多。

SparkConf conf = new  SparkConf().setMaster("local").setAppName("DistributedMatrixRowMatrix");

JavaSparkContext jsc = new  JavaSparkContext(conf);

JavaRDD<Vector> rows =  jsc.parallelize(Arrays.asList(Vectors.dense(4.0,5.0,6.0),Vectors.dense(2.0,12.0,6.0)));

RowMatrix matrix = new  RowMatrix(rows.rdd());

System.out.println(matrix.numCols());

System.out.println(matrix.numRows());

System.out.println(matrix.rows().first());

System.out.println("行数:"+matrix.computeColumnSummaryStatistics().count());

System.out.println("最大向量:"+matrix.computeColumnSummaryStatistics().max());

System.out.println("方差向量:"+matrix.computeColumnSummaryStatistics().variance());

System.out.println("L1范数向量:"+matrix.computeColumnSummaryStatistics().normL1());

在获得RowMatrix的实例后,我们可以通过其自带的computeColumnSummaryStatistics()方法获取该矩阵的一些统计摘要信息,并可以对其进行QR分解,SVD分解和PCA分解,这一部分内容将在特征降维的章节详细解说,这里不再叙述。

4.2、索引行矩阵(IndexedRowMatrix)

IndexedRowMatrix类似于RowMatrix但具有有意义的行索引。 它由索引行的RDD支持,因此每行由其索引(long-typed)和本地向量表示。

JavaRDD<IndexedRow> rows2 =  jsc.parallelize(Arrays.asList(new IndexedRow(1,  Vectors.dense(1.0, 2.3, 2.6)), new IndexedRow  (2, Vectors.dense(1.0,2.3,50.6))));

IndexedRowMatrix mat2 =  new  IndexedRowMatrix(rows2.rdd());

4.3、坐标矩阵(Coordinate Matrix)

CoordinateMatrix是由其条目的RDD支持的分布式矩阵。 每个条目都是(i:Long,j:Long,value:Double)的元组,其中i是行索引,j是列索引,value是条目值。 只有当矩阵的两个维度都很大且矩阵非常稀疏时,才应使用CoordinateMatrix。

JavaRDD<MatrixEntry> rows3 =  jsc.parallelize(Arrays.asList(new  MatrixEntry(0,0,1.0), new MatrixEntry  (1,0,2.0)));

CoordinateMatrix mat3 = new  CoordinateMatrix(rows3.rdd());

4.4、分块矩阵(Block Matrix)

BlockMatrix是由MatrixBlocks的RDD支持的分布式矩阵,其中MatrixBlock是((Int,Int),Matrix)的元组,其中(Int,Int)是块的索引,而Matrix是子 - 给定索引处的矩阵,其大小为rowsPerBlock x colsPerBlock。 BlockMatrix支持添加和乘以另一个BlockMatrix等方法。 BlockMatrix还有一个辅助函数validate,可用于检查BlockMatrix是否设置正确。

 
 

JavaRDD<MatrixEntry> rows4 =  jsc.parallelize(Arrays.asList(new  MatrixEntry(0,0,1.0), new MatrixEntry  (1,0,2.0)));

CoordinateMatrix mat = new  CoordinateMatrix(rows4.rdd());

BlockMatrix matA =  mat.toBlockMatrix().cache();

spark机器学习从0到1基本数据类型之(二)的更多相关文章

  1. spark机器学习从0到1特征提取 TF-IDF(十二)

        一.概念 “词频-逆向文件频率”(TF-IDF)是一种在文本挖掘中广泛使用的特征向量化方法,它可以体现一个文档中词语在语料库中的重要程度. 词语由t表示,文档由d表示,语料库由D表示.词频TF ...

  2. spark机器学习从0到1介绍入门之(一)

      一.什么是机器学习 机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论.统计学.逼近论.凸分析.算法复杂度理论等多门学科.专门研究计算机怎样模拟或实现人类的学习行 ...

  3. spark机器学习从0到1机器学习工作流 (十一)

        一.概念 一个典型的机器学习过程从数据收集开始,要经历多个步骤,才能得到需要的输出.这非常类似于流水线式工作,即通常会包含源数据ETL(抽取.转化.加载),数据预处理,指标提取,模型训练与交叉 ...

  4. spark机器学习从0到1奇异值分解-SVD (七)

      降维(Dimensionality Reduction) 是机器学习中的一种重要的特征处理手段,它可以减少计算过程中考虑到的随机变量(即特征)的个数,其被广泛应用于各种机器学习问题中,用于消除噪声 ...

  5. spark机器学习从0到1特征变换-标签和索引的转化(十六)

      一.原理 在机器学习处理过程中,为了方便相关算法的实现,经常需要把标签数据(一般是字符串)转化成整数索引,或是在计算结束后将整数索引还原为相应的标签. Spark ML 包中提供了几个相关的转换器 ...

  6. spark机器学习从0到1特征选择-卡方选择器(十五)

      一.公式 卡方检验的基本公式,也就是χ2的计算公式,即观察值和理论值之间的偏差   卡方检验公式 其中:A 为观察值,E为理论值,k为观察值的个数,最后一个式子实际上就是具体计算的方法了 n 为总 ...

  7. spark机器学习从0到1决策树(六)

      一.概念 决策树及其集合是分类和回归的机器学习任务的流行方法. 决策树被广泛使用,因为它们易于解释,处理分类特征,扩展到多类分类设置,不需要特征缩放,并且能够捕获非线性和特征交互. 诸如随机森林和 ...

  8. spark机器学习从0到1特征抽取–Word2Vec(十四)

      一.概念 Word2vec是一个Estimator,它采用一系列代表文档的词语来训练word2vecmodel.该模型将每个词语映射到一个固定大小的向量.word2vecmodel使用文档中每个词 ...

  9. spark机器学习从0到1特征抽取–CountVectorizer(十三)

        一.概念 CountVectorizer 旨在通过计数来将一个文档转换为向量.当不存在先验字典时,Countvectorizer作为Estimator提取词汇进行训练,并生成一个CountVe ...

随机推荐

  1. 【认证与授权】Spring Security的授权流程

    上一篇我们简单的分析了一下认证流程,通过程序的启动加载了各类的配置信息.接下来我们一起来看一下授权流程,争取完成和前面简单的web基于sessin的认证方式一致.由于在授权过程中,我们预先会给用于设置 ...

  2. 《剑指Offer》- 连续子数组的最大和或最小和

    前言 本文是<剑指Offer>系列(JavaScript版)的第一篇,题目是"连续子数组的最大和或最小和". 话不多说,开始"打怪"修炼... 一. ...

  3. 数据库SQL---数据库、基本表、视图、索引的定义、修改、删除

    1.SQL(结构化查询语言)的组成:数据定义语言DDL.数据操纵语言DML.数据控制语言DCL.其他. 2.SQL语言的功能: 1)数据查询:SELECT 2)数据定义:CREATE   DROP  ...

  4. scala教程之:可见性规则

    文章目录 public Protected private scoped private 和 scoped protected 和java很类似,scala也有自己的可见性规则,不同的是scala只有 ...

  5. 徐州赛区网络预赛 D Easy Math

    比赛快结束的适合看了一下D题,发现跟前几天刚刚做过的HDU 5728 PowMod几乎一模一样,当时特兴奋,结果一直到比赛结束都一直WA.回来仔细一琢磨才发现,PowMod这道题保证了n不含平方因子, ...

  6. Mysql使用规范及建议

    MySQL数据库使用规范一.建表规约1.[强制]表达是与否概念的字段,必须使用is_xxx的方式命名,数据类型是unsigned tinyint (1表示是,0表示否) 说明:任何字段如果为非负数,必 ...

  7. 全栈必备Log日志

    Log日志,不论对开发者自身,还是对软件系统乃至产品服务都是非常重要的事情.每个开发者都接触过日志,以至于每个人对日志的了解都会有所不同. 什么是日志 日志是什么呢?老码农看来,日志是带有明确时间标记 ...

  8. 你所不知道的Python | 字符串连接的秘密

    字符串连接,就是将2个或以上的字符串合并成一个,看上去连接字符串是一个非常基础的小问题,但是在Python中,我们可以用多种方式实现字符串的连接,稍有不慎就有可能因为选择不当而给程序带来性能损失. 方 ...

  9. Blog Customization

    0 前言 从大二开始写博客,主要为了记录自己学习过程中的问题.尝试使用过CSDN.博客园等公共服务,也用Github pages搭建过自己的博客,但效果都不令人满意.CSDN广告太多,界面乌烟瘴气,而 ...

  10. 网速慢?不!可能是DNS出了问题! 公共DNS优选之 BAT 百度、腾讯、阿里、谷歌DNS哪个更快?

    如果一下还是解决不了你的问题请这边走 首先是Google的DNS: 8.8.8.8 丢包严重 PASS但是扶墙的时候是必备的,如果有扶墙的需求的话可以备用. 二.百度DNS 180.76.76.76 ...