Machine Learning On Spark——基础数据结构(一)
本节主要内容
- 本地向量和矩阵
- 带类标签的特征向量(Labeled point)
- 分布式矩阵
1. 本地向量和矩阵
本地向量(Local Vector)存储在单台机器上,索引采用0开始的整型表示,值采用Double类型的值表示。Spark MLlib中支持两种类型的矩阵,分别是密度向量(Dense Vector)和稀疏向量(Spasre Vector),密度向量会存储所有的值包括零值,而稀疏向量存储的是索引位置及值,不存储零值,在数据量比较大时,稀疏向量才能体现它的优势和价值。下面给出其应用示例:
import org.apache.spark.mllib.linalg.{Vector, Vectors}//密度矩阵,零值也存储
scala> val dv: Vector = Vectors.dense(1.0, 0.0, 3.0)
dv: org.apache.spark.mllib.linalg.Vector = [1.0,0.0,3.0]// 创建稀疏矩阵,指定元素的个数、索引及非零值,数组方式
scala> val sv1: Vector = Vectors.sparse(3, Array(0, 2), Array(1.0, 3.0))
sv1: org.apache.spark.mllib.linalg.Vector = (3,[0,2],[1.0,3.0])// 创建稀疏矩阵,指定元素的个数、索引及非零值,采用序列方式
scala> val sv2: Vector = Vectors.sparse(3, Seq((0, 1.0), (2, 3.0)))
sv2: org.apache.spark.mllib.linalg.Vector = (3,[0,2],[1.0,3.0])
本地矩阵(Local Matrix)指的也是存储于单台机器上的数据结构,本地矩阵采用整体的行列序号存取元素,本地矩阵也有密度矩阵(Dense Matrix)、稀疏矩阵(Sparse Matrix)两种存储方法,其使用代码如下:
//密度矩阵的存储
scala> import org.apache.spark.mllib.linalg.{Matrix, Matrices}
import org.apache.spark.mllib.linalg.{Matrix, Matrices}
//创建一个密度矩阵
scala> val dm: Matrix = Matrices.dense(3, 2, Array(1.0, 3.0, 5.0, 2.0, 4.0, 6.0))
dm: org.apache.spark.mllib.linalg.Matrix =
1.0 2.0
3.0 4.0
5.0 6.0
在Spark MLLib中,稀疏矩阵采用的是Compressed Sparse Column (CSC) 格式进行矩阵的存储,具体参见(http://www.tuicool.com/articles/A3emmqi)对稀疏矩阵存储的介绍,例如
//下列矩阵1.0 0.0 4.00.0 3.0 5.02.0 0.0 6.0
如果采用稀疏矩阵存储的话,其存储信息包括:
实际存储值: [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]`,
矩阵元素对应的行索引:rowIndices=[0, 2, 1, 0, 1, 2]`
列起始位置索引: `colPointers=[0, 2, 3, 6]`.scala> val sparseMatrix= 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))
sparseMatrix: org.apache.spark.mllib.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
- 1
2. 带类标签的特征向量(Labeled point)
Labeled point是Spark MLlib中最重要的数据结构之一,它在无监督学习算法中使用十分广泛,它也是一种本地向量,只不过它提供了类的标签,对于二元分类,它的标签数据为0和1,而对于多类分类,它的标签数据为0,1,2,…。它同本地向量一样,同时具有Sparse和Dense两种实现方式,例如:
scala> import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.regression.LabeledPoint// LabeledPoint第一个参数是类标签数据,第二参数是对应的特征数据
//下面给出的是其密度向量实现方式
scala> val pos = LabeledPoint(1.0, Vectors.dense(1.0, 0.0, 3.0))
pos: org.apache.spark.mllib.regression.LabeledPoint = (1.0,[1.0,0.0,3.0])// LabeledPoint的稀疏向量实现方式
scala> val neg = LabeledPoint(0.0, Vectors.sparse(3, Array(0, 2), Array(1.0, 3.0)))
neg: org.apache.spark.mllib.regression.LabeledPoint = (0.0,(3,[0,2],[1.0,3.0]))
LabeledPoint的稀疏向量实现方式在实际中应用最为广泛,这是因为某一特征的维度可能达到上千,而这其中又存在大量对后期训练无益的零值特征信息,如果对所有的零值特征都进行存储的话,会浪费大量的存储空间,因此实际中常常使用稀疏的实现方式,使用的是LIBSVM格式:label index1:value1 index2:value2 …进行特征标签及特征的存储与读取。
scala> val examples: RDD[LabeledPoint] = MLUtils.loadLibSVMFile(sc, "/data/sample_data.txt")examples: org.apache.spark.rdd.RDD[org.apache.spark.mllib.regression.LabeledPoint] = MapPartitionsRDD[6] at map at MLUtils.scala:98
- 1
3. 分布式矩阵RowMatrix与CoordinateMatrix
下列代码演示了RowMatrix与CoordinateMatrix及其相关核心类的使用方法
package cn.ml.datastructimport 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.CoordinateMatrixobject RowMatrixDedmo extends App {val sparkConf = new SparkConf().setAppName("RowMatrixDemo").setMaster("spark://sparkmaster:7077")val sc = new SparkContext(sparkConf)// 创建RDD[Vector]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 => Vectors.dense(f))//创建RowMatrixval rowMatirx = new RowMatrix(rdd1)//计算列之间的相似度,返回的是CoordinateMatrix,采用//case class MatrixEntry(i: Long, j: Long, value: Double)存储值var coordinateMatrix:CoordinateMatrix= rowMatirx.columnSimilarities()//返回矩阵行数、列数println(coordinateMatrix.numCols())println(coordinateMatrix.numRows())//查看返回值,查看列与列之间的相似度//Array[org.apache.spark.mllib.linalg.distributed.MatrixEntry] //= Array(MatrixEntry(2,3,0.9992204753914715), //MatrixEntry(0,1,0.9925833339709303), //MatrixEntry(1,2,0.9979288897338914), //MatrixEntry(0,3,0.9746318461970762), //MatrixEntry(1,3,0.9946115458726394), //MatrixEntry(0,2,0.9827076298239907))println(coordinateMatrix.entries.collect())//转成后块矩阵,下一节中详细讲解coordinateMatrix.toBlockMatrix()//转换成索引行矩阵,下一节中详细讲解coordinateMatrix.toIndexedRowMatrix()//转换成RowMatrixcoordinateMatrix.toRowMatrix()//计算列统计信息var mss:MultivariateStatisticalSummary=rowMatirx.computeColumnSummaryStatistics()//每列的均值, org.apache.spark.mllib.linalg.Vector = [2.0,3.0,4.0,5.0]mss.mean// 每列的最大值org.apache.spark.mllib.linalg.Vector = [3.0,4.0,5.0,6.0]mss.max// 每列的最小值 org.apache.spark.mllib.linalg.Vector = [1.0,2.0,3.0,4.0]mss.min//每列非零元素的个数org.apache.spark.mllib.linalg.Vector = [3.0,3.0,3.0,3.0]mss.numNonzeros//矩阵列的1-范数,||x||1 = sum(abs(xi));//org.apache.spark.mllib.linalg.Vector = [6.0,9.0,12.0,15.0]mss.normL1//矩阵列的2-范数,||x||2 = sqrt(sum(xi.^2));// org.apache.spark.mllib.linalg.Vector = [3.7416573867739413,5.385164807134504,7.0710678118654755,8.774964387392123]mss.normL2//矩阵列的方差//org.apache.spark.mllib.linalg.Vector = [1.0,1.0,1.0,1.0]mss.variance//计算协方差//covariance: org.apache.spark.mllib.linalg.Matrix = //1.0 1.0 1.0 1.0 //1.0 1.0 1.0 1.0 //1.0 1.0 1.0 1.0 //1.0 1.0 1.0 1.0 var covariance:Matrix=rowMatirx.computeCovariance()//计算拉姆矩阵rowMatirx^T*rowMatirx,T表示转置操作//gramianMatrix: org.apache.spark.mllib.linalg.Matrix = //14.0 20.0 26.0 32.0 //20.0 29.0 38.0 47.0 //26.0 38.0 50.0 62.0 //32.0 47.0 62.0 77.0 var gramianMatrix:Matrix=rowMatirx.computeGramianMatrix()//对矩阵进行主成分分析,参数指定返回的列数,即主分成个数//PCA算法是一种经典的降维算法//principalComponents: org.apache.spark.mllib.linalg.Matrix = //-0.5000000000000002 0.8660254037844388 //-0.5000000000000002 -0.28867513459481275 //-0.5000000000000002 -0.28867513459481287 //-0.5000000000000002 -0.28867513459481287 var principalComponents=rowMatirx.computePrincipalComponents(2)/*** 对矩阵进行奇异值分解,设矩阵为A(m x n). 奇异值分解将计算三个矩阵,分别是U,S,V* 它们满足 A ~= U * S * V', S包含了设定的k个奇异值,U,V为相应的奇异值向量*/// svd: org.apache.spark.mllib.linalg.SingularValueDecomposition[org.apache.spark.mllib.linalg.distributed.RowMatrix,org.apache.spark.mllib.linalg.Matrix] = //SingularValueDecomposition(org.apache.spark.mllib.linalg.distributed.RowMatrix@688884e,[13.011193721236575,0.8419251442105343,7.793650306633694E-8],-0.2830233037672786 -0.7873358937103356 -0.5230588083704528 //-0.4132328277901395 -0.3594977469144485 0.5762839813994667 //-0.5434423518130005 0.06834039988143598 0.4166084623124157 //-0.6736518758358616 0.4961785466773299 -0.4698336353414313 )var svd:SingularValueDecomposition[RowMatrix, Matrix]=rowMatirx.computeSVD(3,true)//矩阵相乘积操作var multiplyMatrix:RowMatrix=rowMatirx.multiply(Matrices.dense(4, 1, Array(1,2,3,4)))
}
Machine Learning On Spark——基础数据结构(一)相关推荐
- Machine Learning On Spark——基础数据结构(二)
本节主要内容 IndexedRowMatrix BlockMatrix 1. IndexedRowMatrix的使用 IndexedRowMatrix,顾名思义就是带索引的RowMatrix,它采用c ...
- Spark Machine Learning 03 Spark上数据的获取、处理与准备
Chap 03 Spark上数据的获取处理 Spark上数据的获取.处理与准备 MovieStream,数据包括网站提供的电影数据.用户的服务信息数据以及行为数据. 这些数据涉及电影和相关内容(比如标 ...
- Machine Learning on Spark——第四节 统计基础(二)
作者:周志湖 微信号:zhouzhihubeyond 本节主要内容 Correlation 相关性分析 分层采样(Stratified sampling) 随机数据生成(Random data gen ...
- Machine Learning on Spark——统计基础(二)
本节主要内容 Correlation 相关性分析 分层采样(Stratified sampling) 随机数据生成(Random data generation) 1. Correlation 相关性 ...
- Machine Learning on Spark—— 统计基础(一)
本文主要内容 本文对了org.apache.Spark.mllib.stat包及子包中的相关统计类进行介绍,stat包中包括下图中的类或对象: 本文将对其中的部分内容进行详细讲解 获取矩阵列(colu ...
- Machine—learning 所需基础数理知识 (由黄海广博士整理而成)
数学基础知识 文章目录 数学基础知识 高等数学 线性代数 行列式 矩阵 向量 线性方程组 矩阵的特征值和特征向量 二次型 概率论和数理统计 随机事件和概率 随机变量及其概率分布 多维随机变量及其分布 ...
- 【github】机器学习(Machine Learning)深度学习(Deep Learning)资料
转自:https://github.com/ty4z2008/Qix/blob/master/dl.md# <Brief History of Machine Learning> 介绍:这 ...
- 机器学习(Machine Learning)深度学习(Deep Learning)资料汇总
本文来源:https://github.com/ty4z2008/Qix/blob/master/dl.md 机器学习(Machine Learning)&深度学习(Deep Learning ...
- 机器学习----(Machine Learning)深度学习(Deep Learning)资料(Chapter 1)
文章转至:作者:yf210yf 感谢您提供的资源 资料汇总的很多,转载一下也方便自己以后慢慢学习 注:机器学习资料篇目一共500条,篇目二开始更新 希望转载的朋友,你可以不用联系我.但是一定要保留原 ...
最新文章
- 上struts2的xml在lt;result type=quot;redirectquot;gt;参数问题
- XSS中JavaScript加密以及Filter bypass
- 【是泰波那契,不是斐波那契】1137. 第 N 个泰波那契数
- SAP面向iOS设备推Cloud Platform SDK工具
- IntelliJ IDEA 使用随笔
- 面试题-- 什么是偏向锁
- fanuc机器人编程手册_是谁需要G代码编程机器人?
- 贝叶斯学派,先验概率,后验概率,贝叶斯估计
- Android 软键盘弹出,界面整体上移的问题
- 淘淘商城系列——Redis的安装
- 动态lacp和静态lacp区别_LACP学习笔记
- tdscdma手机linux,全方位介绍——TD-SCDMA无线技术(1)
- 精美教师说课试讲教学通用PPT模板
- 多通道振弦传感器VTN416采集仪应用工程项目安全监测实用性强
- C++搜索算法和曼哈顿距离之最少连通代价
- JAVA爬需要账号登录的网_如何用 Python 爬取需要登录的网站?
- linux设备驱动(3)--LED字符驱动
- 【PyTorch】高级神经网络结构
- 10 模拟SPI驱动PS2无线手柄
- 京东能成为快手的老铁吗?
热门文章
- [leetcode] 5.最长回文子串
- Mysql和Oracle获取自增主键
- 数据库原理与应用(SQL Server)笔记 第七章 流程控制语句、系统内置函数
- java队列课程_Java 实例 – 队列(Queue)用法
- linux定时任务实例,linux定时任务访问url实例
- anaconda 更改路径_Anaconda更改Jupyter 默认启动路径
- Android 服务器推送技术
- miniui页面移动的时候透明_【H5】316 移动端H5跳坑指南
- oracle快速了解法,【oracle】rownum的快速了解
- axure 调整中继器列宽_在Axure中用“中继器”实现对表格的增、删、改