【问题标题】:Scala vector scalar multiplicationScala向量标量乘法
【发布时间】:2015-12-16 04:57:13
【问题描述】:

我正在 Apache Spark MLlib 中实现一些机器学习算法,我想将向量与标量相乘:

其中 u_i_j_m 是 Double 而 x_i 是向量

我尝试了以下方法:

import breeze.linalg.{ DenseVector => BDV, Vector => BV}
import org.apache.spark.mllib.linalg.{DenseVector, Vectors, Vector}
...

private def runAlgorithm(data: RDD[VectorWithNorm]): = {
    ...
    data.mapPartitions { data_ponts =>
        c = Array.fill(clustersNum)(BDV.zeros[Double](dim).asInstanceOf[BV[Double]])
        ...
        data_ponts.foreach { data_point =>
            ...
            u_i_j_m : Double = ....
            val temp= data_point.vector * u_i_j_m)
            // c(j) = temp
        }
    }
}

其中 VectorWithNorm 定义如下:

class VectorWithNorm(val vector: Vector, val norm: Double) extends Serializable {

    def this(vector: Vector) = this(vector, Vectors.norm(vector, 2.0))
    def this(array: Array[Double]) = this(Vectors.dense(array))
    def toDense: VectorWithNorm = new  VectorWithNorm(Vectors.dense(vector.toArray), norm)
}

但是当我构建项目时出现以下错误:

错误:值 * 不是 org.apache.spark.mllib.linalg.Vector 的成员 val temp = (data_point.vector * u_i_j_m)

我怎样才能正确地做这个乘法?

【问题讨论】:

  • u_i_j_m : Double 不是缺少val 吗?还是你只是不小心把它删掉了?
  • u_i_j_m 的计算很复杂,所以我省略了。

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


【解决方案1】:

不幸的是,Spark-Scala 的贡献者决定他们不会为 Scala 中的基础计算(即线性代数)选择一个库。在幕后,他们使用了微风,但 Spark Vector 上的标量 * 和 + 是私有的,以及其他有用的方法。这与可以使用出色的 numpy 线性代数库的 python 完全不同。争论是开发人员捉襟见肘,微风是可疑的,因为开发停滞不前(如果我没记错的话),还有一个替代方案(apache.commons.math),所以他们决定让用户选择你想使用的 linalg 库在斯卡拉。但是,在社区的一些成员的提示下,现在有一个 spark-package 提供线性代数 org.apache.spark.mllib.linalg.Vector - see here

【讨论】:

  • 本地矩阵使用其中之一处理 (statr.me/2015/09/…) 但分布式 mllib IndexedRowMatrx 使用什么?
【解决方案2】:

在您的代码中,您使用的是 sparks 的 Vector 特征而不是微风的 DenseVector,这就是您的 data_point.vector 成员上没有定义 * 运算符的原因。

【讨论】:

  • 谢谢!我做了以下,它工作:var temp: BDV[Double] = new BDV(data_point.vector.toArray)temp *= u_i_j_mc(j) += temp
  • 难道不能将 BDV 用于 VectorWithNorm 吗?
  • 可以,但是 VectorWithNorm 是在不同的类中定义的,我只想使用它
猜你喜欢
  • 2020-03-16
  • 2013-04-04
  • 2014-12-30
  • 1970-01-01
  • 2014-11-24
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 2020-10-29
相关资源
最近更新 更多