[英]update parameter in scala function
在spark mllib天真的貝葉斯代碼中,如何做到這一點?
c._2 += v.toBreeze
v: Vector
是mergeValue函數的參數,我們不能重新分配val
。 但是,為什么源代碼中有c._2 += v.toBreeze
?
這是源代碼:
mergeValue = (c: (Long, BDV[Double]), v: Vector) => {
requireNonnegativeValues(v)
(c._1 + 1L, c._2 += v.toBreeze)},
它的編寫方式不是分配,而是一種返回添加了元素的新向量的方法。 本質上, c._2 += v.toBreeze
更正式地寫為(c._2).+=(v.toBreeze)
。
如果查看breeze.linalg.DenseVector
的API( BDV
類的別名),您會注意到有一個+=
方法,該方法在向量前加上一個元素。 這是在這種情況下應用的方法。
回到您的示例,這意味着所討論的代碼( c._1 + 1L
combineByKey()
的第二個參數正在創建一個函數,該函數遞增Long
( c._1 + 1L
)並聚合org.apache.spark.mllib.linalg.Vector
轉換為breeze.linalg.DenseVector
( c._2 += v.toBreeze
)。矢量聚合的發生方式是+=
方法返回新的DenseVector
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.