public void evaluateClustering()

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));
  }