使用Java在Spark MLlib中进行矩阵运算

4

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

在本地矩阵(中等大小,小于100x100,因此不需要分布式)中进行操作的最佳方法是什么。

例如,在计算数据集的 SVD 之后,我需要执行一些矩阵操作。 RowMatrix 仅提供乘法函数。toBreeze 方法返回一个 DenseMatrix<Object>,但 API 似乎不太友好: 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

看起来dlwh帮了你。请用绿色勾号标记他的答案为正确答案。 - nkadwa
1个回答

6

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

感谢您指导我正确的方向,dlwh!语法不准确,但那是正确的想法。我添加了具有正确语法的解决方案。 - Julien
是的,语法不正确。最好纠正一下。 - marilena.oita

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接