6 #ifndef TAPKEE_METHODS_H_
7 #define TAPKEE_METHODS_H_
37 namespace tapkee_internal
98 template <
class RandomAccessIterator,
class KernelCallback,
99 class DistanceCallback,
class FeaturesCallback>
105 KernelCallback k, DistanceCallback d, FeaturesCallback f,
160 using std::mem_fun_ref_t;
161 using std::mem_fun_ref;
162 typedef std::mem_fun_ref_t<TapkeeOutput,ImplementationBase> ImplRef;
164 #define tapkee_method_handle(X) \
167 timed_context tctx__("[+] embedding with " # X); \
168 ImplRef ref = conditional_select< \
169 ((!MethodTraits<X>::needs_kernel) || (!is_dummy<KernelCallback>::value)) && \
170 ((!MethodTraits<X>::needs_distance) || (!is_dummy<DistanceCallback>::value)) && \
171 ((!MethodTraits<X>::needs_features) || (!is_dummy<FeaturesCallback>::value)), \
172 ImplRef>()(mem_fun_ref(&ImplementationBase::embed##X), \
173 mem_fun_ref(&ImplementationBase::embedEmpty)); \
201 #undef tapkee_method_handle
241 template<
class Distance>
290 DenseMatrix embedding = (decomposition_result.first).leftCols(target_dimension);
292 for (
IndexType i=0; i<target_dimension; i++)
293 embedding.col(i).array() *= pow(decomposition_result.second(i),
static_cast<IndexType>(
p_timesteps));
295 for (
IndexType i=0; i<target_dimension; i++)
296 embedding.col(i).array() /= decomposition_result.first.col(target_dimension).array();
304 distance_matrix.array() *= -0.5;
310 embedding.first.col(i).array() *= sqrt(embedding.second(i));
323 DenseVector landmark_distances_squared = distance_matrix.colwise().mean();
325 distance_matrix.array() *= -0.5;
330 landmarks_embedding.first.col(i).array() *= sqrt(landmarks_embedding.second(i));
340 shortest_distances_matrix = shortest_distances_matrix.array().square();
342 shortest_distances_matrix.array() *= -0.5;
349 embedding.first.col(i).array() *= sqrt(embedding.second(i));
363 distance_matrix = distance_matrix.array().square();
365 DenseVector col_means = distance_matrix.colwise().mean();
366 DenseVector row_means = distance_matrix.rowwise().mean();
367 ScalarType grand_mean = distance_matrix.mean();
368 distance_matrix.array() += grand_mean;
369 distance_matrix.colwise() -= row_means;
370 distance_matrix.rowwise() -= col_means.transpose();
371 distance_matrix.array() *= -0.5;
377 DenseMatrix distance_matrix_sym = distance_matrix*distance_matrix.transpose();
387 DenseMatrix embedding = distance_matrix.transpose()*landmarks_embedding.first;
390 embedding.col(i).array() /= sqrt(sqrt(landmarks_embedding.second(i)));
479 embedding.first.col(i).array() *= sqrt(embedding.second(i));
498 projecting_function);
557 template <
class RandomAccessIterator,
class KernelCallback,
558 class DistanceCallback,
class FeaturesCallback>
559 ImplementationBase<RandomAccessIterator,KernelCallback,DistanceCallback,FeaturesCallback>
560 initialize(RandomAccessIterator begin, RandomAccessIterator end,
561 KernelCallback kernel, DistanceCallback
distance, FeaturesCallback features,
565 begin,end,kernel,
distance,features,pmap,ctx);
ImplementationBase(RandomAccessIterator b, RandomAccessIterator e, KernelCallback k, DistanceCallback d, FeaturesCallback f, ParametersSet &pmap, const Context &ctx)
static const EigenMethod Dense("Dense")
Eigen library dense method (could be useful for debugging). Computes all eigenvectors thus can be ver...
static const EigendecompositionStrategy SmallestEigenvalues("Smallest eigenvalues", 1)
ScalarType distance(Callback &cb, const CoverTreePoint< RandomAccessIterator > &l, const CoverTreePoint< RandomAccessIterator > &r, ScalarType upper_bound)
TapkeeOutput embedDiffusionMap()
static const EigendecompositionStrategy SquaredLargestEigenvalues("Largest eigenvalues of squared matrix", 0)
CheckedParameter checked()
void centerMatrix(DenseMatrix &matrix)
Neighbors find_neighbors(NeighborsMethod method, const RandomAccessIterator &begin, const RandomAccessIterator &end, const Callback &callback, IndexType k, bool check_connectivity)
TapkeeOutput embedLaplacianEigenmaps()
Eigen::Matrix< tapkee::ScalarType, Eigen::Dynamic, Eigen::Dynamic > DenseMatrix
dense matrix type (non-overridable)
EigendecompositionResult eigendecomposition(const EigenMethod &method, const ComputationStrategy &strategy, const EigendecompositionStrategy &eigen_strategy, const MatrixType &m, IndexType target_dimension)
Multiple implementation handler method for various eigendecomposition methods.
DenseSymmetricMatrix compute_centered_kernel_matrix(RandomAccessIterator begin, RandomAccessIterator end, KernelCallback callback)
void manifold_sculpting_embed(RandomAccessIterator begin, RandomAccessIterator end, DenseMatrix &data, IndexType target_dimension, const Neighbors &neighbors, DistanceCallback callback, IndexType max_iteration, ScalarType squishing_rate)
DenseSymmetricMatrix compute_covariance_matrix(RandomAccessIterator begin, RandomAccessIterator end, const DenseVector &mean, FeatureVectorCallback callback, IndexType dimension)
TapkeeOutput embedKernelLocallyLinearEmbedding()
DenseSymmetricMatrixPair construct_lltsa_eigenproblem(SparseWeightMatrix W, RandomAccessIterator begin, RandomAccessIterator end, FeatureVectorCallback feature_vector_callback, IndexType dimension)
TapkeeOutput embedMultidimensionalScaling()
SparseWeightMatrix hessian_weight_matrix(RandomAccessIterator begin, RandomAccessIterator end, const Neighbors &neighbors, PairwiseCallback callback, const IndexType target_dimension)
DenseSymmetricMatrix compute_shortest_distances_matrix(RandomAccessIterator begin, RandomAccessIterator end, Neighbors &neighbors, DistanceCallback callback)
Computes shortest distances (so-called geodesic distances) using Dijkstra algorithm.
static Parameter create(const std::string &name, const T &value)
TAPKEE_INTERNAL_PAIR< tapkee::SparseWeightMatrix, tapkee::DenseDiagonalMatrix > Laplacian
TapkeeOutput embedNeighborhoodPreservingEmbedding()
bool operator()(T v) const
IndexType current_dimension
TapkeeOutput embedLocalityPreservingProjections()
TapkeeOutput embedHessianLocallyLinearEmbedding()
bool is_cancelled() const
TapkeeOutput embedEmpty()
TapkeeOutput embedManifoldSculpting()
bool operator()(T v) const
TapkeeOutput embedFactorAnalysis()
double ScalarType
default scalar value (can be overrided with TAPKEE_CUSTOM_INTERNAL_NUMTYPE define) ...
EigendecompositionResult generalized_eigendecomposition(const EigenMethod &method, const ComputationStrategy &strategy, const EigendecompositionStrategy &eigen_strategy, const LMatrixType &lhs, const RMatrixType &rhs, IndexType target_dimension)
Parameter p_global_strategy
Parameter p_target_dimension
An exception type that is thrown when no data is given.
TAPKEE_INTERNAL_PAIR< tapkee::DenseSymmetricMatrix, tapkee::DenseSymmetricMatrix > DenseSymmetricMatrixPair
void run(tapkee::DenseMatrix &X, int N, int D, ScalarType *Y, int no_dims, ScalarType perplexity, ScalarType theta)
DenseSymmetricMatrix compute_distance_matrix(RandomAccessIterator begin, RandomAccessIterator, Landmarks &landmarks, PairwiseCallback callback)
TapkeeOutput embedPassThru()
DenseSymmetricMatrixPair construct_neighborhood_preserving_eigenproblem(SparseWeightMatrix W, RandomAccessIterator begin, RandomAccessIterator end, FeatureVectorCallback feature_vector_callback, IndexType dimension)
SparseWeightMatrix tangent_weight_matrix(RandomAccessIterator begin, RandomAccessIterator end, const Neighbors &neighbors, PairwiseCallback callback, const IndexType target_dimension, const ScalarType shift)
An exception type that is thrown when computations were cancelled.
Eigen::SparseMatrix< tapkee::ScalarType > SparseWeightMatrix
sparse weight matrix type (non-overridable)
Parameter p_max_iteration
TapkeeOutput embedtDistributedStochasticNeighborEmbedding()
Parameter p_neighbors_method
DenseMatrix triangulate(RandomAccessIterator begin, RandomAccessIterator end, PairwiseCallback distance_callback, Landmarks &landmarks, DenseVector &landmark_distances_squared, EigendecompositionResult &landmarks_embedding, IndexType target_dimension)
Eigen::Matrix< tapkee::ScalarType, Eigen::Dynamic, 1 > DenseVector
dense vector type (non-overridable)
std::string failureMessage(const stichwort::Parameter &p) const
DenseMatrix dense_matrix_from_features(FeaturesCallback features, IndexType dimension, RandomAccessIterator begin, RandomAccessIterator end)
Laplacian compute_laplacian(RandomAccessIterator begin, RandomAccessIterator end, const Neighbors &neighbors, DistanceCallback callback, ScalarType width)
Computes laplacian of neighborhood graph.
int IndexType
indexing type (non-overridable) set to int for compatibility with OpenMP 2.0
TapkeeOutput embedUsing(DimensionReductionMethod method)
PlainDistance< RandomAccessIterator, DistanceCallback > plain_distance
Parameter p_computation_strategy
DimensionReductionMethod
Dimension reduction methods.
TapkeeOutput embedLinearLocalTangentSpaceAlignment()
DistanceCallback distance
ParameterName name() const
TapkeeOutput embedIsomap()
std::string failureMessage(const stichwort::Parameter &p) const
RandomAccessIterator begin
DenseVector compute_mean(RandomAccessIterator begin, RandomAccessIterator end, FeatureVectorCallback callback, IndexType dimension)
std::string failureMessage(const stichwort::Parameter &p) const
std::string failureMessage(const stichwort::Parameter &p) const
DenseMatrix project(RandomAccessIterator begin, RandomAccessIterator end, FeatureVectorCallback callback, IndexType dimension, const IndexType max_iter, const ScalarType epsilon, const IndexType target_dimension, const DenseVector &mean_vector)
DenseSymmetricMatrix compute_diffusion_matrix(RandomAccessIterator begin, RandomAccessIterator end, DistanceCallback callback, const ScalarType width)
Computes diffusion process matrix. Uses the following algorithm:
static const EigendecompositionStrategy LargestEigenvalues("Largest eigenvalues", 0)
bool operator()(T v) const
A pimpl wrapper for projecting function.
static tapkee::ProjectingFunction unimplementedProjectingFunction()
Return result of the library - a pair of DenseMatrix (embedding) and ProjectingFunction.
TAPKEE_INTERNAL_VECTOR< tapkee::tapkee_internal::LocalNeighbors > Neighbors
ImplementationBase< RandomAccessIterator, KernelCallback, DistanceCallback, FeaturesCallback > initialize(RandomAccessIterator begin, RandomAccessIterator end, KernelCallback kernel, DistanceCallback distance, FeaturesCallback features, stichwort::ParametersSet &pmap, const Context &ctx)
Neighbors findNeighborsWith(Distance d)
SparseWeightMatrix linear_weight_matrix(const RandomAccessIterator &begin, const RandomAccessIterator &end, const Neighbors &neighbors, PairwiseCallback callback, const ScalarType shift, const ScalarType trace_shift)
TapkeeOutput embedKernelLocalTangentSpaceAlignment()
#define tapkee_method_handle(X)
TapkeeOutput embedKernelPCA()
An exception type that is thrown when unsupported method is called.
Parameter p_check_connectivity
TAPKEE_INTERNAL_PAIR< tapkee::DenseMatrix, tapkee::DenseVector > EigendecompositionResult
TapkeeOutput embedRandomProjection()
TapkeeOutput embedLandmarkMultidimensionalScaling()
TapkeeOutput embedStochasticProximityEmbedding()
Landmarks select_landmarks_random(RandomAccessIterator begin, RandomAccessIterator end, ScalarType ratio)
TAPKEE_INTERNAL_VECTOR< tapkee::IndexType > Landmarks
bool operator()(T v) const
KernelDistance< RandomAccessIterator, KernelCallback > kernel_distance
tapkee::DenseMatrix DenseSymmetricMatrix
dense symmetric matrix (non-overridable, currently just dense matrix, can be improved later) ...
DenseSymmetricMatrixPair construct_locality_preserving_eigenproblem(SparseWeightMatrix &L, DenseDiagonalMatrix &D, RandomAccessIterator begin, RandomAccessIterator end, FeatureVectorCallback feature_vector_callback, IndexType dimension)
Parameter p_squishing_rate
DenseMatrix gaussian_projection_matrix(IndexType target_dimension, IndexType current_dimension)
FeaturesCallback features
DenseMatrix spe_embedding(RandomAccessIterator begin, RandomAccessIterator end, PairwiseCallback callback, const Neighbors &neighbors, IndexType target_dimension, bool global_strategy, ScalarType tolerance, int nupdates, IndexType max_iter)
Parameter & satisfies(const F< Q > &cond) const
Basic ProjectionImplementation that subtracts mean from the vector and multiplies projecting matrix w...
TapkeeOutput embedLandmarkIsomap()