【问题标题】:How can I normalize a matrix in spark?如何规范化火花中的矩阵?
【发布时间】:2017-03-18 06:33:42
【问题描述】:

我需要将每个矩阵元素 (i, j) 除以对角元素 (i, i) 和 (j, j) 的乘积的 sqrt

换句话说,对于我需要执行的所有 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

到目前为止,我所拥有的是一个行/列索引对的列表,其中包含我转换为 CoordinateMatrix(以及后来的 RowMatrix)的权重。我通过过滤行 == 列的元素来提取对角线。

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

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()

【问题讨论】:

    标签: scala apache-spark matrix


    【解决方案1】:

    似乎没有一个 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)) }
    

    【讨论】:

      猜你喜欢
      • 2018-10-24
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      • 2016-07-16
      • 1970-01-01
      • 2013-06-07
      • 1970-01-01
      相关资源
      最近更新 更多