in samoa-api/src/main/java/org/apache/samoa/moa/clusterers/KMeans.java [134:196]
public static Clustering gaussianMeans(Clustering gtClustering, Clustering clustering) {
ArrayList<CFCluster> microclusters = new ArrayList<CFCluster>();
for (int i = 0; i < clustering.size(); i++) {
if (clustering.get(i) instanceof CFCluster) {
microclusters.add((CFCluster) clustering.get(i));
}
else {
System.out.println("Unsupported Cluster Type:" + clustering.get(i).getClass()
+ ". Cluster needs to extend moa.cluster.CFCluster");
}
}
Cluster[] centers = new Cluster[gtClustering.size()];
for (int i = 0; i < centers.length; i++) {
centers[i] = gtClustering.get(i);
}
int k = centers.length;
if (microclusters.size() < k) {
return new Clustering(new Cluster[0]);
}
Clustering kMeansResult = kMeans(centers, microclusters);
k = kMeansResult.size();
CFCluster[] res = new CFCluster[k];
for (CFCluster microcluster : microclusters) {
// Find closest kMeans cluster
double minDistance = Double.MAX_VALUE;
int closestCluster = 0;
for (int i = 0; i < k; i++) {
double distance = distance(kMeansResult.get(i).getCenter(), microcluster.getCenter());
if (distance < minDistance) {
closestCluster = i;
minDistance = distance;
}
}
// Add to cluster
if (res[closestCluster] == null) {
res[closestCluster] = (CFCluster) microcluster.copy();
} else {
res[closestCluster].add(microcluster);
}
}
// Clean up res
int count = 0;
for (int i = 0; i < res.length; i++) {
if (res[i] != null)
++count;
}
CFCluster[] cleaned = new CFCluster[count];
count = 0;
for (int i = 0; i < res.length; i++) {
if (res[i] != null)
cleaned[count++] = res[i];
}
return new Clustering(cleaned);
}