/** * 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; }