Apache spark mllib.linalg向量与用于机器学习的spark.util向量之间的区别

时间:2016-01-20 04:34:50

标签: scala apache-spark machine-learning apache-spark-mllib

我试图在spark和scala中实现神经网络,但无法执行任何向量或矩阵乘法。 Spark提供两个向量。 Spark.util vector支持点操作但不推荐使用。 mllib.linalg向量不支持scala中的操作。

用于存储权重和训练数据的是哪一个?

如何使用像w * x这样的mllib在spark scala中执行向量乘法,其中w是向量或权重矩阵,x是输入。 pyspark vector支持点积,但在scala中我无法在向量中找到这样的函数

1 个答案:

答案 0 :(得分:7)

好吧,如果您需要完全支持线性代数运算符,您必须自己实现这些或使用外部库。在第二种情况下,显而易见的选择是Breeze

它已在幕后使用,因此不会引入其他依赖项,您可以轻松修改现有的Spark代码以进行转换:

import breeze.linalg.{DenseVector => BDV, SparseVector => BSV, Vector => BV}

def toBreeze(v: Vector): BV[Double] = v match {
  case DenseVector(values) => new BDV[Double](values)
  case SparseVector(size, indices, values) => {
    new BSV[Double](indices, values, size)
  }
}

def toSpark(v: BV[Double]) = v match {
  case v: BDV[Double] => new DenseVector(v.toArray)
  case v: BSV[Double] => new SparseVector(v.length, v.index, v.data)
}

Mahout提供了您可能感兴趣的有趣Spark and Scala bindings

对于简单的矩阵向量乘法,可以更容易地利用现有的矩阵方法。例如,IndexedRowMatrixRowMatrix提供了可以采用局部矩阵的multiply方法。您可以查看Matrix Multiplication in Apache Spark以获取示例用法。