public Dendrogram cluster() { Dendrogram dnd = new Dendrogram("Distance"); double d = 0.0; // initially load all elements as individual clusters for (DataPoint e : elements) { Cluster c = new Cluster(e); allClusters.add(c); } dnd.addLevel(String.valueOf(d), allClusters.getAllClusters()); d = 1.0; while (allClusters.size() > 1) { int K = allClusters.size(); mergeClusters(d); // it is possible that there were no clusters to merge for current // d. if (K > allClusters.size()) { dnd.addLevel(String.valueOf(d), allClusters.getAllClusters()); K = allClusters.size(); } d = d + 0.5; } return dnd; }
/** * Implements the core algorithm. * * @return */ protected Dendrogram getClusteringDendrogram() { // 1. inizializza la matrice di prossimità con un cluster per ogni documento ProximityMatrix m = this.initMatrix(); Dendrogram dendrogram = this.initDendrogram(); for (int i = 0; i < m.getClustersCount() - 1; i++) { // 2. cerca la coppia di cluster più vicini (single link - distanza punti più vicini) ICluster[] nearestClusters = m.getNearestClusters(); // TODO DEBUG float dist = m.getClustersDistance(nearestClusters[0], nearestClusters[1]); int c1Index = m.getClusterIndex(nearestClusters[0]), c2Index = m.getClusterIndex(nearestClusters[1]); // 3. merge dei cluster trovati ICluster mergedCluster = this.mergeCluster(m, nearestClusters[0], nearestClusters[1]); System.out.println("\n\n" + m); System.out.println( "\n\nMerging clusters (distance = " + dist + "):\n" + nearestClusters[0] + "\n" + nearestClusters[1] /* + "\nto:\n" + mergedCluster*/); System.out.println("Indexes: " + c1Index + " " + c2Index); dendrogram.add(mergedCluster, nearestClusters[0], nearestClusters[1]); // 4. procede dal punto 2 per (n-1) iterazioni (altezza dendogramma pari a n = numero di // documenti) } return dendrogram; }
public static void main(String[] args) { // Define data DataPoint[] elements = new DataPoint[5]; elements[0] = new DataPoint("A", new double[] {}); elements[1] = new DataPoint("B", new double[] {}); elements[2] = new DataPoint("C", new double[] {}); elements[3] = new DataPoint("D", new double[] {}); elements[4] = new DataPoint("E", new double[] {}); double[][] a = new double[][] { {0, 1, 2, 2, 3}, {1, 0, 2, 4, 3}, {2, 2, 0, 1, 5}, {2, 4, 1, 0, 3}, {3, 3, 5, 3, 0} }; AverageLinkAlgorithm ca = new AverageLinkAlgorithm(elements, a); Dendrogram dnd = ca.cluster(); dnd.printAll(); }