scala-MLlib官方文档---spark.mllib package--Data types(数据类型)

一、数据类型

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,我们提供两种实现:DenseVector和SparseVector。我们建议使用Vector中实现的工厂(factory,翻译方式不定,错误接受指出)方法来创建局部矢量。
有关API的详细信息,请参考Vector Scala文档和Vectors Scala文档。

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)))

注意:默认情况下,Scala导入scala.collection.immutable.Vector,因此您必须导入org.apache.spark.mllib.linalg。明确使用Vector来使用MLlib的Vector。

标记点

标记点是与标记/响应相关联的局部矢量(密集或稀疏)。在MLlib中,标记的点用于监督学习算法中。我们使用双精度来存储标签,因此我们可以在回归和分类中使用带标签的点。
对于二进制分类,标签应为0(负数)或1(正数)。对于多类分类,标签应为从零开始的类索引:0、1、2,…。
示例代码
带标签的点由案例类LabeledPoint表示。
有关API的详细信息,请参阅LabeledPoint Scala文档。

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)))

1)稀疏数据
在实践中,稀疏数据很常见。 MLlib支持读取以LIBSVM格式存储的训练数据,这是LIBSVM和LIBLINEAR使用的默认格式。它是一种文本格式,其中每行使用以下格式表示带标签的稀疏特征向量:

abel index1:value1 index2:value2 ...

索引是从一开始并按升序排列的。加载后,要素索引将转换为基于零的索引。
示例代码
MLUtils.loadLibSVMFile读取以LIBSVM格式存储的培训示例。
有关API的详细信息,请参阅MLUtils Scala文档。

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")

局部矩阵

局部矩阵具有整数类型的行和列索引以及双重类型的值,它们存储在单个计算机上。MLlib支持密集矩阵(其条目值以列优先顺序存储在单个双精度数组中)和稀疏矩阵(其非零条目值)以列优先顺序以压缩稀疏列(CSC)格式存储。例如,以下稠密矩阵以矩阵大小(3,2)存储在一维数组[1.0,3.0,5.0,2.0,4.0,6.0]中。
在这里插入图片描述
示例代码
局部矩阵的基类是Matrix,我们提供两种实现:DenseMatrix和SparseMatrix。我们建议使用在矩阵中实现的工厂方法来创建本地矩阵。请记住,MLlib中的本地矩阵以列优先顺序存储。
有关API的详细信息,请参考Matrix Scala文档和Matrices Scala文档。

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))

// Create a sparse matrix ((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))

分布式矩阵

分布式矩阵具有长型行和列索引以及双型值,这些值分布式存储在一个或多个RDD中。选择正确的格式来存储大型和分布式矩阵非常重要。将分布式矩阵转换为其他格式可能需要全局改组,这非常昂贵。到目前为止,已经实现了四种类型的分布式矩阵。
基本类型称为RowMatrix。 RowMatrix是面向行的分布式矩阵,没有有意义的行索引,例如特征向量的集合。它由其行的RDD支持,其中每一行都是本地向量。我们假设RowMatrix的列数不是很大,因此可以将单个局部向量合理地传递给驱动程序,也可以使用单个节点对其进行存储/操作。IndexedRowMatrix与RowMatrix相似,但具有行索引,该行索引可用于标识行和执行联接。CoordinateMatrix是以坐标列表(COO)格式存储的分布式矩阵,由其条目的RDD支持。BlockMatrix是由MatrixBlock的RDD支持的分布式矩阵,该矩阵是(Int,Int,Matrix)的元组。
注意
分布式矩阵的基础RDD必须是确定性的,因为我们缓存了矩阵的大小。通常,使用不确定的RDD可能会导致错误。
1)RowMatrix(行矩阵)
RowMatrix是面向行的分布式矩阵,不包含有意义的行索引,并由其行的RDD支持,其中每行都是局部向量。 由于每一行都由局部矢量表示,因此列数受整数范围的限制,但实际上应该小得多。
示例代码
可以从RDD [Vector]实例创建RowMatrix。然后,我们可以计算其列摘要统计信息和分解。 QR分解的形式为A = QR,其中Q为正交矩阵,R为上三角矩阵。有关奇异值分解(SVD)和主成分分析(PCA),请参阅降维。
有关API的详细信息,请参考RowMatrix Scala文档。

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()

// QR decomposition 
val qrResult = mat.tallSkinnyQR(true)

2)IndexedRowMatrix,(含索引的行矩阵)
IndexedRowMatrix与RowMatrix相似,但具有有意义的行索引。它由索引行的RDD支持,因此每一行都由其索引(长型)和局部向量表示。
示例代码
可以从RDD [IndexedRow]实例创建IndexedRowMatrix,其中IndexedRow是(Long,Vector)的包装。可以通过删除IndexedRowMatrix的行索引将其转换为RowMatrix。
有关API的详细信息,请参考IndexedRowMatrix Scala文档。

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()

3)CoordinateMatrix(坐标矩阵)
CoordinateMatrix是由其条目的RDD支持的分布式矩阵。 E每个条目都是(i:Long,j:Long,value:Double)的元组,其中i是行索引,j是列索引,value是条目值。仅当矩阵的两个维度都很大且矩阵非常稀疏时,才应使用CoordinateMatrix。
示例代码
可以从RDD [MatrixEntry]实例创建CoordinateMatrix,其中MatrixEntry是(长,长,双)包装。通过调用toIndexedRowMatrix,可以将CoordinateMatrix转换为具有稀疏行的IndexedRowMatrix。目前不支持CoordinateMatrix的其他计算。
有关API的详细信息,请参阅CoordinateMatrix Scala文档。

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()

4)BlockMatrix(块矩阵)
BlockMatrix是由MatrixBlocks的RDD支持的分布式矩阵,其中MatrixBlock是((Int,Int),Matrix)的元组,其中(Int,Int)是块的索引,而Matrix是子给定索引处的矩阵,其大小为rowsPerBlock * colsPerBlock。BlockMatrix支持诸如与另一个BlockMatrix相加和相乘的方法。BlockMatrix还具有一个验证器帮助功能,该功能可用于检查BlockMatrix是否正确设置。
示例代码
通过调用toBlockMatrix,可以最容易地从IndexedRowMatrix或CoordinateMatrix创建BlockMatrix。toBlockMatrix默认创建大小为1024 x 1024的块。用户可以通过toBlockMatrix(rowsPerBlock,colsPerBlock)提供值来更改块大小。
有关API的详细信息,请参考BlockMatrix Scala文档。

import org.apache.spark.mllib.linalg.distributed.{BlockMatrix, CoordinateMatrix, MatrixEntry}

val entries: RDD[MatrixEntry] = ... // an RDD of (i, j, v) matrix entries
// Create a CoordinateMatrix from an RDD[MatrixEntry].
val coordMat: CoordinateMatrix = new CoordinateMatrix(entries)
// Transform the CoordinateMatrix to a BlockMatrix
val matA: BlockMatrix = coordMat.toBlockMatrix().cache()

// Validate whether the BlockMatrix is set up properly. Throws an Exception when it is not valid.
// Nothing happens if it is valid.
matA.validate()

// Calculate A^T A.
val ata = matA.transpose.multiply(matA)
发布了2 篇原创文章 · 获赞 0 · 访问量 631

猜你喜欢

转载自blog.csdn.net/pt798633929/article/details/103846258
今日推荐