Spark机器学习库之数据类型——scala版本

hello577 2015-03-23 10:36:42
1.本地向量
本地向量的基类是 Vector,我们提供了两个实现 DenseVector 和 SparseVector。我们建议通过 Vectors中实现的工厂方法来创建本地向量:(注意:Scala语言默认引入的是 scala.collection.immutable.Vector,为了使用MLlib的Vector,你必须显示引入org.apache.spark.mllib.linalg.Vector。)
import org.apache.spark.mllib.linalg.{Vector, Vectors}

// Create a dense vector (1.0, 0.0, 3.0).
val dv: Vector = Vectors.dense(1.0, 0.0, 3.0)

// Create a sparse vector (1.0, 0.0, 3.0) by specifying its indices and values
corresponding to nonzero entries.

val sv1: Vector = Vectors.sparse(3, Array(0, 2), Array(1.0, 3.0))

// Create a sparse vector (1.0, 0.0, 3.0) by specifying its nonzero entries.
val sv2: Vector = Vectors.sparse(3, Seq((0, 1.0), (2, 3.0)))


2.含类标签的点
含有类标签的点通过case class LabeledPoint来表示。
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint

// Create a labeled point with a positive label and a dense feature vector.
val pos = LabeledPoint(1.0, Vectors.dense(1.0, 0.0, 3.0))

// Create a labeled point with a negative label and a sparse feature vector.
val neg = LabeledPoint(0.0, Vectors.sparse(3, Array(0, 2), Array(1.0, 3.0)))


3.稀疏数据Sparse data
实际运用中,稀疏数据是很常见的。MLlib可以读取以LIBSVM格式存储的训练实例,LIBSVM格式是 LIBSVM 和 LIBLINEAR的默认格式,这是一种文本格式,每行代表一个含类标签的稀疏特征向量。格式如下:
label index1:value1 index2:value2 ...
索引是从 1 开始并且递增。加载完成后,索引被转换为从 0 开始。
通过 MLUtils.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")


4.本地矩阵
一个本地矩阵由整型的行列索引数据和对应的 double 型值数据组成,存储在某一个机器中。MLlib 支持密集矩阵(暂无稀疏矩阵!),实体值以列优先的方式存储在一个 double数组中。
本 地 矩 阵 的 基 类 是 Matrix , 我 们 提 供 了 一 个 实 现 DenseMatrix 。 我 们 建 议 通过 Matrices 中实现的工厂方法来创建本地矩阵:
import org.apache.spark.mllib.linalg.{Matrix, Matrices}
// Create a dense matrix ((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))


5.分布式矩阵

一个分布式矩阵由 long 型行列索引数据和对应的 double 型值数据组成,分布式存储在一个或多个 RDD 中。对于巨大的分布式的矩阵来说,选择正确的存储格式非常重要。将一个分布式矩阵转换为另一个不同格式需要全局洗牌(shuffle),所以代价很高。目前,实现了三类分布式矩阵存储格式。最基本的类型是 RowMatrix。一个 RowMatrix 是一个面向行的分布式矩阵,其行索引是没有具体含义的。比如一系列特征向量的一个集合。通过一个 RDD 来代表所有的行,每一行就是一个本地向量。对于 RowMatrix,我们假定其列数量并不巨大,所以一个本地向量可以恰当的与驱动节点(driver)交换信息,并且能够在某一节点中存储和操作。
IndexedRowMatrix 与 RowMatrix 相似,但有行索引,可以用来识别行和进行 join 操作。而 CoordinateMatrix 是一个以三元组列表格式(coordinate list ,COO)存储的分布式矩阵,其实体集合是一个 RDD。注 意 : 因 为 我 们 需 要 缓 存 矩 阵 大 小 , 分 布 式 矩 阵 的 底 层 RDD 必 须 是 确 定 的(deterministic)。通常来说,使用非确定的 RDD(non-deterministic RDDs)会导致错误。

5.1 面向行的分布式矩阵(RowMatrix)

一个 RowMatrix 是一个面向行的分布式矩阵,其行索引是没有具体含义的。比如一系列特征向量的一个集合。通过一个 RDD 来代表所有的行,每一行就是一个本地向量。既然每一行由一个本地向量表示,所以其列数就被整型数据大小所限制,其实实践中列数是一个很小的数值。
一个 RowMatrix可从一个RDD[Vector]实例创建。然后我们可以计算出其概要统计信息。
import org.apache.spark.mllib.linalg.Vector
import org.apache.spark.mllib.linalg.distributed.RowMatrix

val rows: RDD[Vector] = ... // an RDD of local vectors

// Create a RowMatrix from an RDD[Vector].
val mat: RowMatrix = new RowMatrix(rows)

// Get its size.
val m = mat.numRows()
val n = mat.numCols()


5.2行索引矩阵(IndexedRowMatrix)
IndexedRowMatrix 与 RowMatrix 相似,但其行索引具有特定含义,本质上是一个含有索引信息的行数据集合(an RDD of indexed rows)。每一行由 long 型索引和一个本地向量组成。一个 IndexedRowMatrix可从一个RDD[IndexedRow]实例创建,这里的 IndexedRow是 (Long, Vector) 的 封 装 类 。 剔 除 IndexedRowMatrix 中 的 行 索 引 信 息 就 变 成 一 个RowMatrix。

import org.apache.spark.mllib.linalg.distributed.{IndexedRow, IndexedRowMatrix, RowMatrix}
val rows: RDD[IndexedRow] = ... // an RDD of indexed rows

// Create an IndexedRowMatrix from an RDD[IndexedRow].
val mat: IndexedRowMatrix = new IndexedRowMatrix(rows)

// Get its size.
val m = mat.numRows()
val n = mat.numCols()

// Drop its row indices.
val rowMat: RowMatrix = mat.toRowMatrix()


5.3三元组矩阵(CoordinateMatrix)
一个 CoordinateMatrix 是一个分布式矩阵,其实体集合是一个 RDD。每一个实体是一个(i: Long, j: Long, value: Double)三元组,其中 i 代表行索引,j 代表列索引,value 代表实体的值。只有当矩阵的行和列都很巨大,并且矩阵很稀疏时才使用 CoordinateMatrix。
一个 CoordinateMatrix可从一个RDD[MatrixEntry]实例创建,这里的 MatrixEntry是 (Long, Long, Double) 的 封 装 类 。 通 过 调 用 toIndexedRowMatrix 可 以 将 一 个CoordinateMatrix转变为一个IndexedRowMatrix(但其行是稀疏的)。目前暂不支持其他计算操作。
import org.apache.spark.mllib.linalg.distributed.{CoordinateMatrix, MatrixEntry}
val entries: RDD[MatrixEntry] = ... // an RDD of matrix entries

// Create a CoordinateMatrix from an RDD[MatrixEntry].
val mat: CoordinateMatrix = new CoordinateMatrix(entries)

// Get its size.
val m = mat.numRows()
val n = mat.numCols()

// Convert it to an IndexRowMatrix whose rows are sparse vectors.
val indexedRowMatrix = mat.toIndexedRowMatrix()
...全文
12413 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
XingHaiSea 2017-12-06
  • 打赏
  • 举报
回复
/** * RowMatrix 行矩阵 */ 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)) val rows: RDD[Vector] = rdd1 // an RDD of local vectors println("本地向量RDD: "+rows) // 从一个向量RDD创建一个行矩阵 val mat = new RowMatrix(rows) // 获得它的size val m = mat.numRows() val n = mat.numCols() println("numRows: "+m+"\n"+"numCols: "+n)
jackyjiang2012 2016-12-22
  • 打赏
  • 举报
回复
深入浅出Spark机器学习实战(用户行为分析) 课程观看地址:http://www.xuetuwuyou.com/course/144 课程出自学途无忧网:http://www.xuetuwuyou.com 一、课程目标 熟练掌握SparkSQL的各种操作,深入了解Spark内部实现原理 深入了解SparkML机器学习各种算法模型的构建和运行 熟练Spark的API并能灵活运用 能掌握Spark在工作当中的运用 二、适合人群 适合给,有java,scala基础,想往大数据spark机器学习这块发展 适合给想学习spark,往数据仓库,大数据挖掘机器学习,方向发展的学员 三、课程用到的软件及版本: Spark2.0,Spark1.6.2,STS,maven,Linux Centos6.5,mysql,mongodb3.2 四、课程目录: 课时1:Spark介绍 课时2:Spark2集群安装 课时3:Spark RDD操作 课时4:SparkRDD原理剖析 课时5:Spark2sql从mysql中导入 课时6:Spark1.6.2sql与mysql数据交互 课时7:SparkSQL java操作mysql数据 课时8:Spark统计用户的收藏转换率 课时9:Spark梳理用户的收藏以及订单转换率 课时10:最终获取用户的收藏以及订单转换率 课时11:Spark Pipeline构建随机森林回归预测模型 课时12:Spark 随机森林回归预测结果并存储进mysql 课时13:Spark对收藏转预测换率与真正的转换率对比,以及决策树模型构建 课时14:Spark机器学习对各种监督与非监督分类学习详细介绍 课时15:Spark协同过滤算法,构建用户与产品模型 课时16:Spark协同算法完成给用户推荐产品 课时17:mongodb的安装以及其基本操作 课时18:Spark与mongodb整合 课时19:Spark预测收藏以及给用户推荐的产品存储进mongodb 课时20:操作RDD需要注意点,以及Spark内存分配资源调优 课时21:Spark整个学习过程及其总结 推荐组合学习:《国内首部系统性介绍Scala语言培训课程》 课程观看地址:http://www.xuetuwuyou.com/course/12 Spark+Kafka 实时流机器学习实战 课程观看地址:http://www.xuetuwuyou.com/course/147
atipa 2016-10-09
  • 打赏
  • 举报
回复
ccdbeyond 2016-01-22
  • 打赏
  • 举报
回复
...是参数,你得自己输文件地址
wxn521 2015-05-14
  • 打赏
  • 举报
回复
您好,我能跟您约一些spark方面的稿件吗
luckypay 2015-05-13
  • 打赏
  • 举报
回复
你好 请问 scala> val rows: RDD[Vector] = ... // an RDD of local vectors <console>:1: error: illegal start of simple expression val rows: RDD[Vector] = ... // an RDD of local vectors 这段代码为什么会报错啊?? 我是复制你的代码 但是 “...” 这个符号感觉有点不对 谢谢

1,258

社区成员

发帖
与我相关
我的任务
社区描述
Spark由Scala写成,是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于MapReduce算法实现的分布式计算。
社区管理员
  • Spark
  • shiter
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧