Матричная операция в Spark MLlib в Java

Этот вопрос о MLlib (Spark 1.2.1+).

Каков наилучший способ манипулирования локальными матрицами (умеренный размер, меньше 100x100, поэтому не требует распределения).

Например, после вычисления SVD набора данных мне нужно выполнить некоторую матричную операцию. RowMatrix только обеспечить функцию умножения. Метод toBreeze возвращает DenseMatrix<Object> но API не кажется дружественным Java:public final <TT,B,That> That $plus(B b, UFunc.UImpl2<OpAdd$,TT,B,That> op)

В Spark+Java, как сделать любую из следующих операций:

  • транспонировать матрицу
  • сложить / вычесть две матрицы
  • обрезать матрицу
  • выполнять поэлементные операции
  • так далее

Javadoc RowMatrix: https://spark.apache.org/docs/latest/api/java/org/apache/spark/mllib/linalg/distributed/RowMatrix.html

RDD<Vector> data = ...;
RowMatrix matrix = new RowMatrix(data);
SingularValueDecomposition<RowMatrix, Matrix> svd = matrix.computeSVD(15, true, 1e-9d);

RowMatrix U = svd.U();
Vector s = svd.s();
Matrix V = svd.V();
//Example 1: How to compute transpose(U)*matrix
//Example 2: How to compute transpose(U(:,1:k))*matrix

РЕДАКТИРОВАТЬ: Спасибо за DLWH за указание мне в правильном направлении, работает следующее решение:

import no.uib.cipr.matrix.DenseMatrix;
// ...
RowMatrix U = svd.U();
DenseMatrix U_mtj = new DenseMatrix((int) U.numCols(), (int) U.numRows(), U.toBreeze().toArray$mcD$sp(), true);
// From there, matrix operations are available on U_mtj

1 ответ

Решение

Breeze просто не предоставляет Java-дружественный API. (И, выступая в качестве основного автора, я не собираюсь делать это: слишком много будет мешать API.)

Вы, вероятно, можете использовать тот факт, что MTJ использует то же представление плотной матрицы, что и мы. (Ну, почти. Их API не раскрывает majorStride, но это не должно быть проблемой для вас.)

То есть вы можете сделать что-то вроде этого:

import no.uib.cipr.matrix.DenseMatrix;

// ...

breeze.linalg.DenseMatrix[Double] Ubreeze = U.toBreeze();
new DenseMatrix(Ubreeze.cols(), Ubreeze.rows(), Ubreeze.data());
Другие вопросы по тегам