4

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

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

例如,在计算数据集的 SVD 之后,我需要执行一些矩阵运算。RowMatrix唯一提供乘法功能。toBreeze 方法返回 aDenseMatrix<Object>但 API 似乎对 Java 不友好: public final <TT,B,That> That $plus(B b, UFunc.UImpl2<OpAdd$,TT,B,That> op)

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

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

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
4

1 回答 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());
于 2015-03-11T05:17:43.283 回答