gpt4 book ai didi

scala - 使用 Scala 在 Apache Spark 中将矩阵转换为 RowMatrix

转载 作者:行者123 更新时间:2023-12-04 17:18:16 25 4
gpt4 key购买 nike

我真的很想将我的 org.apache.spark.mllib.linalg.Matrix 转换为 org.apache.spark.mllib.linalg.distributed.RowMatrix

我可以这样做:

val xx = X.computeGramianMatrix()  //xx is type org.apache.spark.mllib.linalg.Matrix
val xxs = xx.toString()
val xxr = xxs.split("\n").map(row => row.replace(" "," ").replace(" "," ").replace(" "," ").replace(" "," ").replace(" ",",").split(","))
val xxp = sc.parallelize(xxr)
val xxd = xxp.map(ar => Vectors.dense(ar.map(elm => elm.toDouble)))
val xxrm: RowMatrix = new RowMatrix(xxd)

然而,这真的很恶心,而且完全是黑客攻击。有人可以告诉我更好的方法吗?

注意我使用的是 Spark 版本 1.3.0

最佳答案

我建议您转换您的 MatrixRDD[Vector]您可以自动转换为 RowMatrix之后。

因此,让我们考虑以下示例:

import org.apache.spark.rdd._
import org.apache.spark.mllib.linalg._


val denseData = Seq(
Vectors.dense(0.0, 1.0, 2.0),
Vectors.dense(3.0, 4.0, 5.0),
Vectors.dense(6.0, 7.0, 8.0),
Vectors.dense(9.0, 0.0, 1.0)
)

val dm: Matrix = Matrices.dense(3, 2, Array(1.0, 3.0, 5.0, 2.0, 4.0, 6.0))

我们需要定义一个方法来转换 MatrixRDD[Vector] :
def matrixToRDD(m: Matrix): RDD[Vector] = {
val columns = m.toArray.grouped(m.numRows)
val rows = columns.toSeq.transpose // Skip this if you want a column-major RDD.
val vectors = rows.map(row => new DenseVector(row.toArray))
sc.parallelize(vectors)
}

现在我们可以在主 Matrix 上应用该转换:
 import org.apache.spark.mllib.linalg.distributed.RowMatrix
val rows = matrixToRDD(dm)
val mat = new RowMatrix(rows)

关于scala - 使用 Scala 在 Apache Spark 中将矩阵转换为 RowMatrix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30169841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com