2015-05-11 2 views
4

Я бы очень хотел, чтобы преобразовать свою org.apache.spark.mllib.linalg.Matrix в org.apache.spark.mllib.linalg.distributed.RowMatrixПреобразование матрицы в RowMatrix в Apache Спарк с помощью Scala

I может сделать это как таковое:

val xx = X.computeGramianMatrix() //xx is type org.apache.spark.mllib.linalg.Matrix 
val xxs = xx.toString() 
val xxr = xxs.split("\n").map(row => row.replace(" "," ").replace(" "," ").replace(" "," ").replace(" "," ").replace(" ",",").split(",")) 
val xxp = sc.parallelize(xxr) 
val xxd = xxp.map(ar => Vectors.dense(ar.map(elm => elm.toDouble))) 
val xxrm: RowMatrix = new RowMatrix(xxd) 

Однако, это действительно грубый и общий взлом. Может ли кто-нибудь показать мне лучший способ?

Примечание Я использую Спарк версии 1.3.0

ответ

7

Я предлагаю вам преобразовать матрицу в РДУ [Вектор], который вы можете автоматически преобразовать в RowMatrix.

Давайте рассмотрим следующий пример:

import org.apache.spark.rdd._ 
import org.apache.spark.mllib.linalg._ 


val denseData = Seq(
    Vectors.dense(0.0, 1.0, 2.0), 
    Vectors.dense(3.0, 4.0, 5.0), 
    Vectors.dense(6.0, 7.0, 8.0), 
    Vectors.dense(9.0, 0.0, 1.0) 
) 

val dm: Matrix = Matrices.dense(3, 2, Array(1.0, 3.0, 5.0, 2.0, 4.0, 6.0)) 

Вам нужно определить метод для преобразования матрицы в РДУ [Вектор]

def matrixToRDD(m: Matrix): RDD[Vector] = { 
    val columns = m.toArray.grouped(m.numRows) 
    val rows = columns.toSeq.transpose // Skip this if you want a column-major RDD. 
    val vectors = rows.map(row => new DenseVector(row.toArray)) 
    sc.parallelize(vectors) 
} 

и теперь вы можете применить преобразование на ваша матрица:

import org.apache.spark.mllib.linalg.distributed.RowMatrix 
val rows = matrixToRDD(dm) 
val mat = new RowMatrix(rows) 

Я надеюсь, что это может помочь!

0

небольшая коррекция в коде выше: мы должны использовать Vectors.dense вместо new DenseVector

val vectors = rows.map(row => Vectors.dense(row.toArray)) 
Смежные вопросы