@Override public Cluster performWeightedClustering(double[][] distances, String[] clusterNames, double[] weights, LinkageStrategy linkageStrategy) { return performClustering(distances, clusterNames, linkageStrategy); }
@Override public List<Cluster> performFlatClustering(double[][] distances, String[] clusterNames, LinkageStrategy linkageStrategy, Double threshold) { /* Argument checks */ if (distances == null || distances.length == 0) { throw new IllegalArgumentException("Invalid distance matrix"); } if (distances[0].length != clusterNames.length * (clusterNames.length - 1) / 2) { throw new IllegalArgumentException("Invalid cluster name array"); } if (linkageStrategy == null) { throw new IllegalArgumentException("Undefined linkage strategy"); } /* Setup model */ List<Cluster> clusters = createClusters(clusterNames); DistanceMap linkages = createLinkages(distances, clusters); /* Process */ HierarchyBuilder builder = new HierarchyBuilder(clusters, linkages); return builder.flatAgg(linkageStrategy, threshold); }
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; }
@Override public List<Cluster> performFlatClustering(double[][] distances, String[] clusterNames, LinkageStrategy linkageStrategy, Double threshold) { /* Argument checks */ if (distances == null || distances.length == 0) { throw new IllegalArgumentException("Invalid distance matrix"); } if (distances[0].length != clusterNames.length * (clusterNames.length - 1) / 2) { throw new IllegalArgumentException("Invalid cluster name array"); } if (linkageStrategy == null) { throw new IllegalArgumentException("Undefined linkage strategy"); } /* Setup model */ List<Cluster> clusters = createClusters(clusterNames); DistanceMap linkages = createLinkages(distances, clusters); /* Process */ HierarchyBuilder builder = new HierarchyBuilder(clusters, linkages); return builder.flatAgg(linkageStrategy, threshold); }
private DistanceMap createLinkages(double[][] distances, List<Cluster> clusters) { DistanceMap linkages = new DistanceMap(); 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(); Double d = distances[0][accessFunction(row, col, clusters.size())]; link.setLinkageDistance(d); link.setlCluster(cluster_col); link.setrCluster(clusters.get(row)); linkages.add(link); } } return linkages; }
@Override public Cluster performClustering(double[][] distances, String[] clusterNames, LinkageStrategy linkageStrategy) { /* Argument checks */ if (distances == null || distances.length == 0) { throw new IllegalArgumentException("Invalid distance matrix"); } if (distances[0].length != clusterNames.length * (clusterNames.length - 1) / 2) { throw new IllegalArgumentException("Invalid cluster name array"); } if (linkageStrategy == null) { throw new IllegalArgumentException("Undefined linkage strategy"); } /* Setup model */ List<Cluster> clusters = createClusters(clusterNames); DistanceMap linkages = createLinkages(distances, clusters); /* Process */ HierarchyBuilder builder = new HierarchyBuilder(clusters, linkages); while (!builder.isTreeComplete()) { builder.agglomerate(linkageStrategy); } return builder.getRootCluster(); }
private DistanceMap createLinkages(double[][] distances, List<Cluster> clusters) { DistanceMap linkages = new DistanceMap(); 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(); Double d = distances[0][accessFunction(row, col, clusters.size())]; link.setLinkageDistance(d); link.setlCluster(cluster_col); link.setrCluster(clusters.get(row)); linkages.add(link); } } return linkages; }
@Override public Cluster performWeightedClustering(double[][] distances, String[] clusterNames, double[] weights, LinkageStrategy linkageStrategy) { return performClustering(distances, clusterNames, linkageStrategy); }
@Override public <T> Cluster<T> performClustering(double[][] distances, T[] clusterNames, LinkageStrategy linkageStrategy) { /* Argument checks */ if (distances == null || distances.length == 0) { throw new IllegalArgumentException("Invalid distance matrix"); } if (distances[0].length != clusterNames.length * (clusterNames.length - 1) / 2) { throw new IllegalArgumentException("Invalid cluster name array"); } if (linkageStrategy == null) { throw new IllegalArgumentException("Undefined linkage strategy"); } /* Setup model */ List<Cluster<T>> clusters = createClusters(clusterNames); LinkedList<ClusterPair> linkages = createLinkages(distances, clusters); /* Process */ HierarchyBuilder builder = new HierarchyBuilder(clusters, linkages); while (!builder.isTreeComplete()) { builder.agglomerate(linkageStrategy); } return builder.getRootCluster(); }
@Override public Cluster performClustering(double[][] distances, String[] clusterNames, LinkageStrategy linkageStrategy) { /* Argument checks */ if (distances == null || distances.length == 0) { throw new IllegalArgumentException("Invalid distance matrix"); } if (distances[0].length != clusterNames.length * (clusterNames.length - 1) / 2) { throw new IllegalArgumentException("Invalid cluster name array"); } if (linkageStrategy == null) { throw new IllegalArgumentException("Undefined linkage strategy"); } /* Setup model */ List<Cluster> clusters = createClusters(clusterNames); DistanceMap linkages = createLinkages(distances, clusters); /* Process */ HierarchyBuilder builder = new HierarchyBuilder(clusters, linkages); while (!builder.isTreeComplete()) { builder.agglomerate(linkageStrategy); } return builder.getRootCluster(); }