⼀、spark数据类型(DataTypes)
Data Types - MLlib(数据类型)
MLlib⽀持存储在单机上的局部向量和局部矩阵,也可以⽀持通过⼀个或多个RDD(可伸缩数据集)表⽰的分布式矩阵。局部向量和局部矩阵是⽤作公共接⼝的简单数据模型,实际上底层的线性代数运算由 ( 和数值运算的 库)和 ( 线性代数运算库)提供。在有监督机器学习中,MLlib使⽤标记点(labeled point)来表⽰单个训练语料。
局部向量[Local vector]:
局部向量存储在单机上,使⽤整数表⽰索引,索引从0开始;使⽤双精度浮点数(double)存储数值。MLlib⽀持两种类型的局部向量:密集型和稀疏型。密集向量(den vector)使⽤double数组表⽰元素值,⽽稀疏向量(spar vector)通过两个并列的数组来表⽰:⼀个表⽰索引,⼀个表⽰数值。例如:向量(1.0, 0.0, 3.0)使⽤密集型可表⽰为:[1.0, 0.0, 3.0], ⽽使⽤稀疏型可以表⽰为:(3, [0, 2], [1.0, 3.0]],其中3是向量的长度。
import org.apache.spark.mllib.linalg.Vector;
import org.apache.spark.mllib.linalg.Vectors;
// Create a den vector (1.0, 0.0, 3.0).
Vector dv = Vectors.den(1.0, 0.0, 3.0);
// Create a spar vector (1.0, 0.0, 3.0) by specifying its indices and values corresponding to nonzero entries.
Vector sv = Vectors.spar(3, new int[] {0, 2}, new double[] {1.0, 3.0});
北海公园标记点[Labeled point]:
标记点是局部向量,向量可以是密集型或者稀疏型,每个向量会关联了⼀个标签(label)。MLlib的标记点⽤于有监督学习 。我们使⽤double来存储标签值,这样标记点既可以⽤于回归⼜可以⽤于分类。在⼆分类中,标签要么是0要么是1;在多分类中,标签是0, 1, 2, ….
import org.apache.spark.mllib.linalg.Vectors;
程开甲import org.apache.ssion.LabeledPoint;
// Create a labeled point with a positive label and a den feature vector.
LabeledPoint pos = new LabeledPoint(1.0, Vectors.den(1.0, 0.0, 3.0));
// Create a labeled point with a negative label and a spar feature vector.
LabeledPoint neg = new LabeledPoint(0.0, Vectors.spar(3, new int[] {0, 2}, new double[] {1.0, 3.0}));
稀疏数据[Spar data]:
在实践中经常⽤到稀疏训练数据。MLlib⽀持读取LIBSVM格式的训练语料数据,这个是 LIBSVM 和LIBLINERAR 中⽤到的默认格式(LIBSVM和LIBLINERAR是台湾林智仁教授开发的的SVM库和线性分类器)。这是⼀种⽂本格式,每⾏表⽰⼀个标记的稀疏特征向量,⽰例如下:
label index1:value1 index2:value2 ...
字符串使⽤空格分隔,索引从0开始,以递增的训练排列。导⼊系统后,特征索引⾃动转为从0开始索引。
import org.apache.ssion.LabeledPoint;
import org.apache.spark.mllib.util.MLUtils;
import org.apache.spark.api.java.JavaRDD;
JavaRDD<LabeledPoint> examples = MLUtils.loadLibSVMFile(jsc.sc(), "data/mllib/sample_").toJavaRDD();
局部矩阵[Local matrix]:
局部矩阵使⽤整型⾏列索引和浮点(double)数值,存储在单机上。MLIB⽀持密集型矩阵,元素值按列优先以double数组的⽅式存储。例如,下⾯的矩阵:
会被存储为⼀维数组 [1.0, 3.0, 5.0, 2.0, 4.0, 6.0],矩阵的⼤⼩是(3, 2)。麻柳树根
import org.apache.spark.mllib.linalg.Matrix;
import org.apache.spark.mllib.linalg.Matrices;
// Create a den matrix ((1.0, 2.0), (3.0, 4.0), (5.0, 6.0))
Matrix dm = Matrices.den(3, 2, new double[] {1.0, 3.0, 5.0, 2.0, 4.0, 6.0});
// Create a spar matrix ((9.0, 0.0), (0.0, 8.0), (0.0, 6.0))
Matrix sm = Matrices.spar(3, 2, new int[] {0, 1, 3}, new int[] {0, 2, 1}, new double[] {9, 6, 8});
分布式矩阵[Distributed matrix]:
基本类型是⾏矩阵(RowMatrix)。⾏矩阵按⾏分布式存储,这个时候⾏号没有意义。例如,特征向量集就可以表⽰为⾏矩阵,通过RDD来⽀撑矩阵的部分⾏,每⾏是⼀个局部向量。我们认为RowMatrix的列数不是特别巨⼤,所以单个局部向量可以⽅便地跟驱动程序交互,并且能够在单个节点上存储和操作。索引⾏矩阵(IndexedRowMatrix)跟RowMatrix类似,但是IndexedRowMatrix带有⾏号,从⽽可以标记⾏并且执⾏join操作。坐标矩阵(CoordinateMatrix)是以 (COO⽤于存储稀疏矩阵,以链表的形式(list)存放(rowIndex, colIndex, value)元组)格式存储的分布式矩阵,其底层⽀撑也是RDD。
注意:分布式矩阵底层的RDD必须是确定的,因为我们缓存了矩阵的⼤⼩(size)。通常使⽤不确定的RDD会导致出错。
⾏矩阵[RowMatrix]:
⾏矩阵(RowMatrix)按⾏分布式存储,⽆⾏索引,底层⽀撑结构是多⾏数据组成的RDD,每⾏是⼀个局部向量。正因为每⾏是局部向量,列数受限于整数的范围,不过在实践中已经够⽤了。
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.mllib.linalg.Vector;
import org.apache.spark.mllib.linalg.distributed.RowMatrix;
JavaRDD<Vector> rows = ... // a JavaRDD of local vectors
// Create a RowMatrix from an JavaRDD<Vector>.
RowMatrix mat = new RowMatrix(rows.rdd());
// Get its size.
long m = mat.numRows();
long n = mat.numCols();
// QR decomposition
QRDecomposition<RowMatrix, Matrix> result = mat.tallSkinnyQR(true);
索引⾏矩阵[IndexedRowMatrix]:
索引⾏矩阵(IndexedRowMatrix)跟RowMatrix类似,但是有⾏索引。其底层⽀撑结构是索引的⾏组成的RDD,所以每⾏可以通过索引(long)和局部向量表⽰。
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.mllib.linalg.distributed.IndexedRow;
import org.apache.spark.mllib.linalg.distributed.IndexedRowMatrix;
import org.apache.spark.mllib.linalg.distributed.RowMatrix;
JavaRDD<IndexedRow> rows = ...// a JavaRDD of indexed rows
// Create an IndexedRowMatrix from a JavaRDD<IndexedRow>.
IndexedRowMatrix mat = new IndexedRowMatrix(rows.rdd());
// Get its size.
long m = mat.numRows();
long n = mat.numCols();
// Drop its row indices.
RowMatrix rowMat = RowMatrix();
坐标矩阵[CoordinateMatrix]:
坐标矩阵( CoordinateMatrix)也是由RDD做底层结构的分布式矩阵。每个RDD元素是由多个(i : long, j : long, value: Double)组成的元组,其中i是⾏索引,j是列索引,value是元素值。CoordinateMatrix 只应该应⽤于矩阵纬度⾼并且稀疏的情况下。
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.mllib.linalg.distributed.CoordinateMatrix;
import org.apache.spark.mllib.linalg.distributed.IndexedRowMatrix;春天的风景作文
import org.apache.spark.mllib.linalg.distributed.MatrixEntry;
麻花怎么做才能又酥又脆JavaRDD<MatrixEntry> entries = ... // a JavaRDD of matrix entries
// Create a CoordinateMatrix from a JavaRDD<MatrixEntry>.
CoordinateMatrix mat = new CoordinateMatrix(entries.rdd());
// Get its size.
散文诗歌long m = mat.numRows();
long n = mat.numCols();
// Convert it to an IndexRowMatrix who rows are spar vectors.
IndexedRowMatrix indexedRowMatrix = IndexedRowMatrix();
分块矩阵[BlockMatrix]:
分块矩阵(BlockMatrix)是由RDD⽀撑的分布式矩阵,RDD中的元素为MatrixBlock。MatrixBlock是多个((Int, Int), Matrix)组成的元组,其中(Int, Int)是分块索引, Matriax是指定索引处的⼦矩阵, 该矩阵的⼤⼩为 rowsPerBlock x colsPerBlock。BlockMatrix⽀持跟其他BlockMatrix做add(加)和multiply(乘)操作。BlockMatrix还有⼀个辅助⽅法validate,这个⽅法可以检查BlockMatrix是否设置是否恰当。
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.mllib.linalg.distributed.BlockMatrix;
刻舟求剑造句
import org.apache.spark.mllib.linalg.distributed.CoordinateMatrix;
import org.apache.spark.mllib.linalg.distributed.IndexedRowMatrix;
JavaRDD<MatrixEntry> entries = ... // a JavaRDD of (i, j, v) Matrix Entries
// Create a CoordinateMatrix from a JavaRDD<MatrixEntry>.
CoordinateMatrix coordMat = new CoordinateMatrix(entries.rdd());
// Transform the CoordinateMatrix to a BlockMatrix
BlockMatrix matA = BlockMatrix().cache();
// Validate whether the BlockMatrix is t up properly. Throws an Exception when it is not valid.
西红柿打卤面怎么做// Nothing happens if it is valid.
matA.validate();
/
/ Calculate A^T A.
BlockMatrix ata = anspo().multiply(matA);