diff options
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/distance/similarityfunction')
29 files changed, 423 insertions, 434 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/AbstractDBIDSimilarityFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/AbstractDBIDSimilarityFunction.java index 746f719a..b063c3bc 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/AbstractDBIDSimilarityFunction.java +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/AbstractDBIDSimilarityFunction.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; 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 @@ -25,16 +25,13 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; import de.lmu.ifi.dbs.elki.database.ids.DBID; import de.lmu.ifi.dbs.elki.database.relation.Relation; -import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance; /** * Abstract super class for distance functions needing a preprocessor. * * @author Elke Achtert - * - * @param <D> distance type */ -public abstract class AbstractDBIDSimilarityFunction<D extends Distance<D>> extends AbstractPrimitiveSimilarityFunction<DBID, D> implements DBIDSimilarityFunction<D> { +public abstract class AbstractDBIDSimilarityFunction extends AbstractPrimitiveSimilarityFunction<DBID> implements DBIDSimilarityFunction { /** * The database we work on */ diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/AbstractIndexBasedSimilarityFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/AbstractIndexBasedSimilarityFunction.java index 2147bbff..059e5bc4 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/AbstractIndexBasedSimilarityFunction.java +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/AbstractIndexBasedSimilarityFunction.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; 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 @@ -26,7 +26,6 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; import de.lmu.ifi.dbs.elki.data.type.TypeInformation; import de.lmu.ifi.dbs.elki.database.query.similarity.AbstractDBIDSimilarityQuery; import de.lmu.ifi.dbs.elki.database.relation.Relation; -import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance; import de.lmu.ifi.dbs.elki.index.Index; import de.lmu.ifi.dbs.elki.index.IndexFactory; import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; @@ -44,9 +43,8 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ObjectParameter; * * @param <O> object type * @param <I> index type - * @param <D> distance type */ -public abstract class AbstractIndexBasedSimilarityFunction<O, I extends Index, R, D extends Distance<D>> implements IndexBasedSimilarityFunction<O, D> { +public abstract class AbstractIndexBasedSimilarityFunction<O, I extends Index> implements IndexBasedSimilarityFunction<O> { /** * Parameter to specify the preprocessor to be used. * <p> @@ -74,7 +72,7 @@ public abstract class AbstractIndexBasedSimilarityFunction<O, I extends Index, R } @Override - abstract public <T extends O> Instance<T, ?, R, D> instantiate(Relation<T> database); + abstract public <T extends O> Instance<T, ?> instantiate(Relation<T> database); @Override public boolean isSymmetric() { @@ -95,9 +93,8 @@ public abstract class AbstractIndexBasedSimilarityFunction<O, I extends Index, R * * @param <O> Object type * @param <I> Index type - * @param <D> Distance result type */ - abstract public static class Instance<O, I extends Index, R, D extends Distance<D>> extends AbstractDBIDSimilarityQuery<O, D> implements IndexBasedSimilarityFunction.Instance<O, I, D> { + abstract public static class Instance<O, I extends Index> extends AbstractDBIDSimilarityQuery<O> implements IndexBasedSimilarityFunction.Instance<O, I> { /** * Parent index */ diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/AbstractPrimitiveSimilarityFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/AbstractPrimitiveSimilarityFunction.java index 2360f66e..454ecae2 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/AbstractPrimitiveSimilarityFunction.java +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/AbstractPrimitiveSimilarityFunction.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; 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,7 +27,6 @@ import de.lmu.ifi.dbs.elki.data.type.SimpleTypeInformation; import de.lmu.ifi.dbs.elki.database.query.similarity.PrimitiveSimilarityQuery; import de.lmu.ifi.dbs.elki.database.query.similarity.SimilarityQuery; import de.lmu.ifi.dbs.elki.database.relation.Relation; -import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance; /** * Base implementation of a similarity function. @@ -37,9 +36,8 @@ import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance; * @apiviz.excludeSubtypes * * @param <O> object type - * @param <D> distance type */ -public abstract class AbstractPrimitiveSimilarityFunction<O, D extends Distance<D>> implements PrimitiveSimilarityFunction<O, D> { +public abstract class AbstractPrimitiveSimilarityFunction<O> implements PrimitiveSimilarityFunction<O> { /** * Constructor. */ @@ -57,10 +55,10 @@ public abstract class AbstractPrimitiveSimilarityFunction<O, D extends Distance< abstract public SimpleTypeInformation<? super O> getInputTypeRestriction(); @Override - abstract public D similarity(O o1, O o2); + abstract public double similarity(O o1, O o2); @Override - public <T extends O> SimilarityQuery<T, D> instantiate(Relation<T> relation) { + public <T extends O> SimilarityQuery<T> instantiate(Relation<T> relation) { return new PrimitiveSimilarityQuery<>(relation, this); } } diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/AbstractVectorDoubleSimilarityFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/AbstractVectorSimilarityFunction.java index 1f04cc98..bbb141b7 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/AbstractVectorDoubleSimilarityFunction.java +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/AbstractVectorSimilarityFunction.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; 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 @@ -25,26 +25,15 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; import de.lmu.ifi.dbs.elki.data.NumberVector; import de.lmu.ifi.dbs.elki.data.type.SimpleTypeInformation; import de.lmu.ifi.dbs.elki.data.type.TypeUtil; -import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance; /** * Abstract base class for double-valued primitive similarity functions. * * @author Erich Schubert */ -public abstract class AbstractVectorDoubleSimilarityFunction extends AbstractPrimitiveSimilarityFunction<NumberVector<?>, DoubleDistance> implements PrimitiveDoubleSimilarityFunction<NumberVector<?>> { +public abstract class AbstractVectorSimilarityFunction extends AbstractPrimitiveSimilarityFunction<NumberVector> implements PrimitiveSimilarityFunction<NumberVector> { @Override - public DoubleDistance getDistanceFactory() { - return DoubleDistance.FACTORY; - } - - @Override - public DoubleDistance similarity(NumberVector<?> o1, NumberVector<?> o2) { - return new DoubleDistance(doubleSimilarity(o1, o2)); - } - - @Override - public SimpleTypeInformation<? super NumberVector<?>> getInputTypeRestriction() { + public SimpleTypeInformation<? super NumberVector> getInputTypeRestriction() { return TypeUtil.NUMBER_VECTOR_FIELD; } } diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/DBIDSimilarityFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/DBIDSimilarityFunction.java index 7b6eef34..da839bbe 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/DBIDSimilarityFunction.java +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/DBIDSimilarityFunction.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; 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 @@ -24,7 +24,6 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; */ import de.lmu.ifi.dbs.elki.database.ids.DBID; -import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance; /** * Interface DBIDSimilarityFunction describes the requirements of any similarity @@ -34,10 +33,8 @@ import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance; * * @apiviz.landmark * @apiviz.uses DBID oneway - - defined on - * - * @param <D> distance type */ -public interface DBIDSimilarityFunction<D extends Distance<D>> extends SimilarityFunction<DBID, D> { +public interface DBIDSimilarityFunction extends SimilarityFunction<DBID> { /** * Computes the similarity between two given DatabaseObjects according to this * similarity function. @@ -47,5 +44,5 @@ public interface DBIDSimilarityFunction<D extends Distance<D>> extends Similarit * @return the similarity between two given DatabaseObjects according to this * similarity function */ - D similarity(DBID id1, DBID id2); + double similarity(DBID id1, DBID id2); }
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/FractionalSharedNearestNeighborSimilarityFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/FractionalSharedNearestNeighborSimilarityFunction.java index 741ece82..af17ae93 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/FractionalSharedNearestNeighborSimilarityFunction.java +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/FractionalSharedNearestNeighborSimilarityFunction.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; 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 @@ -23,13 +23,11 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; along with this program. If not, see <http://www.gnu.org/licenses/>. */ -import de.lmu.ifi.dbs.elki.database.ids.ArrayDBIDs; import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; import de.lmu.ifi.dbs.elki.database.ids.DBIDRef; import de.lmu.ifi.dbs.elki.database.ids.DBIDUtil; import de.lmu.ifi.dbs.elki.database.ids.DBIDs; import de.lmu.ifi.dbs.elki.database.relation.Relation; -import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance; import de.lmu.ifi.dbs.elki.index.preprocessed.snn.SharedNearestNeighborIndex; import de.lmu.ifi.dbs.elki.index.preprocessed.snn.SharedNearestNeighborPreprocessor; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameterization; @@ -47,7 +45,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameteriz * * @param <O> object type */ -public class FractionalSharedNearestNeighborSimilarityFunction<O> extends AbstractIndexBasedSimilarityFunction<O, SharedNearestNeighborIndex<O>, ArrayDBIDs, DoubleDistance> implements NormalizedSimilarityFunction<O> { +public class FractionalSharedNearestNeighborSimilarityFunction<O> extends AbstractIndexBasedSimilarityFunction<O, SharedNearestNeighborIndex<O>> implements NormalizedSimilarityFunction<O> { /** * Constructor. * @@ -73,7 +71,7 @@ public class FractionalSharedNearestNeighborSimilarityFunction<O> extends Abstra * * @param <T> Object type */ - public static class Instance<T> extends AbstractIndexBasedSimilarityFunction.Instance<T, SharedNearestNeighborIndex<T>, ArrayDBIDs, DoubleDistance> { + public static class Instance<T> extends AbstractIndexBasedSimilarityFunction.Instance<T, SharedNearestNeighborIndex<T>> { /** * Similarity function. */ @@ -118,27 +116,17 @@ public class FractionalSharedNearestNeighborSimilarityFunction<O> extends Abstra } @Override - public DoubleDistance similarity(DBIDRef id1, DBIDRef id2) { + public double similarity(DBIDRef id1, DBIDRef id2) { DBIDs neighbors1 = index.getNearestNeighborSet(id1); DBIDs neighbors2 = index.getNearestNeighborSet(id2); int intersection = countSharedNeighbors(neighbors1, neighbors2); - return new DoubleDistance((double) intersection / index.getNumberOfNeighbors()); + return (double) intersection / index.getNumberOfNeighbors(); } @Override - public SimilarityFunction<? super T, DoubleDistance> getSimilarityFunction() { + public SimilarityFunction<? super T> getSimilarityFunction() { return similarityFunction; } - - @Override - public DoubleDistance getDistanceFactory() { - return DoubleDistance.FACTORY; - } - } - - @Override - public DoubleDistance getDistanceFactory() { - return DoubleDistance.FACTORY; } /** diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/IndexBasedSimilarityFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/IndexBasedSimilarityFunction.java index 33192e38..b5213baf 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/IndexBasedSimilarityFunction.java +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/IndexBasedSimilarityFunction.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; 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 @@ -25,7 +25,6 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; import de.lmu.ifi.dbs.elki.database.query.similarity.SimilarityQuery; import de.lmu.ifi.dbs.elki.database.relation.Relation; -import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance; import de.lmu.ifi.dbs.elki.index.Index; /** @@ -37,9 +36,8 @@ import de.lmu.ifi.dbs.elki.index.Index; * @apiviz.landmark * * @param <O> Object type - * @param <D> Distance type */ -public interface IndexBasedSimilarityFunction<O, D extends Distance<D>> extends SimilarityFunction<O, D> { +public interface IndexBasedSimilarityFunction<O> extends SimilarityFunction<O> { /** * Preprocess the database to get the actual distance function. * @@ -47,7 +45,7 @@ public interface IndexBasedSimilarityFunction<O, D extends Distance<D>> extends * @return Actual distance query. */ @Override - public abstract <T extends O> Instance<T, ?, D> instantiate(Relation<T> database); + public abstract <T extends O> Instance<T, ?> instantiate(Relation<T> database); /** * Instance interface for index/preprocessor based distance functions. @@ -55,9 +53,8 @@ public interface IndexBasedSimilarityFunction<O, D extends Distance<D>> extends * @author Erich Schubert * * @param <T> Object type - * @param <D> Distance type */ - public static interface Instance<T, I extends Index, D extends Distance<D>> extends SimilarityQuery<T, D> { + public static interface Instance<T, I extends Index> extends SimilarityQuery<T> { /** * Get the index used. * diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/InvertedDistanceSimilarityFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/InvertedDistanceSimilarityFunction.java index 9c974f17..f5ea8bad 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/InvertedDistanceSimilarityFunction.java +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/InvertedDistanceSimilarityFunction.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; 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 @@ -24,8 +24,6 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; */ import de.lmu.ifi.dbs.elki.data.type.SimpleTypeInformation; import de.lmu.ifi.dbs.elki.distance.distancefunction.PrimitiveDistanceFunction; -import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance; -import de.lmu.ifi.dbs.elki.distance.distancevalue.NumberDistance; import de.lmu.ifi.dbs.elki.utilities.optionhandling.OptionID; /** @@ -36,7 +34,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.OptionID; * * @param <O> Object type */ -public class InvertedDistanceSimilarityFunction<O> extends AbstractPrimitiveSimilarityFunction<O, DoubleDistance> { +public class InvertedDistanceSimilarityFunction<O> extends AbstractPrimitiveSimilarityFunction<O> { /** * Parameter to specify the similarity function to derive the distance between * database objects from. Must extend @@ -54,12 +52,7 @@ public class InvertedDistanceSimilarityFunction<O> extends AbstractPrimitiveSimi /** * Holds the similarity function. */ - protected PrimitiveDistanceFunction<? super O, ? extends NumberDistance<?, ?>> distanceFunction; - - @Override - public DoubleDistance getDistanceFactory() { - return DoubleDistance.FACTORY; - } + protected PrimitiveDistanceFunction<? super O> distanceFunction; @Override public SimpleTypeInformation<? super O> getInputTypeRestriction() { @@ -67,8 +60,8 @@ public class InvertedDistanceSimilarityFunction<O> extends AbstractPrimitiveSimi } @Override - public DoubleDistance similarity(O o1, O o2) { - double dist = distanceFunction.distance(o1, o2).doubleValue(); - return new DoubleDistance(1. / dist); + public double similarity(O o1, O o2) { + double dist = distanceFunction.distance(o1, o2); + return dist > 0. ? 1. / dist : Double.POSITIVE_INFINITY; } }
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/JaccardPrimitiveSimilarityFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/JaccardPrimitiveSimilarityFunction.java deleted file mode 100644 index 99fa440e..00000000 --- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/JaccardPrimitiveSimilarityFunction.java +++ /dev/null @@ -1,205 +0,0 @@ -package de.lmu.ifi.dbs.elki.distance.similarityfunction; - -/* - This file is part of ELKI: - Environment for Developing KDD-Applications Supported by Index-Structures - - Copyright (C) 2013 - Ludwig-Maximilians-Universität München - Lehr- und Forschungseinheit für Datenbanksysteme - ELKI Development Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. - */ -import de.lmu.ifi.dbs.elki.data.FeatureVector; -import de.lmu.ifi.dbs.elki.data.NumberVector; -import de.lmu.ifi.dbs.elki.data.type.SimpleTypeInformation; -import de.lmu.ifi.dbs.elki.data.type.TypeUtil; -import de.lmu.ifi.dbs.elki.database.query.DistanceSimilarityQuery; -import de.lmu.ifi.dbs.elki.database.query.distance.PrimitiveDistanceSimilarityQuery; -import de.lmu.ifi.dbs.elki.database.relation.Relation; -import de.lmu.ifi.dbs.elki.distance.distancefunction.PrimitiveDoubleDistanceFunction; -import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance; -import de.lmu.ifi.dbs.elki.utilities.documentation.Reference; - -/** - * A flexible extension of Jaccard similarity to non-binary vectors. - * - * Jaccard coefficient is commonly defined as {@code |intersection|/|union|}. - * - * We can extend this definition as follows: - * - * {@code |non-zero and equal attributes|/|non-zero attributes|}. - * - * For binary vectors, this will obviously be the same quantity. However, this - * version is more useful for categorical data. - * - * Reference: - * <p> - * P. Jaccard<br /> - * Étude comparative de la distribution florale dans une portion des Alpes et - * des Jura<br /> - * Bulletin del la Société Vaudoise des Sciences Naturelles - * </p> - * - * TODO: add optimized implementations for binary vectors. - * - * @author Erich Schubert - * - * @param <O> Vector type - */ -@Reference(authors = "P. Jaccard", title = "Étude comparative de la distribution florale dans une portion des Alpes et des Jura", booktitle = "Bulletin del la Société Vaudoise des Sciences Naturelles") -public class JaccardPrimitiveSimilarityFunction<O extends FeatureVector<?>> extends AbstractPrimitiveSimilarityFunction<O, DoubleDistance> implements NormalizedPrimitiveSimilarityFunction<O>, PrimitiveDoubleDistanceFunction<O> { - /** - * Constants for checking null. - */ - private static final Integer INTEGER_NULL = Integer.valueOf(0); - - /** - * Constants for checking null. - */ - private static final Double DOUBLE_NULL = Double.valueOf(0.); - - /** - * Empty string. - */ - private static final String STRING_NULL = ""; - - /** - * Constructor. No parameters. - */ - public JaccardPrimitiveSimilarityFunction() { - super(); - } - - @Override - public double doubleSimilarity(O o1, O o2) { - if(o1 instanceof NumberVector && o2 instanceof NumberVector) { - return doubleSimilarityNumberVector((NumberVector<?>) o1, (NumberVector<?>) o2); - } - final int d1 = o1.getDimensionality(), d2 = o2.getDimensionality(); - int intersection = 0, union = 0; - int d = 0; - for(; d < d1 && d < d2; d++) { - Object v1 = o1.getValue(d), v2 = o2.getValue(d); - final boolean n1 = isNull(v1), n2 = isNull(v2); - if(v1 instanceof Double && Double.isNaN((Double) v1)) { - continue; - } - if(v2 instanceof Double && Double.isNaN((Double) v2)) { - continue; - } - if(!n1 || !n2) { - ++union; - if(!n1 && v1.equals(v2)) { - ++intersection; - } - } - } - for(; d < d1; d++) { - if(!isNull(o1.getValue(d))) { - ++union; - } - } - for(; d < d2; d++) { - if(!isNull(o2.getValue(d))) { - ++union; - } - } - return intersection / (double) union; - } - - /** - * Compute Jaccard similarity for two number vectors. - * - * @param o1 First vector - * @param o2 Second vector - * @return Jaccard similarity - */ - public static double doubleSimilarityNumberVector(NumberVector<?> o1, NumberVector<?> o2) { - final int d1 = o1.getDimensionality(), d2 = o2.getDimensionality(); - int intersection = 0, union = 0; - int d = 0; - for(; d < d1 && d < d2; d++) { - double v1 = o1.doubleValue(d), v2 = o2.doubleValue(d); - if(v1 != v1 || v2 != v2) { // Skip NaNs. - continue; - } - if(v1 != 0. || v2 != 0) { - ++union; - if(v1 == v2) { - ++intersection; - } - } - } - for(; d < d1; d++) { - if(o1.doubleValue(d) != 0) { - ++union; - } - } - for(; d < d2; d++) { - if(o2.doubleValue(d) != 0) { - ++union; - } - } - return intersection / (double) union; - } - - @Override - public DoubleDistance similarity(O o1, O o2) { - return new DoubleDistance(doubleSimilarity(o1, o2)); - } - - /** - * Test a value for null. - * - * TODO: delegate to {@link FeatureVector} instead? - * - * @param val Value - * @return true when null - */ - private static boolean isNull(Object val) { - return (val == null) || STRING_NULL.equals(val) || DOUBLE_NULL.equals(val) || INTEGER_NULL.equals(val); - } - - @Override - public DoubleDistance distance(O o1, O o2) { - return new DoubleDistance(1. - doubleSimilarity(o1, o2)); - } - - @Override - public double doubleDistance(O o1, O o2) { - return 1. - doubleSimilarity(o1, o2); - } - - @Override - public boolean isMetric() { - return true; - } - - @Override - public DoubleDistance getDistanceFactory() { - return DoubleDistance.FACTORY; - } - - @Override - public SimpleTypeInformation<? super O> getInputTypeRestriction() { - return TypeUtil.FEATURE_VECTORS; - } - - @Override - public <T extends O> DistanceSimilarityQuery<T, DoubleDistance> instantiate(Relation<T> relation) { - return new PrimitiveDistanceSimilarityQuery<>(relation, this, this); - } -} diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/Kulczynski1SimilarityFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/Kulczynski1SimilarityFunction.java index d307bec8..b1302e13 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/Kulczynski1SimilarityFunction.java +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/Kulczynski1SimilarityFunction.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; 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 @@ -24,7 +24,7 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; */ import de.lmu.ifi.dbs.elki.data.NumberVector; -import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractVectorDoubleDistanceFunction; +import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractNumberVectorDistanceFunction; import de.lmu.ifi.dbs.elki.utilities.documentation.Reference; import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; @@ -40,7 +40,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; * @author Erich Schubert */ @Reference(authors = "M.-M. Deza and E. Deza", title = "Dictionary of distances", booktitle = "Dictionary of distances") -public class Kulczynski1SimilarityFunction extends AbstractVectorDoubleSimilarityFunction { +public class Kulczynski1SimilarityFunction extends AbstractVectorSimilarityFunction { /** * Static instance. */ @@ -57,8 +57,8 @@ public class Kulczynski1SimilarityFunction extends AbstractVectorDoubleSimilarit } @Override - public double doubleSimilarity(NumberVector<?> v1, NumberVector<?> v2) { - final int dim = AbstractVectorDoubleDistanceFunction.dimensionality(v1, v2); + public double similarity(NumberVector v1, NumberVector v2) { + final int dim = AbstractNumberVectorDistanceFunction.dimensionality(v1, v2); double sumdiff = 0., summin = 0.; for (int i = 0; i < dim; i++) { double xi = v1.doubleValue(i), yi = v2.doubleValue(i); diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/Kulczynski2SimilarityFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/Kulczynski2SimilarityFunction.java index 8c678601..093dce00 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/Kulczynski2SimilarityFunction.java +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/Kulczynski2SimilarityFunction.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; 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 @@ -24,7 +24,7 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; */ import de.lmu.ifi.dbs.elki.data.NumberVector; -import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractVectorDoubleDistanceFunction; +import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractNumberVectorDistanceFunction; import de.lmu.ifi.dbs.elki.utilities.documentation.Reference; import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; @@ -42,7 +42,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; * @author Erich Schubert */ @Reference(authors = "M.-M. Deza and E. Deza", title = "Dictionary of distances", booktitle = "Dictionary of distances") -public class Kulczynski2SimilarityFunction extends AbstractVectorDoubleSimilarityFunction { +public class Kulczynski2SimilarityFunction extends AbstractVectorSimilarityFunction { /** * Static instance. */ @@ -59,8 +59,8 @@ public class Kulczynski2SimilarityFunction extends AbstractVectorDoubleSimilarit } @Override - public double doubleSimilarity(NumberVector<?> v1, NumberVector<?> v2) { - final int dim = AbstractVectorDoubleDistanceFunction.dimensionality(v1, v2); + public double similarity(NumberVector v1, NumberVector v2) { + final int dim = AbstractNumberVectorDistanceFunction.dimensionality(v1, v2); double sumx = 0., sumy = 0., summin = 0.; for (int i = 0; i < dim; i++) { double xi = v1.doubleValue(i), yi = v2.doubleValue(i); diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/NormalizedPrimitiveSimilarityFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/NormalizedPrimitiveSimilarityFunction.java index 83a0edfa..ac0e360b 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/NormalizedPrimitiveSimilarityFunction.java +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/NormalizedPrimitiveSimilarityFunction.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; 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 @@ -31,6 +31,6 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; * * @param <O> Object type */ -public interface NormalizedPrimitiveSimilarityFunction<O> extends PrimitiveDoubleSimilarityFunction<O>, NormalizedSimilarityFunction<O> { +public interface NormalizedPrimitiveSimilarityFunction<O> extends PrimitiveSimilarityFunction<O>, NormalizedSimilarityFunction<O> { // empty marker interface } diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/NormalizedSimilarityFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/NormalizedSimilarityFunction.java index 91e94498..865168cd 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/NormalizedSimilarityFunction.java +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/NormalizedSimilarityFunction.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; 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 @@ -23,7 +23,6 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; along with this program. If not, see <http://www.gnu.org/licenses/>. */ -import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance; /** * Marker interface to signal that the similarity function is normalized to @@ -31,8 +30,7 @@ import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance; * * @author Erich Schubert * @param <O> object type - * */ -public interface NormalizedSimilarityFunction<O> extends SimilarityFunction<O, DoubleDistance> { +public interface NormalizedSimilarityFunction<O> extends SimilarityFunction<O> { // Empty - marker interface. } diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/PrimitiveSimilarityFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/PrimitiveSimilarityFunction.java index 5188e9d9..2550dbef 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/PrimitiveSimilarityFunction.java +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/PrimitiveSimilarityFunction.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; 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 @@ -24,7 +24,6 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; */ import de.lmu.ifi.dbs.elki.data.type.SimpleTypeInformation; -import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance; /** * Interface SimilarityFunction describes the requirements of any similarity @@ -36,9 +35,8 @@ import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance; * @apiviz.excludeSubtypes * * @param <O> object type - * @param <D> distance type */ -public interface PrimitiveSimilarityFunction<O, D extends Distance<?>> extends SimilarityFunction<O, D> { +public interface PrimitiveSimilarityFunction<O> extends SimilarityFunction<O> { /** * Computes the similarity between two given DatabaseObjects according to this * similarity function. @@ -48,7 +46,7 @@ public interface PrimitiveSimilarityFunction<O, D extends Distance<?>> extends S * @return the similarity between two given DatabaseObjects according to this * similarity function */ - D similarity(O o1, O o2); + double similarity(O o1, O o2); @Override abstract public SimpleTypeInformation<? super O> getInputTypeRestriction(); diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/SharedNearestNeighborSimilarityFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/SharedNearestNeighborSimilarityFunction.java index 89661f13..38b43b09 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/SharedNearestNeighborSimilarityFunction.java +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/SharedNearestNeighborSimilarityFunction.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; 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,9 +27,7 @@ import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; import de.lmu.ifi.dbs.elki.database.ids.DBIDRef; import de.lmu.ifi.dbs.elki.database.ids.DBIDUtil; import de.lmu.ifi.dbs.elki.database.ids.DBIDs; -import de.lmu.ifi.dbs.elki.database.ids.SetDBIDs; import de.lmu.ifi.dbs.elki.database.relation.Relation; -import de.lmu.ifi.dbs.elki.distance.distancevalue.IntegerDistance; import de.lmu.ifi.dbs.elki.index.preprocessed.snn.SharedNearestNeighborIndex; import de.lmu.ifi.dbs.elki.index.preprocessed.snn.SharedNearestNeighborPreprocessor; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameterization; @@ -47,8 +45,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameteriz * * @param <O> object type */ -// todo arthur comment class -public class SharedNearestNeighborSimilarityFunction<O> extends AbstractIndexBasedSimilarityFunction<O, SharedNearestNeighborIndex<O>, SetDBIDs, IntegerDistance> { +public class SharedNearestNeighborSimilarityFunction<O> extends AbstractIndexBasedSimilarityFunction<O, SharedNearestNeighborIndex<O>> { /** * Constructor. * @@ -58,11 +55,6 @@ public class SharedNearestNeighborSimilarityFunction<O> extends AbstractIndexBas super(indexFactory); } - @Override - public IntegerDistance getDistanceFactory() { - return IntegerDistance.FACTORY; - } - /** * Compute the intersection size * @@ -74,15 +66,17 @@ public class SharedNearestNeighborSimilarityFunction<O> extends AbstractIndexBas int intersection = 0; DBIDIter iter1 = neighbors1.iter(); DBIDIter iter2 = neighbors2.iter(); - while (iter1.valid() && iter2.valid()) { + while(iter1.valid() && iter2.valid()) { final int comp = DBIDUtil.compare(iter1, iter2); - if (comp == 0) { + if(comp == 0) { intersection++; iter1.advance(); iter2.advance(); - } else if (comp < 0) { + } + else if(comp < 0) { iter1.advance(); - } else // iter2 < iter1 + } + else // iter2 < iter1 { iter2.advance(); } @@ -106,7 +100,7 @@ public class SharedNearestNeighborSimilarityFunction<O> extends AbstractIndexBas * * @param <O> Object type */ - public static class Instance<O> extends AbstractIndexBasedSimilarityFunction.Instance<O, SharedNearestNeighborIndex<O>, SetDBIDs, IntegerDistance> { + public static class Instance<O> extends AbstractIndexBasedSimilarityFunction.Instance<O, SharedNearestNeighborIndex<O>> { /** * Similarity function. */ @@ -124,19 +118,14 @@ public class SharedNearestNeighborSimilarityFunction<O> extends AbstractIndexBas } @Override - public IntegerDistance similarity(DBIDRef id1, DBIDRef id2) { + public double similarity(DBIDRef id1, DBIDRef id2) { DBIDs neighbors1 = index.getNearestNeighborSet(id1); DBIDs neighbors2 = index.getNearestNeighborSet(id2); - return new IntegerDistance(countSharedNeighbors(neighbors1, neighbors2)); - } - - @Override - public IntegerDistance getDistanceFactory() { - return IntegerDistance.FACTORY; + return countSharedNeighbors(neighbors1, neighbors2); } @Override - public SimilarityFunction<? super O, IntegerDistance> getSimilarityFunction() { + public SimilarityFunction<? super O> getSimilarityFunction() { return similarityFunction; } } diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/SimilarityFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/SimilarityFunction.java index 0e3f4ce6..2dc28ff0 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/SimilarityFunction.java +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/SimilarityFunction.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; 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 @@ -26,22 +26,18 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; import de.lmu.ifi.dbs.elki.data.type.TypeInformation; import de.lmu.ifi.dbs.elki.database.query.similarity.SimilarityQuery; import de.lmu.ifi.dbs.elki.database.relation.Relation; -import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance; -import de.lmu.ifi.dbs.elki.utilities.optionhandling.Parameterizable; /** * Interface SimilarityFunction describes the requirements of any similarity * function. * - * @author Elke Achtert + * @author Erich Schubert * * @apiviz.landmark - * @apiviz.has Distance * * @param <O> object type - * @param <D> distance type */ -public interface SimilarityFunction<O, D extends Distance<?>> extends Parameterizable { +public interface SimilarityFunction<O> { /** * Is this function symmetric? * @@ -55,17 +51,10 @@ public interface SimilarityFunction<O, D extends Distance<?>> extends Parameteri TypeInformation getInputTypeRestriction(); /** - * Get a distance factory. - * - * @return distance factory - */ - D getDistanceFactory(); - - /** * Instantiate with a representation to get the actual similarity query. * * @param relation Representation to use * @return Actual distance query. */ - public <T extends O> SimilarityQuery<T, D> instantiate(Relation<T> relation); + public <T extends O> SimilarityQuery<T> instantiate(Relation<T> relation); }
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/cluster/ClusterIntersectionSimilarityFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/cluster/ClusterIntersectionSimilarityFunction.java new file mode 100644 index 00000000..078c7934 --- /dev/null +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/cluster/ClusterIntersectionSimilarityFunction.java @@ -0,0 +1,93 @@ +package de.lmu.ifi.dbs.elki.distance.similarityfunction.cluster;
+
+/*
+ This file is part of ELKI:
+ Environment for Developing KDD-Applications Supported by Index-Structures
+
+ Copyright (C) 2014
+ Ludwig-Maximilians-Universität München
+ Lehr- und Forschungseinheit für Datenbanksysteme
+ ELKI Development Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import de.lmu.ifi.dbs.elki.data.Cluster;
+import de.lmu.ifi.dbs.elki.data.type.SimpleTypeInformation;
+import de.lmu.ifi.dbs.elki.database.ids.DBIDUtil;
+import de.lmu.ifi.dbs.elki.database.query.DistanceSimilarityQuery;
+import de.lmu.ifi.dbs.elki.database.query.distance.PrimitiveDistanceSimilarityQuery;
+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.similarityfunction.AbstractPrimitiveSimilarityFunction;
+import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
+
+/**
+ * Measure the similarity of clusters via the intersection size.
+ *
+ * @author Erich Schubert
+ */
+public class ClusterIntersectionSimilarityFunction extends AbstractPrimitiveSimilarityFunction<Cluster<?>> implements PrimitiveDistanceFunction<Cluster<?>> {
+ /**
+ * Static instance.
+ */
+ public static final ClusterIntersectionSimilarityFunction STATIC = new ClusterIntersectionSimilarityFunction();
+
+ /**
+ * Constructor - use the static instance {@link #STATIC}!
+ */
+ public ClusterIntersectionSimilarityFunction() {
+ super();
+ }
+
+ @Override
+ public double similarity(Cluster<?> o1, Cluster<?> o2) {
+ return DBIDUtil.intersectionSize(o1.getIDs(), o2.getIDs());
+ }
+
+ @Override
+ public double distance(Cluster<?> o1, Cluster<?> o2) {
+ int i = DBIDUtil.intersectionSize(o1.getIDs(), o2.getIDs());
+ return Math.max(o1.size(), o2.size()) - i;
+ }
+
+ @Override
+ public boolean isMetric() {
+ return false;
+ }
+
+ @Override
+ public <T extends Cluster<?>> DistanceSimilarityQuery<T> instantiate(Relation<T> relation) {
+ return new PrimitiveDistanceSimilarityQuery<>(relation, this, this);
+ }
+
+ @Override
+ public SimpleTypeInformation<? super Cluster<?>> getInputTypeRestriction() {
+ return new SimpleTypeInformation<>(Cluster.class);
+ }
+
+ /**
+ * Parameterization class.
+ *
+ * @author Erich Schubert
+ *
+ * @apiviz.exclude
+ */
+ public static class Parameterizer extends AbstractParameterizer {
+ @Override
+ protected ClusterIntersectionSimilarityFunction makeInstance() {
+ return STATIC;
+ }
+ }
+}
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/cluster/ClusterJaccardSimilarityFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/cluster/ClusterJaccardSimilarityFunction.java new file mode 100644 index 00000000..7b25306e --- /dev/null +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/cluster/ClusterJaccardSimilarityFunction.java @@ -0,0 +1,107 @@ +package de.lmu.ifi.dbs.elki.distance.similarityfunction.cluster;
+
+/*
+ This file is part of ELKI:
+ Environment for Developing KDD-Applications Supported by Index-Structures
+
+ Copyright (C) 2014
+ Ludwig-Maximilians-Universität München
+ Lehr- und Forschungseinheit für Datenbanksysteme
+ ELKI Development Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import de.lmu.ifi.dbs.elki.data.Cluster;
+import de.lmu.ifi.dbs.elki.data.type.SimpleTypeInformation;
+import de.lmu.ifi.dbs.elki.database.ids.DBIDUtil;
+import de.lmu.ifi.dbs.elki.database.query.DistanceSimilarityQuery;
+import de.lmu.ifi.dbs.elki.database.query.distance.PrimitiveDistanceSimilarityQuery;
+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.similarityfunction.AbstractPrimitiveSimilarityFunction;
+import de.lmu.ifi.dbs.elki.utilities.documentation.Reference;
+import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
+
+/**
+ * Measure the similarity of clusters via the Jaccard coefficient.
+ *
+ * <p>
+ * P. Jaccard<br />
+ * Distribution de la florine alpine dans la Bassin de Dranses et dans quelques
+ * regiones voisines<br />
+ * Bulletin del la Société Vaudoise des Sciences Naturelles
+ * </p>
+ *
+ * @author Erich Schubert
+ */
+@Reference(authors = "P. Jaccard", //
+title = "Distribution de la florine alpine dans la Bassin de Dranses et dans quelques regiones voisines", //
+booktitle = "Bulletin del la Société Vaudoise des Sciences Naturelles")
+public class ClusterJaccardSimilarityFunction extends AbstractPrimitiveSimilarityFunction<Cluster<?>> implements PrimitiveDistanceFunction<Cluster<?>> {
+ /**
+ * Static instance.
+ */
+ public static final ClusterJaccardSimilarityFunction STATIC = new ClusterJaccardSimilarityFunction();
+
+ /**
+ * Constructor - use the static instance {@link #STATIC}!
+ */
+ public ClusterJaccardSimilarityFunction() {
+ super();
+ }
+
+ @Override
+ public double similarity(Cluster<?> o1, Cluster<?> o2) {
+ int i = DBIDUtil.intersectionSize(o1.getIDs(), o2.getIDs());
+ int union = o1.size() + o2.size() - i;
+ return i / (double) union;
+ }
+
+ @Override
+ public double distance(Cluster<?> o1, Cluster<?> o2) {
+ int i = DBIDUtil.intersectionSize(o1.getIDs(), o2.getIDs());
+ int union = o1.size() + o2.size() - i;
+ return 1. - i / (double) union;
+ }
+
+ @Override
+ public boolean isMetric() {
+ return true;
+ }
+
+ @Override
+ public <T extends Cluster<?>> DistanceSimilarityQuery<T> instantiate(Relation<T> relation) {
+ return new PrimitiveDistanceSimilarityQuery<>(relation, this, this);
+ }
+
+ @Override
+ public SimpleTypeInformation<? super Cluster<?>> getInputTypeRestriction() {
+ return new SimpleTypeInformation<>(Cluster.class);
+ }
+
+ /**
+ * Parameterization class.
+ *
+ * @author Erich Schubert
+ *
+ * @apiviz.exclude
+ */
+ public static class Parameterizer extends AbstractParameterizer {
+ @Override
+ protected ClusterJaccardSimilarityFunction makeInstance() {
+ return STATIC;
+ }
+ }
+}
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/cluster/ClusteringAdjustedRandIndexSimilarityFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/cluster/ClusteringAdjustedRandIndexSimilarityFunction.java new file mode 100644 index 00000000..2b9d19d4 --- /dev/null +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/cluster/ClusteringAdjustedRandIndexSimilarityFunction.java @@ -0,0 +1,96 @@ +package de.lmu.ifi.dbs.elki.distance.similarityfunction.cluster;
+
+/*
+ This file is part of ELKI:
+ Environment for Developing KDD-Applications Supported by Index-Structures
+
+ Copyright (C) 2014
+ Ludwig-Maximilians-Universität München
+ Lehr- und Forschungseinheit für Datenbanksysteme
+ ELKI Development Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import de.lmu.ifi.dbs.elki.data.Clustering;
+import de.lmu.ifi.dbs.elki.data.type.SimpleTypeInformation;
+import de.lmu.ifi.dbs.elki.database.query.DistanceSimilarityQuery;
+import de.lmu.ifi.dbs.elki.database.query.distance.PrimitiveDistanceSimilarityQuery;
+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.similarityfunction.AbstractPrimitiveSimilarityFunction;
+import de.lmu.ifi.dbs.elki.evaluation.clustering.ClusterContingencyTable;
+import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
+
+/**
+ * Measure the similarity of clusters via the Adjusted Rand Index.
+ *
+ * @author Erich Schubert
+ */
+public class ClusteringAdjustedRandIndexSimilarityFunction extends AbstractPrimitiveSimilarityFunction<Clustering<?>> implements PrimitiveDistanceFunction<Clustering<?>> {
+ /**
+ * Static instance.
+ */
+ public static final ClusteringAdjustedRandIndexSimilarityFunction STATIC = new ClusteringAdjustedRandIndexSimilarityFunction();
+
+ /**
+ * Constructor - use the static instance {@link #STATIC}!
+ */
+ public ClusteringAdjustedRandIndexSimilarityFunction() {
+ super();
+ }
+
+ @Override
+ public double similarity(Clustering<?> o1, Clustering<?> o2) {
+ ClusterContingencyTable ct = new ClusterContingencyTable(false, true);
+ ct.process(o1, o2);
+ return ct.getPaircount().adjustedRandIndex();
+ }
+
+ @Override
+ public double distance(Clustering<?> o1, Clustering<?> o2) {
+ ClusterContingencyTable ct = new ClusterContingencyTable(false, true);
+ ct.process(o1, o2);
+ return 1. - ct.getPaircount().adjustedRandIndex();
+ }
+
+ @Override
+ public boolean isMetric() {
+ return false;
+ }
+
+ @Override
+ public <T extends Clustering<?>> DistanceSimilarityQuery<T> instantiate(Relation<T> relation) {
+ return new PrimitiveDistanceSimilarityQuery<>(relation, this, this);
+ }
+
+ @Override
+ public SimpleTypeInformation<? super Clustering<?>> getInputTypeRestriction() {
+ return new SimpleTypeInformation<>(Clustering.class);
+ }
+
+ /**
+ * Parameterization class.
+ *
+ * @author Erich Schubert
+ *
+ * @apiviz.exclude
+ */
+ public static class Parameterizer extends AbstractParameterizer {
+ @Override
+ protected ClusteringAdjustedRandIndexSimilarityFunction makeInstance() {
+ return STATIC;
+ }
+ }
+}
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/PrimitiveDoubleSimilarityFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/cluster/package-info.java index 2d886706..5f6d5e6e 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/PrimitiveDoubleSimilarityFunction.java +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/cluster/package-info.java @@ -1,10 +1,11 @@ -package de.lmu.ifi.dbs.elki.distance.similarityfunction; - +/** + * Similarity measures for comparing clusters. + */ /* 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 @@ -22,28 +23,4 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction; You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ - -import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance; - -/** - * Interface for similarity functions that can provide a raw double value. - * - * This is for use in performance-critical situations that need to avoid the - * boxing/unboxing cost of regular distance API. - * - * @author Erich Schubert - * - * @param <O> Object type - */ -public interface PrimitiveDoubleSimilarityFunction<O> extends PrimitiveSimilarityFunction<O, DoubleDistance> { - /** - * Computes the similarity between two given Objects according to this - * similarity function. - * - * @param o1 first Object - * @param o2 second Object - * @return the similarity between two given Objects according to this - * similarity function - */ - double doubleSimilarity(O o1, O o2); -} +package de.lmu.ifi.dbs.elki.distance.similarityfunction.cluster;
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/KernelMatrix.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/KernelMatrix.java index 39fb97a5..7acd784b 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/KernelMatrix.java +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/KernelMatrix.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction.kernel; 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 @@ -34,14 +34,12 @@ import de.lmu.ifi.dbs.elki.database.ids.DBIDUtil; import de.lmu.ifi.dbs.elki.database.ids.DBIDs; import de.lmu.ifi.dbs.elki.database.query.similarity.SimilarityQuery; import de.lmu.ifi.dbs.elki.database.relation.Relation; -import de.lmu.ifi.dbs.elki.distance.distancevalue.NumberDistance; import de.lmu.ifi.dbs.elki.distance.similarityfunction.PrimitiveSimilarityFunction; import de.lmu.ifi.dbs.elki.logging.LoggingUtil; import de.lmu.ifi.dbs.elki.math.linearalgebra.Matrix; /** - * Provides a class for storing the kernel matrix and several extraction methods - * for convenience. + * Kernel matrix representation. * * @author Simon Paradies * @@ -141,8 +139,7 @@ public class KernelMatrix { * @param relation the database that holds the objects * @param ids the IDs of those objects for which the kernel matrix is computed */ - public <O, D extends NumberDistance<?, ?>> KernelMatrix(PrimitiveSimilarityFunction<? super O, D> kernelFunction, final Relation<? extends O> relation, final DBIDs ids) { - LoggingUtil.logExpensive(Level.FINER, "Computing kernel matrix"); + public <O> KernelMatrix(PrimitiveSimilarityFunction<? super O> kernelFunction, final Relation<? extends O> relation, final DBIDs ids) { this.kernel = new Matrix(ids.size(), ids.size()); if(ids instanceof DBIDRange) { this.idmap = new RangeMap((DBIDRange) ids); @@ -155,7 +152,7 @@ public class KernelMatrix { for(i1.seek(0); i1.valid(); i1.advance()) { O o1 = relation.get(i1); for(i2.seek(i1.getOffset()); i2.valid(); i2.advance()) { - double value = kernelFunction.similarity(o1, relation.get(i2)).doubleValue(); + double value = kernelFunction.similarity(o1, relation.get(i2)); kernel.set(i1.getOffset(), i2.getOffset(), value); kernel.set(i2.getOffset(), i1.getOffset(), value); } @@ -169,7 +166,7 @@ public class KernelMatrix { * @param relation the database that holds the objects * @param ids the IDs of those objects for which the kernel matrix is computed */ - public <O, D extends NumberDistance<?, ?>> KernelMatrix(SimilarityQuery<? super O, D> kernelFunction, final Relation<? extends O> relation, final DBIDs ids) { + public <O> KernelMatrix(SimilarityQuery<? super O> kernelFunction, final Relation<? extends O> relation, final DBIDs ids) { LoggingUtil.logExpensive(Level.FINER, "Computing kernel matrix"); kernel = new Matrix(ids.size(), ids.size()); if(ids instanceof DBIDRange) { @@ -182,7 +179,7 @@ public class KernelMatrix { for(i1.seek(0); i1.valid(); i1.advance()) { O o1 = relation.get(i1); for(i2.seek(i1.getOffset()); i2.valid(); i2.advance()) { - double value = kernelFunction.similarity(o1, i2).doubleValue(); + double value = kernelFunction.similarity(o1, i2); kernel.set(i1.getOffset(), i2.getOffset(), value); kernel.set(i2.getOffset(), i1.getOffset(), value); } diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/LaplaceKernelFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/LaplaceKernelFunction.java index 2a5f6028..a2297409 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/LaplaceKernelFunction.java +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/LaplaceKernelFunction.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction.kernel; 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 @@ -24,8 +24,8 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction.kernel; */ import de.lmu.ifi.dbs.elki.data.NumberVector; -import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractVectorDoubleDistanceFunction; -import de.lmu.ifi.dbs.elki.distance.similarityfunction.AbstractVectorDoubleSimilarityFunction; +import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractNumberVectorDistanceFunction; +import de.lmu.ifi.dbs.elki.distance.similarityfunction.AbstractVectorSimilarityFunction; import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; import de.lmu.ifi.dbs.elki.utilities.optionhandling.OptionID; import de.lmu.ifi.dbs.elki.utilities.optionhandling.constraints.CommonConstraints; @@ -33,11 +33,11 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameteriz import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.DoubleParameter; /** - * Provides the laplace / exponential radial basis function kernel. + * Laplace / exponential radial basis function kernel. * * @author Erich Schubert */ -public class LaplaceKernelFunction extends AbstractVectorDoubleSimilarityFunction { +public class LaplaceKernelFunction extends AbstractVectorSimilarityFunction { /** * Scaling factor mgamma. (= - 1/sigma) */ @@ -54,8 +54,8 @@ public class LaplaceKernelFunction extends AbstractVectorDoubleSimilarityFunctio } @Override - public double doubleSimilarity(NumberVector<?> o1, NumberVector<?> o2) { - final int dim = AbstractVectorDoubleDistanceFunction.dimensionality(o1, o2); + public double similarity(NumberVector o1, NumberVector o2) { + final int dim = AbstractNumberVectorDistanceFunction.dimensionality(o1, o2); double sim = 0.; for(int i = 0; i < dim; i++) { final double v = o1.doubleValue(i) - o2.doubleValue(i); diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/LinearKernelFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/LinearKernelFunction.java index a86ad55d..6a5b0a79 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/LinearKernelFunction.java +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/LinearKernelFunction.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction.kernel; 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 @@ -24,12 +24,12 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction.kernel; */ import de.lmu.ifi.dbs.elki.data.NumberVector; -import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractVectorDoubleDistanceFunction; +import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractNumberVectorDistanceFunction; import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; /** - * Provides a linear Kernel function that computes a similarity between the two - * feature vectors V1 and V2 defined by V1^T*V2. + * Linear Kernel function that computes a similarity between the two feature + * vectors V1 and V2 defined by V1^T*V2. * * Note: this is effectively equivalent to using * {@link de.lmu.ifi.dbs.elki.distance.distancefunction.minkowski.EuclideanDistanceFunction} @@ -51,18 +51,18 @@ public class LinearKernelFunction extends PolynomialKernelFunction { } @Override - public double doubleSimilarity(final NumberVector<?> o1, final NumberVector<?> o2) { - final int dim = AbstractVectorDoubleDistanceFunction.dimensionality(o1, o2); + public double similarity(final NumberVector o1, final NumberVector o2) { + final int dim = AbstractNumberVectorDistanceFunction.dimensionality(o1, o2); double sim = 0.; - for (int i = 0; i < dim; i++) { + for(int i = 0; i < dim; i++) { sim += o1.doubleValue(i) * o2.doubleValue(i); } return sim; } @Override - public double doubleDistance(final NumberVector<?> fv1, final NumberVector<?> fv2) { - return Math.sqrt(doubleSimilarity(fv1, fv1) + doubleSimilarity(fv2, fv2) - 2 * doubleSimilarity(fv1, fv2)); + public double distance(final NumberVector fv1, final NumberVector fv2) { + return Math.sqrt(similarity(fv1, fv1) + similarity(fv2, fv2) - 2 * similarity(fv1, fv2)); } /** diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/PolynomialKernelFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/PolynomialKernelFunction.java index 2b25ba19..a726003c 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/PolynomialKernelFunction.java +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/PolynomialKernelFunction.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction.kernel; 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,10 +27,9 @@ import de.lmu.ifi.dbs.elki.data.NumberVector; import de.lmu.ifi.dbs.elki.database.query.DistanceSimilarityQuery; import de.lmu.ifi.dbs.elki.database.query.distance.PrimitiveDistanceSimilarityQuery; import de.lmu.ifi.dbs.elki.database.relation.Relation; -import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractVectorDoubleDistanceFunction; -import de.lmu.ifi.dbs.elki.distance.distancefunction.PrimitiveDoubleDistanceFunction; -import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance; -import de.lmu.ifi.dbs.elki.distance.similarityfunction.AbstractVectorDoubleSimilarityFunction; +import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractNumberVectorDistanceFunction; +import de.lmu.ifi.dbs.elki.distance.distancefunction.PrimitiveDistanceFunction; +import de.lmu.ifi.dbs.elki.distance.similarityfunction.AbstractVectorSimilarityFunction; import de.lmu.ifi.dbs.elki.math.MathUtil; import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; import de.lmu.ifi.dbs.elki.utilities.optionhandling.OptionID; @@ -40,12 +39,12 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.DoubleParameter; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.IntParameter; /** - * Provides a polynomial Kernel function that computes a similarity between the - * two feature vectors V1 and V2 defined by (V1^T*V2)^degree. + * Polynomial Kernel function that computes a similarity between the two feature + * vectors V1 and V2 defined by (V1^T*V2)^degree. * * @author Simon Paradies */ -public class PolynomialKernelFunction extends AbstractVectorDoubleSimilarityFunction implements PrimitiveDoubleDistanceFunction<NumberVector<?>> { +public class PolynomialKernelFunction extends AbstractVectorSimilarityFunction implements PrimitiveDistanceFunction<NumberVector> { /** * The default degree. */ @@ -83,8 +82,8 @@ public class PolynomialKernelFunction extends AbstractVectorDoubleSimilarityFunc } @Override - public double doubleSimilarity(NumberVector<?> o1, NumberVector<?> o2) { - final int dim = AbstractVectorDoubleDistanceFunction.dimensionality(o1, o2); + public double similarity(NumberVector o1, NumberVector o2) { + final int dim = AbstractNumberVectorDistanceFunction.dimensionality(o1, o2); double sim = 0.; for(int i = 0; i < dim; i++) { sim += o1.doubleValue(i) * o2.doubleValue(i); @@ -93,22 +92,17 @@ public class PolynomialKernelFunction extends AbstractVectorDoubleSimilarityFunc } @Override - public DoubleDistance distance(final NumberVector<?> fv1, final NumberVector<?> fv2) { - return new DoubleDistance(doubleDistance(fv1, fv2)); - } - - @Override public boolean isMetric() { return true; } @Override - public double doubleDistance(NumberVector<?> fv1, NumberVector<?> fv2) { - return Math.sqrt(doubleSimilarity(fv1, fv1) + doubleSimilarity(fv2, fv2) - 2 * doubleSimilarity(fv1, fv2)); + public double distance(NumberVector fv1, NumberVector fv2) { + return Math.sqrt(similarity(fv1, fv1) + similarity(fv2, fv2) - 2 * similarity(fv1, fv2)); } @Override - public <T extends NumberVector<?>> DistanceSimilarityQuery<T, DoubleDistance> instantiate(Relation<T> database) { + public <T extends NumberVector> DistanceSimilarityQuery<T> instantiate(Relation<T> database) { return new PrimitiveDistanceSimilarityQuery<>(database, this, this); } diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/RadialBasisFunctionKernelFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/RadialBasisFunctionKernelFunction.java index a7613a78..a0287b36 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/RadialBasisFunctionKernelFunction.java +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/RadialBasisFunctionKernelFunction.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction.kernel; 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 @@ -24,8 +24,8 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction.kernel; */ import de.lmu.ifi.dbs.elki.data.NumberVector; -import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractVectorDoubleDistanceFunction; -import de.lmu.ifi.dbs.elki.distance.similarityfunction.AbstractVectorDoubleSimilarityFunction; +import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractNumberVectorDistanceFunction; +import de.lmu.ifi.dbs.elki.distance.similarityfunction.AbstractVectorSimilarityFunction; import de.lmu.ifi.dbs.elki.utilities.Alias; import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; import de.lmu.ifi.dbs.elki.utilities.optionhandling.OptionID; @@ -34,12 +34,12 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameteriz import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.DoubleParameter; /** - * Provides the Gaussian radial basis function kernel (RBF Kernel). + * Gaussian radial basis function kernel (RBF Kernel). * * @author Erich Schubert */ @Alias({ "rbf" }) -public class RadialBasisFunctionKernelFunction extends AbstractVectorDoubleSimilarityFunction { +public class RadialBasisFunctionKernelFunction extends AbstractVectorSimilarityFunction { /** * Scaling factor gamma. (= - 1/(2sigma^2)) */ @@ -56,8 +56,8 @@ public class RadialBasisFunctionKernelFunction extends AbstractVectorDoubleSimil } @Override - public double doubleSimilarity(NumberVector<?> o1, NumberVector<?> o2) { - final int dim = AbstractVectorDoubleDistanceFunction.dimensionality(o1, o2); + public double similarity(NumberVector o1, NumberVector o2) { + final int dim = AbstractNumberVectorDistanceFunction.dimensionality(o1, o2); double sim = 0.; for(int i = 0; i < dim; i++) { final double v = o1.doubleValue(i) - o2.doubleValue(i); diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/RationalQuadraticKernelFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/RationalQuadraticKernelFunction.java index 0a3dc45c..54398fd3 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/RationalQuadraticKernelFunction.java +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/RationalQuadraticKernelFunction.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction.kernel; 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 @@ -24,8 +24,8 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction.kernel; */ import de.lmu.ifi.dbs.elki.data.NumberVector; -import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractVectorDoubleDistanceFunction; -import de.lmu.ifi.dbs.elki.distance.similarityfunction.AbstractVectorDoubleSimilarityFunction; +import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractNumberVectorDistanceFunction; +import de.lmu.ifi.dbs.elki.distance.similarityfunction.AbstractVectorSimilarityFunction; import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; import de.lmu.ifi.dbs.elki.utilities.optionhandling.OptionID; import de.lmu.ifi.dbs.elki.utilities.optionhandling.constraints.CommonConstraints; @@ -33,12 +33,12 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameteriz import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.DoubleParameter; /** - * Provides the rational quadratic kernel, a less computational approximation of - * the Gaussian RBF kerne ({@link RadialBasisFunctionKernelFunction}). + * Rational quadratic kernel, a less computational approximation of the Gaussian + * RBF kernel ({@link RadialBasisFunctionKernelFunction}). * * @author Erich Schubert */ -public class RationalQuadraticKernelFunction extends AbstractVectorDoubleSimilarityFunction { +public class RationalQuadraticKernelFunction extends AbstractVectorSimilarityFunction { /** * Constant term c. */ @@ -55,8 +55,8 @@ public class RationalQuadraticKernelFunction extends AbstractVectorDoubleSimilar } @Override - public double doubleSimilarity(NumberVector<?> o1, NumberVector<?> o2) { - final int dim = AbstractVectorDoubleDistanceFunction.dimensionality(o1, o2); + public double similarity(NumberVector o1, NumberVector o2) { + final int dim = AbstractNumberVectorDistanceFunction.dimensionality(o1, o2); double sim = 0.; for(int i = 0; i < dim; i++) { final double v = o1.doubleValue(i) - o2.doubleValue(i); diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/SigmoidKernelFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/SigmoidKernelFunction.java index a88225f9..11f33f16 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/SigmoidKernelFunction.java +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/SigmoidKernelFunction.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction.kernel; 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 @@ -24,8 +24,8 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction.kernel; */ import de.lmu.ifi.dbs.elki.data.NumberVector; -import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractVectorDoubleDistanceFunction; -import de.lmu.ifi.dbs.elki.distance.similarityfunction.AbstractVectorDoubleSimilarityFunction; +import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractNumberVectorDistanceFunction; +import de.lmu.ifi.dbs.elki.distance.similarityfunction.AbstractVectorSimilarityFunction; import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; import de.lmu.ifi.dbs.elki.utilities.optionhandling.OptionID; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameterization; @@ -37,7 +37,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.DoubleParameter; * * @author Erich Schubert */ -public class SigmoidKernelFunction extends AbstractVectorDoubleSimilarityFunction { +public class SigmoidKernelFunction extends AbstractVectorSimilarityFunction { /** * Scaling factor c, bias theta */ @@ -56,8 +56,8 @@ public class SigmoidKernelFunction extends AbstractVectorDoubleSimilarityFunctio } @Override - public double doubleSimilarity(NumberVector<?> o1, NumberVector<?> o2) { - final int dim = AbstractVectorDoubleDistanceFunction.dimensionality(o1, o2); + public double similarity(NumberVector o1, NumberVector o2) { + final int dim = AbstractNumberVectorDistanceFunction.dimensionality(o1, o2); double sim = 0.; for (int i = 0; i < dim; i++) { final double v = o1.doubleValue(i) * o2.doubleValue(i); diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/package-info.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/package-info.java index ec847f80..6d0d3da2 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/package-info.java +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/package-info.java @@ -7,7 +7,7 @@ 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 diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/package-info.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/package-info.java index 6e5ad0e0..025c3792 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/package-info.java +++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/package-info.java @@ -7,7 +7,7 @@ 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 |