private <T> LinkedList<ClusterPair> createLinkages(double[][] distances, List<Cluster<T>> clusters) { LinkedList<ClusterPair> linkages = new LinkedList<ClusterPair>(); for (int col = 0; col < clusters.size(); col++) { for (int row = col + 1; row < clusters.size(); row++) { ClusterPair link = new ClusterPair(); link.setLinkageDistance(distances[col][row]); link.setlCluster(clusters.get(col)); link.setrCluster(clusters.get(row)); linkages.add(link); } } return linkages; }
/** * @return a new ClusterPair with the two left/right inverted */ public ClusterPair reverse() { return new ClusterPair(getrCluster(), getlCluster(), getLinkageDistance()); }
@Override public int compareTo(Item o) { return pair.compareTo(o.pair); }
/** * Compute some kind of unique ID for a given cluster pair. * @return The ID */ String hashCodePair(ClusterPair link) { return hashCodePair(link.getlCluster(), link.getrCluster()); }
clusters.remove(minDistLink.getrCluster()); clusters.remove(minDistLink.getlCluster()); Cluster oldClusterL = minDistLink.getlCluster(); Cluster oldClusterR = minDistLink.getrCluster(); Cluster newCluster = minDistLink.agglomerate(null); PriorityQueue<ClusterPair> newList = new PriorityQueue(); HashMap<Cluster<T>,ClusterPair> newMap = new HashMap(); ClusterPair link1 = findByClusters(iClust, oldClusterL); ClusterPair link2 = findByClusters(iClust, oldClusterR); ClusterPair newLinkage = new ClusterPair(); newList.add(newLinkage); newMap.put(iClust,newLinkage); newLinkage.setlCluster(iClust); newLinkage.setrCluster(newCluster); Collection<Double> distanceValues = new ArrayList<Double>(); if (link1 != null) { distanceValues.add(link1.getLinkageDistance()); distancesIndex.get(oldClusterL).remove(link1); distancesIndex.get(iClust).remove(link1); distanceValues.add(link2.getLinkageDistance()); distancesIndex.get(oldClusterR).remove(link2); distancesIndex.get(iClust).remove(link2); newLinkage.setLinkageDistance(newDistance); distancesIndex.get(iClust).add(newLinkage);
public ClusterPair getMin() { ClusterPair min = null; PriorityQueue<ClusterPair> minpq = null; for (PriorityQueue<ClusterPair> pq : distancesIndex.values()) { ClusterPair cp = pq.peek(); if (cp != null && (min == null || cp.getLinkageDistance() < min.getLinkageDistance())) { min = cp; minpq = pq; } } minpq.poll(); distancesIndex.get(min.getlCluster()).remove(min); distancesIndex.get(min.getrCluster()).remove(min); return min; }
@Override public int compareTo(ClusterPair o) { int result; if (o == null || o.getLinkageDistance() == null) { result = -1; } else if (getLinkageDistance() == null) { result = 1; } else { result = getLinkageDistance().compareTo(o.getLinkageDistance()); } return result; }
public void agglomerate(LinkageStrategy linkageStrategy) { ClusterPair minDistLink = distances.removeFirst(); if (minDistLink != null) { clusters.remove(minDistLink.getrCluster()); clusters.remove(minDistLink.getlCluster()); Cluster oldClusterL = minDistLink.getlCluster(); Cluster oldClusterR = minDistLink.getrCluster(); Cluster newCluster = minDistLink.agglomerate(null); ClusterPair newLinkage = new ClusterPair(); newLinkage.setlCluster(iClust); newLinkage.setrCluster(newCluster); Collection<Distance> distanceValues = new ArrayList<Distance>(); Double distVal = link1.getLinkageDistance(); Double weightVal = link1.getOtherCluster(iClust).getWeightValue(); distanceValues.add(new Distance(distVal, weightVal)); distances.remove(link1); Double distVal = link2.getLinkageDistance(); Double weightVal = link2.getOtherCluster(iClust).getWeightValue(); distanceValues.add(new Distance(distVal, weightVal)); distances.remove(link2); newLinkage.setLinkageDistance(newDistance.getDistance()); distances.add(newLinkage);
/** * Compute some kind of unique ID for a given cluster pair. * @return The ID */ String hashCodePair(ClusterPair link) { return hashCodePair(link.getlCluster(), link.getrCluster()); }
@Override public int compareTo(ClusterPair o) { int result; if (o == null || o.getLinkageDistance() == null) { result = -1; } else if (getLinkageDistance() == null) { result = 1; } else { result = getLinkageDistance().compareTo(o.getLinkageDistance()); } return result; }
public void agglomerate(LinkageStrategy linkageStrategy) { ClusterPair minDistLink = distances.removeFirst(); if (minDistLink != null) { clusters.remove(minDistLink.getrCluster()); clusters.remove(minDistLink.getlCluster()); Cluster oldClusterL = minDistLink.getlCluster(); Cluster oldClusterR = minDistLink.getrCluster(); Cluster newCluster = minDistLink.agglomerate(null); ClusterPair newLinkage = new ClusterPair(); newLinkage.setlCluster(iClust); newLinkage.setrCluster(newCluster); Collection<Distance> distanceValues = new ArrayList<Distance>(); Double distVal = link1.getLinkageDistance(); Double weightVal = link1.getOtherCluster(iClust).getWeightValue(); distanceValues.add(new Distance(distVal, weightVal)); distances.remove(link1); Double distVal = link2.getLinkageDistance(); Double weightVal = link2.getOtherCluster(iClust).getWeightValue(); distanceValues.add(new Distance(distVal, weightVal)); distances.remove(link2); newLinkage.setLinkageDistance(newDistance.getDistance()); distances.add(newLinkage);
private <T> LinkedList<ClusterPair> createLinkages(double[][] distances, List<Cluster<T>> clusters) { LinkedList<ClusterPair> linkages = new LinkedList<ClusterPair>(); for (int col = 0; col < clusters.size(); col++) { Cluster cluster_col = clusters.get(col); for (int row = col + 1; row < clusters.size(); row++) { ClusterPair link = new ClusterPair(); link.setLinkageDistance(distances[0][accessFunction(row, col, clusters.size())]); link.setlCluster(cluster_col); link.setrCluster(clusters.get(row)); linkages.add(link); } } return linkages; }
/** * @return a new ClusterPair with the two left/right inverted */ public ClusterPair reverse() { return new ClusterPair(getrCluster(), getlCluster(), getLinkageDistance()); }
Cluster<T> left = link.getlCluster(); Cluster<T> right = link.getrCluster();
@Override public int compareTo(ClusterPair o) { int result; if (o == null || o.getLinkageDistance() == null) { result = -1; } else if (getLinkageDistance() == null) { result = 1; } else { result = getLinkageDistance().compareTo(o.getLinkageDistance()); } return result; }
@Override public int compareTo(Item o) { return pair.compareTo(o.pair); }
private DistanceMap createLinkages(double[][] distances, List<Cluster> clusters) { DistanceMap linkages = new DistanceMap(); for (int col = 0; col < clusters.size(); col++) { for (int row = col + 1; row < clusters.size(); row++) { ClusterPair link = new ClusterPair(); Cluster lCluster = clusters.get(col); Cluster rCluster = clusters.get(row); link.setLinkageDistance(distances[col][row]); link.setlCluster(lCluster); link.setrCluster(rCluster); linkages.add(link); } } return linkages; }
/** * Peak into the minimum distance * @return */ public Double minDist() { Item peek = data.peek(); if(peek!=null) return peek.pair.getLinkageDistance(); else return null; }
private DistanceMap createLinkages(double[][] distances, List<Cluster> clusters) { DistanceMap linkages = new DistanceMap(); for (int col = 0; col < clusters.size(); col++) { for (int row = col + 1; row < clusters.size(); row++) { ClusterPair link = new ClusterPair(); Cluster lCluster = clusters.get(col); Cluster rCluster = clusters.get(row); link.setLinkageDistance(distances[col][row]); link.setlCluster(lCluster); link.setrCluster(rCluster); linkages.add(link); } } return linkages; }
/** * Peak into the minimum distance * @return */ public Double minDist() { Item peek = data.peek(); if(peek!=null) return peek.pair.getLinkageDistance(); else return null; }