我是scala的新手,我正在按照k-means的教程
使用k-means算法练习它我对本教程的这一部分感到困惑:
var newCentroids = pointsGroup.mapValues(ps => average(ps)).collectAsMap()
这会导致类型不匹配错误,因为函数average
需要Seq
,而我们会给它Iterable
。我怎样才能解决这个问题?是什么导致了这个错误?
答案 0 :(得分:4)
好Seq
是Iterable
的子类型,但反之亦然,因此无法在类型系统中转换这些类型。
通过撰写average(ps.toSeq)
可以获得明确的转化。此转化将迭代Iterable
并将项目收集到Seq
。
答案 1 :(得分:2)
我们可以在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)
}