7
回答
scala集合map函数使用问题
【腾讯云】学生服务器套餐10元/月 >>>   

@oldpig 你好,想跟你请教个问题:

points.map(point => closestCentroid(point) -> (point, 1))

其中,

points: Seq[Double];

centroids: Seq[Double]

def closestCentroid(point: Point) = {
  centroids.reduceLeft((a, b) => if ((point distance a) < (point distance b)) a else b)
}

表示看不懂closetCentroid(point) -> (point, 1)

这里的数字1有什么作用?

求指点迷津

<无标签>
举报
vincent_hv
发帖于5年前 7回/5K+阅
共有7个答案 最后回答: 5年前
没有上下文,不知道这句代码的意图。之前的代码里好象没这个嘛。
--- 共有 1 条评论 ---
vincent_hvgit上看到的,将KMeans算法迁移到Spark集群上实现,其他的没太大差别,就是这段划分簇的计算看不懂,我把这段都贴上,麻烦您给看看吧 5年前 回复
(point, 1) 是scala里面的一种集合类型叫 tuple(元组) ,也可以表示成  point -> 1

points.map 方法里面把每个值传给 closestCentroid,closestCentroid里面做比较,然后返回 centroids 里面的一个值。比如是i。那么每一次map返回的值就是  (centroids(i),(point,1)) 这样的一个复合元组。

我觉得 (point,1)  在这里是没啥用的,  直接    ->point 就可以。

也许他其他地方用到吧

--- 共有 2 条评论 ---
clove之歌1 在以后reduce函数中用来统计个数用。 4年前 回复
vincent_hvSpark的KMeans示例程序中也看到了这种表达式,我将那段都贴出来,麻烦您给看看,除了这句还有另外一句也不理解 5年前 回复

引用来自“ForEleven”的答案

(point, 1) 是scala里面的一种集合类型叫 tuple(元组) ,也可以表示成  point -> 1

points.map 方法里面把每个值传给 closestCentroid,closestCentroid里面做比较,然后返回 centroids 里面的一个值。比如是i。那么每一次map返回的值就是  (centroids(i),(point,1)) 这样的一个复合元组。

我觉得 (point,1)  在这里是没啥用的,  直接    ->point 就可以。

也许他其他地方用到吧

var closest = data.map (p => (closestPoint(p, kPoints), (p, 1)))       
var pointStats = closest.reduceByKey{case ((x1, y1), (x2, y2)) => (x1 + x2, y1 + y2)}         

var newPoints = pointStats.map {pair => (pair._1, pair._2._1 / pair._2._2)}.collectAsMap()

这是Spark中的KMeans示例程序的源代码,就是这里的closet和newPoints的表达式无法理解。求指点

引用来自“oldpig”的答案

没有上下文,不知道这句代码的意图。之前的代码里好象没这个嘛。
val clusters = (
                 points.map(point => closestCentroid(point) -> (point, 1)).reduceByKeyToDriver({
                     case ((ptA, numA), (ptB, numB)) => (ptA + ptB, numA + numB)                                                                                         
                 }).map({
                     case (centroid, (ptSum, numPts)) => centroid -> ptSum / numPts                                                                                      
                }))
这段是在git上看到的,整个程序是将KMeans算法迁移到Spark集群上,其他部分和单机版的没有太大区别,就是这段划分簇的计算无法理解
reduceByKey 在scala2.10 中已经没有这个方法了,而且对这个算法不太理解。这里只是scala 元组的概念和集合处理的一些api
--- 共有 4 条评论 ---
vincent_hv原来如此,多谢你的耐心解答,对你的感激之情有如滔滔江水连绵不绝。。。。。。 5年前 回复
ForElevenpari是一个元组,那么取元组里面的值就可以通过这样写 pari._1 取第一个。 这里 pari._2 还是一个元组,还可以 接着去取值 pari._2._1 5年前 回复
zhuang是元祖(Tuple) 5年前 回复
vincent_hvpari._1, pari._2_.1 / pair._2._2 这句怎么理解呢?之前的学习中也没见过这种表达式 5年前 回复

引用来自“oldpig”的答案

<Programming in Scala> 2nd edition Page 90 "Step 9. Use tuples"
我有本《快学scal》,这里面也有讲,竟然看漏了,对自己无语了。在弱弱的问一句,《programming in scala》的第一版和第二版差别大吗?我有中文的第一版,我英语比较差,看英文的表示有压力。对于这三份资料加初学的我,您能给点学习指导吗?麻烦了
--- 共有 2 条评论 ---
vincent_hvOK明白了,多谢你的指导 5年前 回复
oldpig<Programming in Scala> 第一版的内容完全过时,完全没有阅读的价值。一定要看第二版。《快学Scala》还不错,不过不适合系统地学习。<Programming in Scala>第二版是必读书。 5年前 回复
顶部