Skip to content
Snippets Groups Projects
Commit 4ca264ed authored by Alexandre's avatar Alexandre
Browse files

Add CalinskiHarabazIndex

parent 29613bb8
No related branches found
No related tags found
No related merge requests found
package fr.irit.smac.amas4dc.cluster;
import fr.irit.smac.amas4dc.amas.MASSettings;
import java.util.List;
public class CalinskiHarabazIndex<T extends DataPoint> {
public double compute(MASSettings<T> masSettings, List<ExtendedCluster<T>> clusters) {
var ssb = computeBetweenClusterVariance(clusters, masSettings);
var ssw = computeWithinClusterVariance(clusters, masSettings);
if (ssw == 0) {
// Avoid division by zero
return Double.POSITIVE_INFINITY;
}
return ssb / ssw;
}
private double computeBetweenClusterVariance(List<ExtendedCluster<T>> clusters, MASSettings<T> masSettings) {
var centroid = computeGlobalCentroid(clusters, masSettings);
var ssb = 0.0;
for (var cluster : clusters) {
var centroidDist = 1.0/masSettings.similarityScoreMethod().apply(cluster.getRepresentative(), centroid);
ssb += centroidDist * centroidDist * cluster.getContent().size();
}
return ssb;
}
private double computeWithinClusterVariance(List<ExtendedCluster<T>> clusters, MASSettings<T> masSettings) {
var ssw = 0.0;
for (var cluster : clusters) {
var clusterCentroid = cluster.getRepresentative();
var clusterSumDist = 0.0;
for (var point : cluster.getContent()) {
var dist = 1.0/masSettings.similarityScoreMethod().apply(point, clusterCentroid);
clusterSumDist += dist * dist;
}
ssw += clusterSumDist;
}
return ssw;
}
private T computeGlobalCentroid(List<ExtendedCluster<T>> clusters, MASSettings<T> masSettings) {
var fused = clusters.get(0).getRepresentative();
for (int i = 1; i < clusters.size(); i++) {
fused = masSettings.dataPointFuser().apply(fused, clusters.get(i).getRepresentative());
}
return fused;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment