Ale*_*x L 4 scala apache-spark apache-spark-mllib
我正在 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
}
}
}
Run Code Online (Sandbox Code Playgroud)
其中 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)
}
Run Code Online (Sandbox Code Playgroud)
但是当我构建项目时,我收到以下错误:
错误:值 * 不是 org.apache.spark.mllib.linalg.Vector val temp = (data_point.vector * u_i_j_m) 的成员
我怎样才能正确地做这个乘法?
不幸的是,Spark-Scala 的贡献者决定他们不会在 Scala 中选择一个用于底层计算的库,即线性代数。在幕后,他们使用微风,但 Spark Vector 上的标量 * 和 + 是私有的,以及其他有用的方法。这与 python 完全不同,在 python 中你可以使用优秀的 numpy 线性代数库。争论是开发人员被拉长了,因为开发停滞(如果我没记错的话),所以微风是可疑的,有一个替代方案(apache.commons.math),所以他们决定让用户选择你想要使用的 linalg 库在斯卡拉。但是,在社区的一些成员的推动下,现在有一个提供线性代数的 spark-package org.apache.spark.mllib.linalg.Vector
-请参阅此处。
归档时间: |
|
查看次数: |
4288 次 |
最近记录: |