Hi all,
    The "EmptyClusterStrategy" in KMeansPlusPlusClusterer can be reused 
MiniBatchKMeansClusterer and other cluster altorithm.
    So I think the "EmptyClusterStrategy" should move out from 
KMeansPlusPlusClusterer(JIRA issue #MATH-1525).
    I am not sure if my design is good or not. I think here should be a 
interface:

Solution 1: Explicit indicate the usage by class name and function name.
```java
@FunctionalInterface
public interface ClusterBreeder {
    <T extends Clusterable> T newCenterPoint((final 
Collection<CentroidCluster<T extends Clusterable>> clusters);
}
...
// Implementations
public LargestVarianceClusterPointBreeder implements ClusterBreeder{...}
public MostPopularClusterPointBreeder implements ClusterBreeder{...}
public FarthestPointBreeder implements ClusterBreeder{...}
...
// Usage
// KMeansPlusPlusClusterer.java
public class KMeansPlusPlusClusterer<T extends Clusterable> extends 
Clusterer<T> {
    ...
    private final ClusterBreeder clusterBreeder;
    public KMeansPlusPlusClusterer(final int k, final int maxIterations,
                               final DistanceMeasure measure,
                               final UniformRandomProvider random,
                               final ClusterBreeder clusterBreeder) {
        ...
        this.clusterBreeder=clusterBreeder;
    }
    ...
    public List<CentroidCluster<T>> cluster(final Collection<T> points) {
        ...
            if (cluster.getPoints().isEmpty()) {
                if (clusterBreeder == null) {
                    throw new 
ConvergenceException(LocalizedFormats.EMPTY_CLUSTER_IN_K_MEANS);
                } else {
                    newCenter = clusterBreeder.newCenterPoint(clusters);
                }
            }
        ...
    }
}
```

Solution2: Declare a more generic interface:
```java
@FunctionalInterface
public interface ClustersPointFinder {
    <T extends Clusterable> T find((final Collection<CentroidCluster<T extends 
Clusterable>> clusters);
}

...
// Implementations
public LargestVarianceClusterPointFinder implements ClustersPointFinder {...}
public MostPopularClusterPointFinder implements ClustersPointFinder {...}
public FarthestPointFinder implements ClustersPointFinder {...}
```

Thanks,
-CT

Reply via email to