package de.lmu.ifi.dbs.elki.index.projected;
/*
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 .
*/
import de.lmu.ifi.dbs.elki.data.NumberVector;
import de.lmu.ifi.dbs.elki.data.projection.RandomProjection;
import de.lmu.ifi.dbs.elki.index.IndexFactory;
import de.lmu.ifi.dbs.elki.math.linearalgebra.randomprojections.AchlioptasRandomProjectionFamily;
import de.lmu.ifi.dbs.elki.math.random.RandomFactory;
import de.lmu.ifi.dbs.elki.utilities.documentation.Reference;
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;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameterization;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.DoubleParameter;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.IntParameter;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ObjectParameter;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.RandomParameter;
/**
* Projection-Indexed nearest-neighbors (PINN) is an index to retrieve the
* nearest neighbors in high dimensional spaces by using a random projection
* based index.
*
* Reference:
*
* Finding local anomalies in very high dimensional space
* T. de Vries, S. Chawla, M. E. Houle
* In: Proc. IEEE 10th International Conference on Data Mining (ICDM)
*
*
* @author Erich Schubert
*
* @apiviz.composedOf AchlioptasRandomProjectionFamily
*
* @param Object type
*/
@Reference(title = "Finding local anomalies in very high dimensional space", authors = "T. de Vries, S. Chawla, M. E. Houle", booktitle = "Proc. IEEE 10th International Conference on Data Mining (ICDM)", url = "http://dx.doi.org/10.1109/ICDM.2010.151")
public class PINN extends ProjectedIndex.Factory {
/**
* Constructor.
*
* @param inner Inner index
* @param t Target dimensionality
* @param s Sparsity
* @param h Neighborhood size multiplicator
* @param random Random generator factory
*/
public PINN(IndexFactory inner, int t, double s, double h, RandomFactory random) {
super(new RandomProjection(t, new AchlioptasRandomProjectionFamily(s, random)), inner, true, false, h);
}
/**
* Parameterization class.
*
* @author Erich Schubert
*
* @apiviz.exclude
*
* @param Outer object type.
*/
public static class Parameterizer extends AbstractParameterizer {
/**
* Target dimensionality.
*/
public static final OptionID T_ID = new OptionID("pinn.t", "Target dimensionality.");
/**
* Sparsity option.
*/
public static final OptionID S_ID = new OptionID("pinn.s", "Sparsity of the random projection.");
/**
* Neighborhood size.
*/
public static final OptionID H_ID = new OptionID("pinn.hmult", "Multiplicator for neighborhood size.");
/**
* Random generator.
*/
public static final OptionID RANDOM_ID = new OptionID("pinn.seed", "Random generator seed.");
/**
* Inner index factory.
*/
IndexFactory inner;
/**
* Dimensionality.
*/
int t;
/**
* Sparsity.
*/
double s;
/**
* Multiplicator.
*/
double h;
/**
* Random generator.
*/
RandomFactory random;
@Override
protected void makeOptions(Parameterization config) {
super.makeOptions(config);
ObjectParameter> innerP = new ObjectParameter<>(ProjectedIndex.Factory.Parameterizer.INDEX_ID, IndexFactory.class);
if(config.grab(innerP)) {
inner = innerP.instantiateClass(config);
}
IntParameter tP = new IntParameter(T_ID);
tP.addConstraint(CommonConstraints.GREATER_EQUAL_ONE_INT);
if(config.grab(tP)) {
t = tP.intValue();
}
DoubleParameter sP = new DoubleParameter(S_ID, 1.);
sP.addConstraint(CommonConstraints.GREATER_EQUAL_ONE_DOUBLE);
if(config.grab(sP)) {
s = sP.doubleValue();
}
DoubleParameter hP = new DoubleParameter(H_ID, 3.);
hP.addConstraint(CommonConstraints.GREATER_EQUAL_ONE_DOUBLE);
if(config.grab(hP)) {
h = hP.doubleValue();
}
RandomParameter randomP = new RandomParameter(RANDOM_ID);
if(config.grab(randomP)) {
random = randomP.getValue();
}
}
@Override
protected PINN makeInstance() {
return new PINN<>(inner, t, s, h, random);
}
}
}