Как конвертировать RowMatrix в локальную матрицу? - PullRequest
0 голосов
/ 11 февраля 2019

У меня проблема с матрицами в Spark.

Предположим, у меня есть RowMatrix с именем X, например:

0.5    0.5  
0.25   0.0625
0.125  0.125
0.0625 0.0625
0.0625 0.25

Теперь я хочу умножить это RowMatrix с транспонированной версией RowMatrix X.

0.5 0.25   0.125 0.0625 0.0625
0.5 0.0625 0.125 0.0625 0.25

Теперь, насколько я знаю, я не могу умножить RowMatrix на другую RowMatrix, это должно быть RowMatrix и локальная матрица.Поэтому я попытался преобразовать RowMatrix в локальную плотную матрицу, используя этот код:

val arr = X.rows.map(x=>x.toArray).collect.flatten
val Xlocal = Matrices.dense(X.numRows.toInt,X.numCols.toInt,arr)

Но он не преобразуется должным образом, потому что RowMatrix был основан на строках, я думаю?Я не совсем уверен, и локальная плотная матрица была сохранена в главном порядке столбцов, таким образом, порядок перепутан.

Может кто-нибудь помочь мне, как это реализовать?

1 Ответ

0 голосов
/ 12 февраля 2019

A RowMatrix не имеют индексов строк и должны использоваться только тогда, когда порядок строк не имеет значения.Если заказ имеет значение, используйте IndexedRowMatrix.

Можно преобразовать RowMatrix в IndexedRowMatrix, но обратите внимание, что заказ не гарантируется и предпочтительно использовать IndexedRowMatrix напрямую.Предполагая rowMat является матрицей для преобразования:

val indRowMax = new IndexedRowMatrix(rowMat.rows.zipWithIndex().map{ case (v, id) => IndexedRow(id, v)})

IndexedRowMatrix может быть легко преобразован в локальную матрицу:

val localMat = indRowMax.toBlockMatrix().toLocalMatrix()

и для умножения с транспонированием можно сделатьследующим образом:

indRowMax.multiply(localMat.transpose)
...