【问题标题】:How to convert RowMatrix to local Matrix?如何将 RowMatrix 转换为本地矩阵?
【发布时间】:2019-07-05 07:23:19
【问题描述】:

我对 Spark 中的矩阵有疑问。

假设我有一个名为 X 的 RowMatrix,如下所示:

0.5    0.5  
0.25   0.0625
0.125  0.125
0.0625 0.0625
0.0625 0.25

现在我想做的是将这个RowMatrixRowMatrix X 的转置版本相乘。

0.5 0.25   0.125 0.0625 0.0625
0.5 0.0625 0.125 0.0625 0.25

现在,据我所知,我不能将RowMatrix 与另一个RowMatrix 相乘,它必须是RowMatrix 和一个局部矩阵。因此,我尝试使用以下代码将RowMatrix 转换为局部密集矩阵:

val arr = X.rows.map(x=>x.toArray).collect.flatten
val Xlocal = Matrices.dense(X.numRows.toInt,X.numCols.toInt,arr)

但它不能正确转换它,因为我认为RowMatrix 是基于行的?我不太确定,并且本地密集矩阵以列优先顺序存储,因此顺序混乱。

有人可以帮我如何实现吗?

【问题讨论】:

    标签: scala apache-spark matrix rdd apache-spark-mllib


    【解决方案1】:

    RowMatrix 没有任何行索引,只应在行顺序无关紧要时使用。如果订单确实重要,请改用IndexedRowMatrix

    可以将RowMatrix 转换为IndexedRowMatrix,但请注意不保证顺序,最好直接使用IndexedRowMatrix。假设rowMat 是要转换的矩阵:

    val indRowMax = new IndexedRowMatrix(rowMat.rows.zipWithIndex().map{ case (v, id) => IndexedRow(id, v)})
    

    IndexedRowMatrix 可以轻松转换为本地矩阵:

    val localMat = indRowMax.toBlockMatrix().toLocalMatrix()
    

    与转置相乘可以如下进行:

    indRowMax.multiply(localMat.transpose)
    

    【讨论】:

    • 感谢您的帮助,我决定改用 indexedRowMatrix
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多