我对scala很陌生,我正在按照K-指的教程使用k-means算法来练习它。
我对本教程的这一部分感到困惑:
var newCentroids = pointsGroup.mapValues(ps => average(ps)).collectAsMap() 这会导致类型不匹配错误,因为函数average需要一个Seq,而我们给它一个Iterable。我怎么才能解决这个问题?是什么导致了这个错误?
发布于 2015-04-16 07:20:25
在为Seq函数提供的解决方案中,我们可以很容易地用Iterable代替average:
def average(ps: Iterable[Vector]) : Vector = {
val numVectors = ps.size
var out = new Vector(ps.head.elements)
ps foreach ( out += _)
out / numVectors
}甚至在恒定的空间里:
def average(ps: Iterable[Vector]): Vector = {
val numVectors = ps.size
val vSize = ps.head.elements.length
def element(index: Int): Double = ps.map(_(index)).sum / numVectors
new Vector(0 until vSize map element toArray)
}发布于 2015-04-16 06:54:16
好的Seq是Iterable的一个子类型,但反之亦然,所以在类型系统中不可能转换这些类型。
通过编写average(ps.toSeq)可以进行显式转换。此转换将迭代Iterable并将项目收集到Seq中。
https://stackoverflow.com/questions/29667079
复制相似问题