【问题标题】:Difference between Apache spark mllib.linalg vectors and spark.util vectors for machine learning用于机器学习的 Apache spark mllib.linalg 向量和 spark.util 向量之间的区别
【发布时间】:2016-04-25 19:20:27
【问题描述】:
我正在尝试在 spark 和 scala 中实现神经网络,但无法执行任何向量或矩阵乘法。
Spark 提供了两个向量。 Spark.util 矢量支持点操作,但已弃用。 mllib.linalg 向量不支持 scala 中的操作。
使用哪一个来存储权重和训练数据?
如何在 spark scala 中使用 mllib (如 w*x)执行向量乘法,其中 w 是向量或权重矩阵,x 是输入。
pyspark 向量支持点积,但在 scala 中我无法在向量中找到这样的函数
【问题讨论】:
标签:
scala
apache-spark
machine-learning
apache-spark-mllib
【解决方案1】:
好吧,如果您需要对线性代数运算符的全面支持,您必须自己实现这些或使用外部库。在第二种情况下,显而易见的选择是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,您可能也会觉得有趣。
对于简单的矩阵向量乘法,可以更轻松地利用现有的矩阵方法。例如IndexedRowMatrix 和RowMatrix 提供了可以采用局部矩阵的multiply 方法。您可以查看Matrix Multiplication in Apache Spark 以获取示例用法。