@Override public void merge(int i, int j) { float nij = n[i] + n[j]; for (int k = 0; k < i; k++) { proximity[index(i, k)] = (d(i, k) * (n[i] + n[k]) + d(j, k) * (n[j] + n[k]) - d(j, i) * n[k]) / (nij + n[k]); } for (int k = i+1; k < j; k++) { proximity[index(k, i)] = (d(k, i) * (n[i] + n[k]) + d(j, k) * (n[j] + n[k]) - d(j, i) * n[k]) / (nij + n[k]); } for (int k = j+1; k < size; k++) { proximity[index(k, i)] = (d(k, i) * (n[i] + n[k]) + d(k, j) * (n[j] + n[k]) - d(j, i) * n[k]) / (nij + n[k]); } n[i] += n[j]; } }
/** * Constructor. * @param proximity the proximity matrix to store the distance measure of * dissimilarity. To save space, we only need the lower half of matrix. */ public WardLinkage(double[][] proximity) { init(proximity); n = new int[proximity.length]; for (int i = 0; i < n.length; i++) { n[i] = 1; } for (int i = 0; i < this.proximity.length; i++) { this.proximity[i] *= this.proximity[i]; } }
Linkage linkage = new WardLinkage(proximity); HierarchicalClustering hc = new HierarchicalClustering(linkage);
switch (linkageType) { case WARD: link = new WardLinkage(proximity); break; case COMPLETE: