Java 中 Spark MLlib 中的矩阵运算
Matrix Operation in Spark MLlib in Java
这个问题是关于 MLlib (Spark 1.2.1+) 的。
操作局部矩阵的最佳方法是什么(中等大小,在 100x100 以下,因此不需要分布)。
例如,在计算数据集的SVD之后,我需要进行一些矩阵运算。
RowMatrix
只提供乘法函数。 toBreeze 方法 returns a DenseMatrix<Object>
但 API 似乎 Java 不友好:
public final <TT,B,That> That $plus(B b, UFunc.UImpl2<OpAdd$,TT,B,That> op)
在Spark+Java中,如何进行以下任一操作:
- 转置矩阵
- add/subtract两个矩阵
- 裁剪矩阵
- 执行逐元素操作
- 等等
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
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());
这个问题是关于 MLlib (Spark 1.2.1+) 的。
操作局部矩阵的最佳方法是什么(中等大小,在 100x100 以下,因此不需要分布)。
例如,在计算数据集的SVD之后,我需要进行一些矩阵运算。
RowMatrix
只提供乘法函数。 toBreeze 方法 returns a DenseMatrix<Object>
但 API 似乎 Java 不友好:
public final <TT,B,That> That $plus(B b, UFunc.UImpl2<OpAdd$,TT,B,That> op)
在Spark+Java中,如何进行以下任一操作:
- 转置矩阵
- add/subtract两个矩阵
- 裁剪矩阵
- 执行逐元素操作
- 等等
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
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());