in samoa-api/src/main/java/org/apache/samoa/streams/clustering/RandomRBFGeneratorEvents.java [750:807]
private String mergeKernels(int steps) {
if (numActiveKernels > 1 && ((mergeClusterA == null && mergeClusterB == null))) {
// choose clusters to merge
double diseredDist = steps / speedOption.getValue() * maxDistanceMoveThresholdByStep;
double minDist = Double.MAX_VALUE;
// System.out.println("DisredDist:"+(2*diseredDist));
for (int i = 0; i < kernels.size(); i++) {
for (int j = 0; j < i; j++) {
if (kernels.get(i).kill == -1 && kernels.get(j).kill == -1) {
double kernelDist = kernels.get(i).generator.getCenterDistance(kernels.get(j).generator);
double d = kernelDist - 2 * diseredDist;
// System.out.println("Dist:"+i+" / "+j+" "+d);
if (Math.abs(d) < minDist &&
(minDist != Double.MAX_VALUE || d > 0 || Math.abs(d) < 0.001)) {
minDist = Math.abs(d);
mergeClusterA = kernels.get(i);
mergeClusterB = kernels.get(j);
}
}
}
}
if (mergeClusterA != null && mergeClusterB != null) {
double[] merge_point = mergeClusterA.generator.getCenter();
double[] v = mergeClusterA.generator.getDistanceVector(mergeClusterB.generator);
for (int i = 0; i < v.length; i++) {
merge_point[i] = merge_point[i] + v[i] * 0.5;
}
mergeClusterA.merging = true;
mergeClusterB.merging = true;
mergeClusterA.setDesitnation(merge_point);
mergeClusterB.setDesitnation(merge_point);
if (debug) {
System.out.println("Center1" + Arrays.toString(mergeClusterA.generator.getCenter()));
System.out.println("Center2" + Arrays.toString(mergeClusterB.generator.getCenter()));
System.out.println("Vector" + Arrays.toString(v));
System.out.println("Try to merge cluster " + mergeClusterA.generator.getId() +
" into " + mergeClusterB.generator.getId() +
" at " + Arrays.toString(merge_point) +
" time " + numGeneratedInstances);
}
return "Init merge";
}
}
if (mergeClusterA != null && mergeClusterB != null) {
// movekernels will move the kernels close to each other,
// we just need to check and merge here if they are close enough
return mergeClusterA.tryMerging(mergeClusterB);
}
return "";
}