fit method

List<int> fit(
  1. List<List<double>> X
)

Implementation

List<int> fit(List<List<double>> X) {
  final n = X.length;
  if (n == 0) return [];
  final labels = List<int>.filled(n, 0);
  var clusterId = 0;
  final epsSq = eps * eps;
  for (var i = 0; i < n; i++) {
    if (labels[i] != 0) continue;
    final neigh = _regionQuery(X, i, epsSq);
    if (neigh.length < minPts) {
      labels[i] = -1; // noise
      continue;
    }
    clusterId++;
    labels[i] = clusterId;
    final seeds = List<int>.from(neigh.where((p) => p != i));
    while (seeds.isNotEmpty) {
      final cur = seeds.removeAt(0);
      if (labels[cur] == -1) labels[cur] = clusterId;
      if (labels[cur] != 0) continue;
      labels[cur] = clusterId;
      final curNeigh = _regionQuery(X, cur, epsSq);
      if (curNeigh.length >= minPts) {
        for (var p in curNeigh) {
          if (!seeds.contains(p)) seeds.add(p);
        }
      }
    }
  }
  return labels;
}