Java中Spark MLlib中的矩阵运算

这个问题是关于MLlib(Spark 1.2.1+)。

操作局部矩阵的最佳方法是什么(中等大小,低于100×100,因此不需要分发)。

例如,在计算数据集的SVD之后,我需要执行一些矩阵运算。 RowMatrix仅提供乘法function。 toBreeze方法返回一个DenseMatrix但API似乎不是Java友好的: public final That $plus(B b, UFunc.UImpl2 op)

在Spark + Java中,如何执行以下任何操作:

  • 转置矩阵
  • 加/减两个矩阵
  • 裁剪矩阵
  • 执行元素操作
  • 等等

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

 RDD data = ...; RowMatrix matrix = new RowMatrix(data); SingularValueDecomposition 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 

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());