这个问题是关于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行矩阵:
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