闭包参数列表的上下文类型需要 1 个参数,但指定了 2 个
Contextual type for closure argument list expects 1 argument, but 2 were specified
我正在尝试让这个算法与 swift 2.1 一起工作:http://users.eecs.northwestern.edu/~wkliao/Kmeans/
虽然我在这一行收到错误:
return map(Zip2Sequence(centroids, clusterSizes)) { Cluster(centroid: [=10=], size: ) }
完整函数如下:
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: [=11=], size: ) }
}
我该如何更改以消除此错误?
据我了解,您正在尝试执行以下操作:
return (0..<k).map { Cluster(centroid: centroids[[=10=]], size: clusterSizes[[=10=]]) }
来自 Swift 的 Zip2Sequence<Sequence1, Sequence2>
文档:
A sequence of pairs built out of two underlying sequences, where the
elements of the i
th pair are the i
th elements of each underlying
sequence.
Zip2Sequence<[T], [Int]>
生成器的元素是 (T, Int)
元组。
您可以通过索引访问此元组的各个元素。
因此,以下代码应该适合您:
return Zip2Sequence(centroids, clusterSizes).map { Cluster(centroid: [=11=].0, size: [=11=].1) }
我正在尝试让这个算法与 swift 2.1 一起工作:http://users.eecs.northwestern.edu/~wkliao/Kmeans/
虽然我在这一行收到错误:
return map(Zip2Sequence(centroids, clusterSizes)) { Cluster(centroid: [=10=], size: ) }
完整函数如下:
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: [=11=], size: ) }
}
我该如何更改以消除此错误?
据我了解,您正在尝试执行以下操作:
return (0..<k).map { Cluster(centroid: centroids[[=10=]], size: clusterSizes[[=10=]]) }
来自 Swift 的 Zip2Sequence<Sequence1, Sequence2>
文档:
A sequence of pairs built out of two underlying sequences, where the elements of the
i
th pair are thei
th elements of each underlying sequence.
Zip2Sequence<[T], [Int]>
生成器的元素是 (T, Int)
元组。
您可以通过索引访问此元组的各个元素。
因此,以下代码应该适合您:
return Zip2Sequence(centroids, clusterSizes).map { Cluster(centroid: [=11=].0, size: [=11=].1) }