kMeans function
Perform the k-means algorithm.
Implementation
Map<String, dynamic> kMeans({
int maxIterations = 10,
required List<Instance> instances,
required List<Cluster> clusters,
}) {
var info = <String, dynamic>{};
int i;
info["cluster-motion"] = <String, List<List<num>>>{};
for (i = 0; i < maxIterations; i++) {
List<bool> shifted =
clusters.map((Cluster cluster) => cluster.shift()).toList();
clusters.forEach((cluster) {
if (!info["cluster-motion"].containsKey(cluster.id))
info["cluster-motion"][cluster.id] = <List<num>>[];
info["cluster-motion"][cluster.id].add(List<num>.from(cluster.location));
});
if (shifted.every((x) => !x)) break;
instances.forEach((Instance instance) {
instance.reallocate(clusters);
});
}
info["iterations"] = i == maxIterations
? "not stable at $maxIterations"
: "stable after ${i + 1} iterations";
return info;
}