in samoa-api/src/main/java/org/apache/samoa/evaluation/measures/StatisticalCollection.java [45:116]
public void evaluateClustering(Clustering clustering, Clustering trueClustering, ArrayList<DataPoint> points)
throws Exception {
MembershipMatrix mm = new MembershipMatrix(clustering, points);
int numClasses = mm.getNumClasses();
int numCluster = clustering.size() + 1;
int n = mm.getTotalEntries();
double dongenMaxFC = 0;
double dongenMaxSumFC = 0;
for (int i = 0; i < numCluster; i++) {
double max = 0;
for (int j = 0; j < numClasses; j++) {
if (mm.getClusterClassWeight(i, j) > max)
max = mm.getClusterClassWeight(i, j);
}
dongenMaxFC += max;
if (mm.getClusterSum(i) > dongenMaxSumFC)
dongenMaxSumFC = mm.getClusterSum(i);
}
double dongenMaxHC = 0;
double dongenMaxSumHC = 0;
for (int j = 0; j < numClasses; j++) {
double max = 0;
for (int i = 0; i < numCluster; i++) {
if (mm.getClusterClassWeight(i, j) > max)
max = mm.getClusterClassWeight(i, j);
}
dongenMaxHC += max;
if (mm.getClassSum(j) > dongenMaxSumHC)
dongenMaxSumHC = mm.getClassSum(j);
}
double dongen = (dongenMaxFC + dongenMaxHC) / (2 * n);
// normalized dongen
// double dongen = 1-(2*n - dongenMaxFC - dongenMaxHC)/(2*n - dongenMaxSumFC
// - dongenMaxSumHC);
if (debug)
System.out.println("Dongen HC:" + dongenMaxHC + " FC:" + dongenMaxFC + " Total:" + dongen + " n " + n);
addValue("van Dongen", dongen);
// Rand index
// http://www.cais.ntu.edu.sg/~qihe/menu4.html
double m1 = 0;
for (int j = 0; j < numClasses; j++) {
double v = mm.getClassSum(j);
m1 += v * (v - 1) / 2.0;
}
double m2 = 0;
for (int i = 0; i < numCluster; i++) {
double v = mm.getClusterSum(i);
m2 += v * (v - 1) / 2.0;
}
double m = 0;
for (int i = 0; i < numCluster; i++) {
for (int j = 0; j < numClasses; j++) {
double v = mm.getClusterClassWeight(i, j);
m += v * (v - 1) / 2.0;
}
}
double M = n * (n - 1) / 2.0;
double rand = (M - m1 - m2 + 2 * m) / M;
// normalized rand
// double rand = (m - m1*m2/M)/(m1/2.0 + m2/2.0 - m1*m2/M);
addValue("Rand statistic", rand);
// addValue("C Index",cindex(clustering, points));
}