algorithm - 闭包参数列表的上下文类型需要 1 个参数,但指定了 2 个

标签 algorithm swift2 xcode7.2

我试图让这个算法与 swift 2.1 一起工作:http://users.eecs.northwestern.edu/~wkliao/Kmeans/

虽然我在这一行收到错误:

  return map(Zip2Sequence(centroids, clusterSizes)) { Cluster(centroid: $0, size: $1) }

这里是完整的函数:

func kmeans<T : ClusteredType>(
        points: [T],
        k: Int,
        seed: UInt32,
        distance: ((T, T) -> Float),
        threshold: Float = 0.0001
    ) -> [Cluster<T>] {

    let n = points.count
    assert(k <= n, "k cannot be larger than the total number of points")

    var centroids = points.randomValues(seed, num: k)
    var memberships = [Int](count: n, repeatedValue: -1)
    var clusterSizes = [Int](count: k, repeatedValue: 0)

    var error: Float = 0
    var previousError: Float = 0

        repeat {
            error = 0
            var newCentroids = [T](count: k, repeatedValue: T.identity)
            var newClusterSizes = [Int](count: k, repeatedValue: 0)

            for i in 0..<n {
                let point = points[i]
                let clusterIndex = findNearestCluster(point, centroids: centroids, k: k, distance: distance)
                if memberships[i] != clusterIndex {
                    error += 1
                    memberships[i] = clusterIndex
                }
                newClusterSizes[clusterIndex]++
                newCentroids[clusterIndex] = newCentroids[clusterIndex] + point
            }
            for i in 0..<k {
                let size = newClusterSizes[i]
                if size > 0 {
                    centroids[i] = newCentroids[i] / size
                }
            }

            clusterSizes = newClusterSizes
            previousError = error
        } while abs(error - previousError) > threshold

        return map(Zip2Sequence(centroids, clusterSizes)) { Cluster(centroid: $0, size: $1) }
}

我该如何更改它以消除此错误?

最佳答案

据我了解,您正在尝试执行以下操作:

return (0..<k).map { Cluster(centroid: centroids[$0], size: clusterSizes[$0]) }

来自 SwiftZip2Sequence<Sequence1, Sequence2>文档:

A sequence of pairs built out of two underlying sequences, where the elements of the ith pair are the ith elements of each underlying sequence.

Zip2Sequence<[T], [Int]>生成器的元素是 (T, Int)元组。 您可以通过索引访问此元组的各个元素。

因此,以下代码应该适合您:

return Zip2Sequence(centroids, clusterSizes).map { Cluster(centroid: $0.0, size: $0.1) }

关于algorithm - 闭包参数列表的上下文类型需要 1 个参数,但指定了 2 个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34822541/

相关文章:

algorithm - 一种仅使用两个临时队列来反转队列的方法,仅此而已?

ios - IOS 中 Swift 的 Rest API 未执行

ios - OS 9.2 Xcode 7.2 中的 Google 登录问题

javascript - 滚动时根据线性渐变背景设置适当的元素颜色

c++ - c++-搜索匹配子字符串的高效算法

html - 在Swift 2.0中读取HTML文件

ios - 当应用程序在后台时,如何在 IOS 应用程序中保持 XMPP 连接?

ios - 在设备中安装时无法安装应用程序错误

python - 流浪之星-codeabbey任务

ios - 如何使用来自 complicationController 的 sendMessage 唤醒 iOS 父应用程序