【问题标题】:How to find the mean of same cells in an array of Breeze Matrices in spark scala?如何在 spark scala 的 Breeze 矩阵数组中找到相同单元格的平均值?
【发布时间】:2018-12-06 17:56:20
【问题描述】:

我有一个Array[DenseMatrix[Double]],我想找到相同单元格的平均值。例如:

Array[0]: 
  +---+---+
  | 1 | 2 |
  +---+---+ 
  | 2 | 3 |
  +---+---+

Array[1]: 
  +---+---+
  | 1 | 1 |
  +---+---+ 
  | 3 | 1 |
  +---+---+

Array[2]:
  +---+---+
  | 2 | 3 |
  +---+---+ 
  | 4 | 1 |
  +---+---+

Result: DenseMatrix: 
  +----+----+
  | 1.3|  2 |
  +----+----+ 
  |  3 | 1.6|
  +----+----+

这不是 RDD,因为我希望这段代码在驱动程序上运行。

Spark Scala 对我来说是新的,我能想到的只是:

  val ar = rdd.collect().foreach(x=> {
    val matr = DenseMatrix.zeros[Double](C,2)
    matr := x/M
    matr
  })

但我不知道它是否正确,因为它认为它是closure。此外,它需要 DenseMatrix[Double] 返回类型,但我收到错误,因为如果 RDD 为空,我没有。有什么想法吗?

【问题讨论】:

    标签: scala apache-spark matrix mean scala-breeze


    【解决方案1】:

    当使用 breeze 矩阵 时,您可以使用 + 将两个不同的矩阵按元素相加。这意味着您唯一需要做的就是将所有矩阵相加,然后除以矩阵的数量。可以这样做:

    import breeze.linalg.DenseMatrix
    
    val arr = Array(new DenseMatrix(2, 2, Array(1.0,2,2,3)), 
            new DenseMatrix(2, 2, Array(1.0,3,1,1)),
            new DenseMatrix(2, 2, Array(2.0,4,3,1)))
    
    val dm: DenseMatrix = arr.reduce(_ + _).map(_ / arr.length)
    

    生成的矩阵将具有相同单元格的平均值。


    这在使用 Sparkml.linalg.DenseMatrix 矩阵时也是可能的,但是它有点复杂,因为不容易相加。

    val numCols = arr.head.numCols
    val numRows = arr.head.numRows
    val values = arr.map(_.values)
      .reduce((_, _).zipped.map(_ + _))
      .map(_ / arr.length)
    
    val dm = new DenseMatrix(numCols, numRows, values)
    

    【讨论】:

    • 我最终用 foldLeft 做到了,但您的第一个解决方案似乎更容易,而且效果很好。谢谢!
    【解决方案2】:

    你可以像这样使用fold

    val rdd    = sc.makeRDD(Seq(1, 2, 3))
    val zero   = 0
    val sum    = rdd.fold(zero)((l, r) => l + r) // = (((0 + 1) + 2) + 3)
    val result = sum / rdd.count()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      • 2015-12-03
      • 2020-10-07
      • 1970-01-01
      • 1970-01-01
      • 2018-01-13
      相关资源
      最近更新 更多