2015-12-15 90 views
3

我實施了Apache星火MLlib一些機器學習算法,我想乘向量與標量:斯卡拉矢量標量乘法

enter image description here

凡u_i_j_m是一張雙人牀和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) 
} 

但是,當我生成項目,我得到了以下錯誤:

Error: value * is not a member of org.apache.spark.mllib.linalg.Vector val temp = (data_point.vector * u_i_j_m)

我怎樣才能正確地做到這一點乘法?

+0

'u_i_j_m:雙'沒有'val'缺少?或者你是否偶然編輯過它? – kosii

+0

u_i_j_m有一個複雜的計算,所以我把它排除了。 –

回答

2

在你的代碼使用的火花的Vector特質,而不是輕而易舉的DenseVector的,這就是爲什麼有你的data_point.vector部件上沒有定義*運營商。

+1

謝謝!我做了以下和它的工作: 'VAR溫度:BDV [雙] =新的BDV(data_point.vector.toArray)' '溫度* = u_i_j_m' 'C(J)+ = temp' –

+0

難道不可能爲VectorWithNorm使用BDV嗎? – kosii

+0

它會,但VectorWithNorm被定義在一個不同的類,我只想使用它 –

3

不幸的是,Spark-Scala的貢獻者決定他們不會爲Scala中的底層計算(即線性代數)選擇一個庫。在引擎蓋下,他們使用微風,但Spark Vector上的標量*和+是私人的,以及其他有用的方法。這與python完全不同,你可以使用優秀的numpy線性代數庫。爭論的是開發人員被細化,微風是可疑的,因爲發展停滯(如果我沒有記錯的話),還有一個替代方案(apache.commons.math),所以他們決定讓用戶選擇你想使用哪個linalg庫在斯卡拉。但是,由社區的一些成員提示,現在有一個火花包,它提供org.apache.spark.mllib.linalg.Vector - see here上的線性代數。

+0

局部矩陣處理與這些之一(http://statr.me/2015/09/an-overview-of-linear-algebra -libraries-in-scala-java)但是如何使用分佈式mllib IndexedRowMatrx? – fpopic