use of de.lmu.ifi.dbs.elki.math.linearalgebra.pca.PCARunner in project elki by elki-project.
the class CASH method runDerivator.
/**
* Runs the derivator on the specified interval and assigns all points having
* a distance less then the standard deviation of the derivator model to the
* model to this model.
*
* @param relation the database containing the parameterization functions
* @param interval the interval to build the model
* @param dim the dimensionality of the database
* @param ids an empty set to assign the ids
* @return a basis of the found subspace
*/
private double[][] runDerivator(Relation<ParameterizationFunction> relation, int dim, CASHInterval interval, ModifiableDBIDs ids) {
Database derivatorDB = buildDerivatorDB(relation, interval);
PCARunner pca = new PCARunner(new StandardCovarianceMatrixBuilder());
EigenPairFilter filter = new FirstNEigenPairFilter(dim - 1);
DependencyDerivator<DoubleVector> derivator = new DependencyDerivator<>(null, FormatUtil.NF4, pca, filter, 0, false);
CorrelationAnalysisSolution<DoubleVector> model = derivator.run(derivatorDB);
double[][] weightMatrix = model.getSimilarityMatrix();
double[] centroid = model.getCentroid();
double eps = .25;
ids.addDBIDs(interval.getIDs());
// Search for nearby vectors in original database
for (DBIDIter iditer = relation.iterDBIDs(); iditer.valid(); iditer.advance()) {
double[] v = relation.get(iditer).getColumnVector();
double d = mahalanobisDistance(weightMatrix, v, centroid);
if (d <= eps) {
ids.add(iditer);
}
}
double[][] basis = model.getStrongEigenvectors();
return getMatrix(basis, 0, basis.length, 0, dim - 1);
}
use of de.lmu.ifi.dbs.elki.math.linearalgebra.pca.PCARunner in project elki by elki-project.
the class CASH method runDerivator.
/**
* Runs the derivator on the specified interval and assigns all points having
* a distance less then the standard deviation of the derivator model to the
* model to this model.
*
* @param relation the database containing the parameterization functions
* @param ids the ids to build the model
* @param dimensionality the dimensionality of the subspace
* @return a basis of the found subspace
*/
private LinearEquationSystem runDerivator(Relation<ParameterizationFunction> relation, int dimensionality, DBIDs ids) {
try {
// build database for derivator
Database derivatorDB = buildDerivatorDB(relation, ids);
PCARunner pca = new PCARunner(new StandardCovarianceMatrixBuilder());
EigenPairFilter filter = new FirstNEigenPairFilter(dimensionality);
DependencyDerivator<DoubleVector> derivator = new DependencyDerivator<>(null, FormatUtil.NF4, pca, filter, 0, false);
CorrelationAnalysisSolution<DoubleVector> model = derivator.run(derivatorDB);
LinearEquationSystem les = model.getNormalizedLinearEquationSystem(null);
return les;
} catch (NonNumericFeaturesException e) {
throw new IllegalStateException("Error during normalization" + e);
}
}
use of de.lmu.ifi.dbs.elki.math.linearalgebra.pca.PCARunner in project elki by elki-project.
the class ERiCNeighborPredicate method instantiate.
/**
* Full instantiation interface.
*
* @param database Database
* @param relation Relation
* @return Instance
*/
public Instance instantiate(Database database, Relation<V> relation) {
DistanceQuery<V> dq = database.getDistanceQuery(relation, EuclideanDistanceFunction.STATIC);
KNNQuery<V> knnq = database.getKNNQuery(dq, settings.k);
WritableDataStore<PCAFilteredResult> storage = DataStoreUtil.makeStorage(relation.getDBIDs(), DataStoreFactory.HINT_HOT | DataStoreFactory.HINT_TEMP, PCAFilteredResult.class);
PCARunner pca = settings.pca;
EigenPairFilter filter = settings.filter;
Duration time = LOG.newDuration(this.getClass().getName() + ".preprocessing-time").begin();
FiniteProgress progress = LOG.isVerbose() ? new FiniteProgress(this.getClass().getName(), relation.size(), LOG) : null;
for (DBIDIter iditer = relation.iterDBIDs(); iditer.valid(); iditer.advance()) {
DoubleDBIDList ref = knnq.getKNNForDBID(iditer, settings.k);
PCAResult pcares = pca.processQueryResult(ref, relation);
storage.put(iditer, new PCAFilteredResult(pcares.getEigenPairs(), filter.filter(pcares.getEigenvalues()), 1., 0.));
LOG.incrementProcessed(progress);
}
LOG.ensureCompleted(progress);
LOG.statistics(time.end());
return new Instance(relation.getDBIDs(), storage, relation);
}
use of de.lmu.ifi.dbs.elki.math.linearalgebra.pca.PCARunner in project elki by elki-project.
the class GlobalPrincipalComponentAnalysisTransform method prepareComplete.
@Override
protected void prepareComplete() {
mean = covmat.getMeanVector();
PCAResult pcares = (new PCARunner(null)).processCovarMatrix(covmat.destroyToPopulationMatrix());
SortedEigenPairs eps = pcares.getEigenPairs();
covmat = null;
if (filter == null) {
proj = new double[dim][dim];
for (int d = 0; d < dim; d++) {
EigenPair ep = eps.getEigenPair(d);
double[] ev = ep.getEigenvector();
double mult = 1. / FastMath.sqrt(ep.getEigenvalue());
// Fill weighted and transposed:
for (int i = 0; i < dim; i++) {
proj[d][i] = ev[i] * mult;
}
}
} else {
final int pdim = filter.filter(eps.eigenValues());
if (LOG.isVerbose()) {
LOG.verbose("Reducing dimensionality from " + dim + " to " + pdim + " via PCA.");
}
proj = new double[pdim][dim];
for (int d = 0; d < pdim; d++) {
EigenPair ep = eps.getEigenPair(d);
double[] ev = ep.getEigenvector();
double mult = 1. / FastMath.sqrt(ep.getEigenvalue());
// Fill weighted and transposed:
for (int i = 0; i < dim; i++) {
proj[d][i] = ev[i] * mult;
}
}
}
buf = new double[dim];
}
Aggregations