@Override
public Clustering<KMeansModel> run(Database database, Relation<V> relation) {
if(relation.size() <= 0) {
return new Clustering<>("k-Means Assignment", "kmeans-assignment");
}
if(LOG.isStatistics()) {
LOG.statistics(new StringStatistic(KEY + ".initialization", initializer.toString()));
}
List<Vector> means = initializer.chooseInitialMeans(database, relation, k, getDistanceFunction(), Vector.FACTORY);
List<ModifiableDBIDs> clusters = new ArrayList<>();
for(int i = 0; i < k; i++) {
clusters.add(DBIDUtil.newHashSet((int) (relation.size() * 2. / k)));
}
WritableIntegerDataStore assignment = DataStoreUtil.makeIntegerStorage(relation.getDBIDs(), DataStoreFactory.HINT_TEMP | DataStoreFactory.HINT_HOT, -1);
double[] varsum = new double[k];
assignToNearestCluster(relation, means, clusters, assignment, varsum);
Clustering<KMeansModel> result = new Clustering<>("Nearest Centroid Clustering", "nearest-center-clustering");
for(int i = 0; i < clusters.size(); i++) {
KMeansModel model = new KMeansModel(means.get(i), varsum[i]);
result.addToplevelCluster(new Cluster<>(clusters.get(i), model));
}
return result;
}