代码之家  ›  专栏  ›  技术社区  ›  Julien

Java中Spark MLlib中的矩阵运算

  •  4
  • Julien  · 技术社区  · 9 年前

    这个问题是关于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
    
    1 回复  |  直到 8 年前
        1
  •  6
  •   dlwh    9 年前

    Breeze只是没有提供Java友好的API。(而且,作为主要作者,我没有计划:这会严重影响API。)

    你可能可以利用MTJ使用与我们相同的密集矩阵表示的事实

    也就是说,你可以这样做:

    import no.uib.cipr.matrix.DenseMatrix;
    
    // ...
    
    breeze.linalg.DenseMatrix[Double] Ubreeze = U.toBreeze();
    new DenseMatrix(Ubreeze.cols(), Ubreeze.rows(), Ubreeze.data());