in samoa-api/src/main/java/org/apache/samoa/moa/clusterers/ClusterGenerator.java [275:322]
private Clustering joinClusters(Clustering clustering) {
double radiusFactor = joinClustersOption.getValue();
boolean[] merged = new boolean[clustering.size()];
Clustering mclustering = new Clustering();
if (radiusFactor > 0) {
for (int c1 = 0; c1 < clustering.size(); c1++) {
SphereCluster sc1 = (SphereCluster) clustering.get(c1);
double minDist = Double.MAX_VALUE;
int maxIndexCon = -1;
for (int c2 = 0; c2 < clustering.size(); c2++) {
SphereCluster sc2 = (SphereCluster) clustering.get(c2);
// double over = sc1.overlapRadiusDegree(sc2);
// if(over > 0 && over < minOver){
// minOver = over;
// maxindexOver = c2;
// }
double dist = sc1.getHullDistance(sc2);
double threshold = Math.min(sc1.getRadius(), sc2.getRadius()) * radiusFactor;
if (dist > 0 && dist < minDist && dist < threshold) {
minDist = dist;
maxIndexCon = c2;
}
}
int maxindex;
maxindex = maxIndexCon;
if (maxindex != -1 && !merged[c1]) {
merged[c1] = true;
merged[maxindex] = true;
SphereCluster scnew = new SphereCluster(sc1.getCenter(), sc1.getRadius(), sc1.getWeight());
SphereCluster sc2 = (SphereCluster) clustering.get(maxindex);
scnew.merge(sc2);
mclustering.add(scnew);
}
}
}
for (int i = 0; i < merged.length; i++) {
if (!merged[i])
mclustering.add(clustering.get(i));
}
return mclustering;
}