Scala 如何规范化spark中的矩阵?

Scala 如何规范化spark中的矩阵?,scala,apache-spark,matrix,Scala,Apache Spark,Matrix,我需要将每个矩阵元素(I,j)除以对角线元素(I,I)和(j,j)乘积的平方 换句话说,对于所有i和j我需要执行: mat(i, j) = mat(i, j)/sqrt(mat(i,i)*mat(j,j)) 因此,矩阵: 4 0 12 0 1 1 12 0 9 变成: 1 0 2 0 1 1 2 0 1 到目前为止,我所拥有的是一个行/列索引对列表,其中包含一个权重,我将其转换

我需要将每个矩阵元素(I,j)除以对角线元素(I,I)和(j,j)乘积的平方

换句话说,对于所有ij我需要执行:

mat(i, j) = mat(i, j)/sqrt(mat(i,i)*mat(j,j))
因此,矩阵:

4   0   12                 
0   1   1
12  0   9
变成:

1   0   2                 
0   1   1
2   0   1
到目前为止,我所拥有的是一个行/列索引对列表,其中包含一个权重,我将其转换为坐标矩阵(以及稍后的行矩阵)。我通过过滤row==column的元素来提取对角线

实现这种元素划分的最佳方式是什么

import org.apache.spark.mllib.linalg.distributed.{CoordinateMatrix, MatrixEntry, RowMatrix}
import scala.math.sqrt

val pairs = Array((0,0,4.0), (0,2,12.0), (1,1,1.0), (2,0,12.0), (2,2,9.0))
val pairs_rdd = sc.parallelize(pairs)

val diagonal = pairs_rdd.filter(r => r._1 == r._2).map(r => (r._2, sqrt(r._3)))

val matrixEntries = pairs_rdd.map(r => MatrixEntry(r._1, r._2, r._3))

val coordinateMatrix: CoordinateMatrix = new CoordinateMatrix(matrixEntries)
val rowMatrix: RowMatrix = coordinateMatrix.toRowMatrix()

似乎没有一个MLLib矩阵帮助器类能够真正在这里提供帮助,因此唯一的解决方法似乎是手动将矩阵与您创建的对角线连接起来(一次通过
i
,一次通过
j
):

val diagonal: RDD[(Long, Double)] = pairs_rdd.filter(r => r._1 == r._2).map(r => (r._2, r._3))

val result = matrixEntries
  .keyBy(_.i).join(diagonal).values     // join by i coordinate
  .keyBy(_._1.j).join(diagonal).values  // join by j coordinate
  .map { case ((e, di), dj) => MatrixEntry(e.i, e.j, e.value / sqrt(di * dj)) }