Apple Spark MLlib学習ノート(一)MLlibデータ記憶Vector/Matrix/LablePoint


具体的なアルゴリズムモデルの解析を行う前に、まずMLlibが採用したデータ構造を明らかにします.spark公式文書も英語のデータ構造を紹介しています.住所は以下の通りです.http://spark.apache.org/docs/latest/mllib-data-types.html
MLlibは単一機local vectorsとmatraccesと分布行列をサポートします.ここで、local vectorsとmatraccesは、共通インターフェースのための簡単なデータ構造である.内部の数学演算はBreezeとjblasによって提供されます.監視学習に使用されるある訓練の見本はMLlibで「labeled point」と呼ばれています.1、local vector MLlibのローカルベクトルは主にDenseとSparseの2種類に分けられています.前者は密集ベクトルを保存するために使用されます.後者は疎ベクトルを保存するために使用されます.例えば、ベクトル(1.0,0.0,3.0)に対して、[1.0,0.0,3.0]は稠密ベクトルを表し、(3,[0,2],[1.0,3.0])は疎ベクトルを表し、そのうちの3は全体長さ、0,2は非ゼロ要素の位置を表している.その作成方式は主に三つあります.以下はそのScalコードです.
import org.apache.spark.mllib.linalg.{Vector, Vectors}

//        (1.0, 0.0, 3.0).
val dv: Vector = Vectors.dense(1.0, 0.0, 3.0)
//        (1.0, 0.0, 3.0) 
val sv1: Vector = Vectors.sparse(3, Array(0, 2), Array(1.0, 3.0))
//        (1.0, 0.0, 3.0) 
val sv2: Vector = Vectors.sparse(3, Seq((0, 1.0), (2, 3.0)))
なお、Scalaはデフォルトでscala.co llection.immutable.Vectorパッケージを導入するので、手動でorg.apphe.spark.mllib.linalg.Vectorパッケージを導入しなければならない.
2、Labeled pointベクトルラベルはラベルが付いている緊密またはまばらなlocal vectorです.MLlibでは、labeled pointsは監視学習のために使われています.私たちはdoubleを使ってラベルを保存していますので、分類と回帰の両方に使えます.二値分類では0または1ができます.多値分類では0からのシーケンスです.例えば、0,1,2,3・・・・・・・・・ベクトルラベルを作成するScralaコードは以下の通りです.
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint

//                
val pos = LabeledPoint(1.0, Vectors.dense(1.0, 0.0, 3.0))

//                
val neg = LabeledPoint(0.0, Vectors.sparse(3, Array(0, 2), Array(1.0, 3.0)))
実際にはまばらなトレーニングデータが非常に一般的で、MLlibはLIBSVMフォーマットのファイルから直接トレーニングデータを読み取ることをサポートしています.LIBSVMフォーマットはLIBSVMとLIBLINEARのデフォルトデータフォーマットです.このフォーマットは各行に対してまばらな属性のラベルベクトルを表しています.フォーマットは以下の通りです.
label index1:value1 index2:value2 ...
このようなフォーマットでラベルを読み込む方法は以下の通りです.
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")
3、Local matirixローカルマトリックスは、整数の行列の下付きスケーリングとdouble型の値を持ち、MLlibは密集ベクトルをサポートして一次元のarray[1.0,3.0,5.0,2.0,4.0,6.0]と表現でき、行列の大きさは(3,2)となります.Scala作成マトリックスのコードは以下の通りです.
import org.apache.spark.mllib.linalg.{Matrix, Matrices}
//       ((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))
4、分散行列の行列索引はlongタイプで、数値はdouble型で、1つ以上のRDDに格納されています.適切なフォーマットを選択して大型分布行列を格納することが重要です.現在MLlibは3種類の分布行列を提供しています.最も基本的なタイプはRowMatrixと呼ばれています.行ごとのインデックスは意味がありません.列の数が非常に大きくないと仮定すれば、単一のノードに格納され、処理されます.IndexedRowMatrixは前者と似ていますが、行によって索引ができます.Coordinate Matrixは、特別に疎なマトリックスに適用されるcoordinate list(COO)フォーマットの分散行列である.
①RowMatrix RowMatrixはインデックスの分布行列ですが、その行のインデックスは実際の意味がありません.各行は一つのローカルベクトルであり、各行は一つのローカルベクトルで表されるので、列の数は整数最大値の制限を受けるが、実際の動作では上限値よりも遥かに小さいはずである.
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()
②IndexedRowMatrix 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()
③Coordinate Matrix Coordinate Matrixの各要素は一つのタプル(i:Long、j:Long、value:Double)であり、iは行、jは列、valueは値である.特にまばらな行列にのみ使用されます.
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()
最後にBlockMatrix BlockMatrixを紹介するのは元のグループ(Int,Int)であり、Matrixはブロックの下の基準であり、Matrixは下付きのローソンPerBlock x colsPerBlockのサブマトリックスである.BlockMatrixは、addとmultiply方法と他の行列の演算をサポートします.もう一つのvalidate方法はBlockMatrixの作成が適切かどうかを確認するために使用されます.BlockMatrixは、一般的に、toBlockMatrix方法によってIndexedRowMatrixまたはCoordinate Matrixから変換されやすいです.toBlock Matrix方法はデフォルトで1024 x 1024サイズの行列を作成します.ユーザは、toBlockMatrix(rows PerBlock、colsPerBlock)によってサイズを自身で定義することができる.
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)