summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/algorithm/clustering/kmeans/KMedoidsEM.java
diff options
context:
space:
mode:
authorAndrej Shadura <andrewsh@debian.org>2019-03-09 22:30:40 +0000
committerAndrej Shadura <andrewsh@debian.org>2019-03-09 22:30:40 +0000
commit337087b668d3a54f3afee3a9adb597a32e9f7e94 (patch)
treed860094269622472f8079d497ac7af02dbb4e038 /src/de/lmu/ifi/dbs/elki/algorithm/clustering/kmeans/KMedoidsEM.java
parent14a486343aef55f97f54082d6b542dedebf6f3ba (diff)
Import Upstream version 0.6.5~20141030
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/algorithm/clustering/kmeans/KMedoidsEM.java')
-rw-r--r--src/de/lmu/ifi/dbs/elki/algorithm/clustering/kmeans/KMedoidsEM.java40
1 files changed, 17 insertions, 23 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/algorithm/clustering/kmeans/KMedoidsEM.java b/src/de/lmu/ifi/dbs/elki/algorithm/clustering/kmeans/KMedoidsEM.java
index 41cca225..d2f98466 100644
--- a/src/de/lmu/ifi/dbs/elki/algorithm/clustering/kmeans/KMedoidsEM.java
+++ b/src/de/lmu/ifi/dbs/elki/algorithm/clustering/kmeans/KMedoidsEM.java
@@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.algorithm.clustering.kmeans;
This file is part of ELKI:
Environment for Developing KDD-Applications Supported by Index-Structures
- Copyright (C) 2013
+ Copyright (C) 2014
Ludwig-Maximilians-Universität München
Lehr- und Forschungseinheit für Datenbanksysteme
ELKI Development Team
@@ -27,8 +27,9 @@ import java.util.ArrayList;
import java.util.List;
import de.lmu.ifi.dbs.elki.algorithm.AbstractDistanceBasedAlgorithm;
-import de.lmu.ifi.dbs.elki.algorithm.AbstractPrimitiveDistanceBasedAlgorithm;
import de.lmu.ifi.dbs.elki.algorithm.clustering.ClusteringAlgorithm;
+import de.lmu.ifi.dbs.elki.algorithm.clustering.kmeans.initialization.FarthestPointsInitialMeans;
+import de.lmu.ifi.dbs.elki.algorithm.clustering.kmeans.initialization.KMedoidsInitialization;
import de.lmu.ifi.dbs.elki.data.Cluster;
import de.lmu.ifi.dbs.elki.data.Clustering;
import de.lmu.ifi.dbs.elki.data.model.MedoidModel;
@@ -43,8 +44,7 @@ import de.lmu.ifi.dbs.elki.database.ids.DBIDUtil;
import de.lmu.ifi.dbs.elki.database.ids.ModifiableDBIDs;
import de.lmu.ifi.dbs.elki.database.query.distance.DistanceQuery;
import de.lmu.ifi.dbs.elki.database.relation.Relation;
-import de.lmu.ifi.dbs.elki.distance.distancefunction.PrimitiveDistanceFunction;
-import de.lmu.ifi.dbs.elki.distance.distancevalue.NumberDistance;
+import de.lmu.ifi.dbs.elki.distance.distancefunction.DistanceFunction;
import de.lmu.ifi.dbs.elki.logging.Logging;
import de.lmu.ifi.dbs.elki.logging.progress.IndefiniteProgress;
import de.lmu.ifi.dbs.elki.math.Mean;
@@ -54,8 +54,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.IntParameter;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ObjectParameter;
/**
- * Provides the k-medoids clustering algorithm, using a "bulk" variation of the
- * "Partitioning Around Medoids" approach.
+ * A k-medoids clustering algorithm, implemented as EM-style bulk algorithm.
*
* In contrast to PAM, which will in each iteration update one medoid with one
* (arbitrary) non-medoid, this implementation follows the EM pattern. In the
@@ -72,9 +71,8 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ObjectParameter;
* @apiviz.composedOf KMedoidsInitialization
*
* @param <V> vector datatype
- * @param <D> distance value type
*/
-public class KMedoidsEM<V, D extends NumberDistance<D, ?>> extends AbstractDistanceBasedAlgorithm<V, D, Clustering<MedoidModel>> implements ClusteringAlgorithm<Clustering<MedoidModel>> {
+public class KMedoidsEM<V> extends AbstractDistanceBasedAlgorithm<V, Clustering<MedoidModel>> implements ClusteringAlgorithm<Clustering<MedoidModel>> {
/**
* The logger for this class.
*/
@@ -103,7 +101,7 @@ public class KMedoidsEM<V, D extends NumberDistance<D, ?>> extends AbstractDista
* @param maxiter Maxiter parameter
* @param initializer Function to generate the initial means
*/
- public KMedoidsEM(PrimitiveDistanceFunction<? super V, D> distanceFunction, int k, int maxiter, KMedoidsInitialization<V> initializer) {
+ public KMedoidsEM(DistanceFunction<? super V> distanceFunction, int k, int maxiter, KMedoidsInitialization<V> initializer) {
super(distanceFunction);
this.k = k;
this.maxiter = maxiter;
@@ -121,9 +119,9 @@ public class KMedoidsEM<V, D extends NumberDistance<D, ?>> extends AbstractDista
if(relation.size() <= 0) {
return new Clustering<>("k-Medoids Clustering", "kmedoids-clustering");
}
- DistanceQuery<V, D> distQ = database.getDistanceQuery(relation, getDistanceFunction());
+ DistanceQuery<V> distQ = database.getDistanceQuery(relation, getDistanceFunction());
// Choose initial medoids
- ArrayModifiableDBIDs medoids = DBIDUtil.newArray(initializer.chooseInitialMedoids(k, distQ));
+ ArrayModifiableDBIDs medoids = DBIDUtil.newArray(initializer.chooseInitialMedoids(k, relation.getDBIDs(), distQ));
// Setup cluster assignment store
List<ModifiableDBIDs> clusters = new ArrayList<>();
for(int i = 0; i < k; i++) {
@@ -139,9 +137,7 @@ public class KMedoidsEM<V, D extends NumberDistance<D, ?>> extends AbstractDista
// Swap phase
boolean changed = true;
while(changed) {
- if(prog != null) {
- prog.incrementProcessed(LOG);
- }
+ LOG.incrementProcessed(prog);
changed = false;
// Try to swap the medoid with a better cluster member:
int i = 0;
@@ -154,7 +150,7 @@ public class KMedoidsEM<V, D extends NumberDistance<D, ?>> extends AbstractDista
}
Mean mdist = new Mean();
for(DBIDIter iter2 = clusters.get(i).iter(); iter2.valid(); iter2.advance()) {
- mdist.put(distQ.distance(iter, iter2).doubleValue());
+ mdist.put(distQ.distance(iter, iter2));
}
if(mdist.getMean() < bestm.getMean()) {
best = DBIDUtil.deref(iter);
@@ -172,9 +168,7 @@ public class KMedoidsEM<V, D extends NumberDistance<D, ?>> extends AbstractDista
assignToNearestCluster(medoids, mdists, clusters, distQ);
}
}
- if(prog != null) {
- prog.setCompleted(LOG);
- }
+ LOG.setCompleted(prog);
// Wrap result
Clustering<MedoidModel> result = new Clustering<>("k-Medoids Clustering", "kmedoids-clustering");
@@ -195,7 +189,7 @@ public class KMedoidsEM<V, D extends NumberDistance<D, ?>> extends AbstractDista
* @param distQ distance query
* @return true when the object was reassigned
*/
- protected boolean assignToNearestCluster(ArrayDBIDs means, Mean[] mdist, List<? extends ModifiableDBIDs> clusters, DistanceQuery<V, D> distQ) {
+ protected boolean assignToNearestCluster(ArrayDBIDs means, Mean[] mdist, List<? extends ModifiableDBIDs> clusters, DistanceQuery<V> distQ) {
boolean changed = false;
double[] dists = new double[k];
@@ -205,7 +199,7 @@ public class KMedoidsEM<V, D extends NumberDistance<D, ?>> extends AbstractDista
{
int i = 0;
for(DBIDIter miter = means.iter(); miter.valid(); miter.advance(), i++) {
- dists[i] = distQ.distance(iditer, miter).doubleValue();
+ dists[i] = distQ.distance(iditer, miter);
if(dists[i] < mindist) {
minIndex = i;
mindist = dists[i];
@@ -247,7 +241,7 @@ public class KMedoidsEM<V, D extends NumberDistance<D, ?>> extends AbstractDista
*
* @apiviz.exclude
*/
- public static class Parameterizer<V, D extends NumberDistance<D, ?>> extends AbstractPrimitiveDistanceBasedAlgorithm.Parameterizer<V, D> {
+ public static class Parameterizer<V> extends AbstractDistanceBasedAlgorithm.Parameterizer<V> {
protected int k;
protected int maxiter;
@@ -263,7 +257,7 @@ public class KMedoidsEM<V, D extends NumberDistance<D, ?>> extends AbstractDista
k = kP.intValue();
}
- ObjectParameter<KMedoidsInitialization<V>> initialP = new ObjectParameter<>(KMeans.INIT_ID, KMedoidsInitialization.class, PAMInitialMeans.class);
+ ObjectParameter<KMedoidsInitialization<V>> initialP = new ObjectParameter<>(KMeans.INIT_ID, KMedoidsInitialization.class, FarthestPointsInitialMeans.class);
if(config.grab(initialP)) {
initializer = initialP.instantiateClass(config);
}
@@ -276,7 +270,7 @@ public class KMedoidsEM<V, D extends NumberDistance<D, ?>> extends AbstractDista
}
@Override
- protected KMedoidsEM<V, D> makeInstance() {
+ protected KMedoidsEM<V> makeInstance() {
return new KMedoidsEM<>(distanceFunction, k, maxiter, initializer);
}
}