package de.lmu.ifi.dbs.elki.datasource.filter.transform;
/*
This file is part of ELKI:
Environment for Developing KDD-Applications Supported by Index-Structures
Copyright (C) 2015
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 java.util.List;
import java.util.Random;
import de.lmu.ifi.dbs.elki.data.DoubleVector;
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.VectorFieldTypeInformation;
import de.lmu.ifi.dbs.elki.datasource.bundle.MultipleObjectsBundle;
import de.lmu.ifi.dbs.elki.datasource.filter.FilterUtil;
import de.lmu.ifi.dbs.elki.datasource.filter.ObjectFilter;
import de.lmu.ifi.dbs.elki.distance.distancefunction.PrimitiveDistanceFunction;
import de.lmu.ifi.dbs.elki.distance.distancefunction.minkowski.SquaredEuclideanDistanceFunction;
import de.lmu.ifi.dbs.elki.logging.Logging;
import de.lmu.ifi.dbs.elki.logging.progress.FiniteProgress;
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.parameterization.Parameterization;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.IntParameter;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ObjectParameter;
/**
* Rescale the data set using multidimensional scaling, MDS.
*
* This implementation uses power iterations, which is faster when the number of
* data points is much larger than the desired number of dimensions.
*
* This implementation is O(n^2), and uses O(n^2) memory.
*
* @author Erich Schubert
*
* @param Data type
*/
@Alias({ "fastmds" })
public class FastMultidimensionalScalingTransform implements ObjectFilter {
/**
* Class logger.
*/
private static final Logging LOG = Logging.getLogger(FastMultidimensionalScalingTransform.class);
/**
* Distance function to use.
*/
PrimitiveDistanceFunction super O> dist = null;
/**
* Target dimensionality
*/
int tdim;
/**
* Constructor.
*
* @param tdim Target dimensionality.
* @param dist Distance function to use.
*/
public FastMultidimensionalScalingTransform(int tdim, PrimitiveDistanceFunction super O> dist) {
super();
this.tdim = tdim;
this.dist = dist;
}
@Override
public MultipleObjectsBundle filter(MultipleObjectsBundle objects) {
final int size = objects.dataLength();
if(size == 0) {
return objects;
}
MultipleObjectsBundle bundle = new MultipleObjectsBundle();
for(int r = 0; r < objects.metaLength(); r++) {
SimpleTypeInformation extends Object> type = objects.meta(r);
@SuppressWarnings("unchecked")
final List