kMeans function

Map<String, dynamic> kMeans({
  1. int maxIterations = 10,
  2. required List<Instance> instances,
  3. required List<Cluster> clusters,
})

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;
}