Beispiel #1
0
  /**
   * For each pair of clusters, calculate the score of the {@link
   * cc.mallet.cluster.neighbor_evaluator.Neighbor} that would result from merging the two clusters.
   * Choose the merge that obtains the highest score. If no merge improves score, return original
   * Clustering
   *
   * @param clustering
   * @return
   */
  public Clustering improveClustering(Clustering clustering) {
    double bestScore = Double.NEGATIVE_INFINITY;
    int[] toMerge = new int[] {-1, -1};
    for (int i = 0; i < clustering.getNumClusters(); i++) {
      for (int j = i + 1; j < clustering.getNumClusters(); j++) {
        double score = getScore(clustering, i, j);
        if (score > bestScore) {
          bestScore = score;
          toMerge[0] = i;
          toMerge[1] = j;
        }
      }
    }

    converged = (bestScore < stoppingThreshold);

    if (!(converged)) {
      progressLogger.info(
          "Merging "
              + toMerge[0]
              + "("
              + clustering.size(toMerge[0])
              + " nodes) and "
              + toMerge[1]
              + "("
              + clustering.size(toMerge[1])
              + " nodes) ["
              + bestScore
              + "] numClusters="
              + clustering.getNumClusters());
      updateScoreMatrix(clustering, toMerge[0], toMerge[1]);
      clustering = ClusterUtils.mergeClusters(clustering, toMerge[0], toMerge[1]);
    } else {
      progressLogger.info("Converged with score " + bestScore);
    }
    return clustering;
  }