6 #ifndef TAPKEE_METHODS_H_
7 #define TAPKEE_METHODS_H_
37 namespace tapkee_internal
40 template <
class RandomAccessIterator,
class KernelCallback,
41 class DistanceCallback,
class FeaturesCallback>
47 KernelCallback k, DistanceCallback d, FeaturesCallback f,
75 width =
parameters(keywords::gaussian_kernel_width).checked().positive();
104 using std::mem_fun_ref_t;
105 using std::mem_fun_ref;
106 typedef std::mem_fun_ref_t<TapkeeOutput,ImplementationBase> ImplRef;
108 #define tapkee_method_handle(X) \
111 timed_context tctx__("[+] embedding with " # X); \
112 ImplRef ref = conditional_select< \
113 ((!MethodTraits<X>::needs_kernel) || (!is_dummy<KernelCallback>::value)) && \
114 ((!MethodTraits<X>::needs_distance) || (!is_dummy<DistanceCallback>::value)) && \
115 ((!MethodTraits<X>::needs_features) || (!is_dummy<FeaturesCallback>::value)), \
116 ImplRef>()(mem_fun_ref(&ImplementationBase::embed##X), \
117 mem_fun_ref(&ImplementationBase::embedEmpty)); \
145 #undef tapkee_method_handle
187 template<
class Distance>
210 eigendecomposition<SparseWeightMatrix,SparseInverseMatrixOperation>(
eigen_method,
222 eigendecomposition<SparseWeightMatrix,SparseInverseMatrixOperation>(
eigen_method,
231 #define DM_MATRIX_OP GPUDenseImplicitSquareMatrixOperation
233 #define DM_MATRIX_OP DenseImplicitSquareSymmetricMatrixOperation
239 eigendecomposition<DenseSymmetricMatrix,DM_MATRIX_OP>(
eigen_method,diffusion_matrix,
250 #define MDS_MATRIX_OP GPUDenseImplicitSquareMatrixOperation
252 #define MDS_MATRIX_OP DenseMatrixOperation
257 distance_matrix.array() *= -0.5;
259 eigendecomposition<DenseSymmetricMatrix,MDS_MATRIX_OP>(
eigen_method,
263 embedding.first.col(i).array() *= sqrt(embedding.second(i));
272 static_cast<ScalarType>(1.0));
278 DenseVector landmark_distances_squared = distance_matrix.colwise().mean();
280 distance_matrix.array() *= -0.5;
282 eigendecomposition<DenseSymmetricMatrix,DenseMatrixOperation>(
eigen_method,
285 landmarks_embedding.first.col(i).array() *= sqrt(landmarks_embedding.second(i));
295 shortest_distances_matrix = shortest_distances_matrix.array().square();
297 shortest_distances_matrix.array() *= -0.5;
300 eigendecomposition<DenseSymmetricMatrix,DenseMatrixOperation>(
eigen_method,
304 embedding.first.col(i).array() *= sqrt(embedding.second(i));
313 static_cast<ScalarType>(1.0));
320 distance_matrix = distance_matrix.array().square();
322 DenseVector col_means = distance_matrix.colwise().mean();
323 DenseVector row_means = distance_matrix.rowwise().mean();
324 ScalarType grand_mean = distance_matrix.mean();
325 distance_matrix.array() += grand_mean;
326 distance_matrix.colwise() -= row_means;
327 distance_matrix.rowwise() -= col_means.transpose();
328 distance_matrix.array() *= -0.5;
334 DenseMatrix distance_matrix_sym = distance_matrix*distance_matrix.transpose();
335 landmarks_embedding = eigendecomposition<DenseSymmetricMatrix,DenseImplicitSquareMatrixOperation>
340 landmarks_embedding = eigendecomposition<DenseSymmetricMatrix,DenseImplicitSquareMatrixOperation>
344 DenseMatrix embedding = distance_matrix.transpose()*landmarks_embedding.first;
347 embedding.col(i).array() /= sqrt(sqrt(landmarks_embedding.second(i)));
360 generalized_eigendecomposition<DenseSymmetricMatrix,DenseSymmetricMatrix,DenseInverseMatrixOperation>(
382 return TapkeeOutput(generalized_eigendecomposition<SparseWeightMatrix,DenseDiagonalMatrix,SparseInverseMatrixOperation>(
395 generalized_eigendecomposition<DenseSymmetricMatrix,DenseSymmetricMatrix,DenseInverseMatrixOperation>(
433 embedding.first.col(i).array() *= sqrt(embedding.second(i));
446 generalized_eigendecomposition<DenseSymmetricMatrix,DenseSymmetricMatrix,DenseInverseMatrixOperation>(
452 projecting_function);
485 static_cast<ScalarType>((
n_vectors-1)/3.0));
500 .
inRange(static_cast<ScalarType>(0.0),
501 static_cast<ScalarType>(1.0));
515 template <
class RandomAccessIterator,
class KernelCallback,
516 class DistanceCallback,
class FeaturesCallback>
517 ImplementationBase<RandomAccessIterator,KernelCallback,DistanceCallback,FeaturesCallback>
518 initialize(RandomAccessIterator begin, RandomAccessIterator end,
519 KernelCallback kernel, DistanceCallback
distance, FeaturesCallback features,
523 begin,end,kernel,
distance,features,pmap,ctx);
ImplementationBase(RandomAccessIterator b, RandomAccessIterator e, KernelCallback k, DistanceCallback d, FeaturesCallback f, ParametersSet &pmap, const Context &ctx)
void run(double *X, int N, int D, double *Y, int no_dims, double perplexity, double theta)
ScalarType distance(Callback &cb, const CoverTreePoint< RandomAccessIterator > &l, const CoverTreePoint< RandomAccessIterator > &r, ScalarType upper_bound)
TapkeeOutput embedDiffusionMap()
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)
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()
Parameter global_strategy
static const IndexType SkipOneEigenvalue
SparseWeightMatrix hessian_weight_matrix(RandomAccessIterator begin, RandomAccessIterator end, const Neighbors &neighbors, PairwiseCallback callback, const IndexType target_dimension)
TAPKEE_INTERNAL_PAIR< tapkee::SparseWeightMatrix, tapkee::DenseDiagonalMatrix > Laplacian
TapkeeOutput embedNeighborhoodPreservingEmbedding()
Eigen library dense method (could be useful for debugging). Computes all eigenvectors thus can be ver...
static const IndexType SkipNoEigenvalues
DenseSymmetricMatrix compute_distance_matrix(RandomAccessIterator begin, RandomAccessIterator, const Landmarks &landmarks, PairwiseCallback callback)
IndexType current_dimension
TapkeeOutput embedLocalityPreservingProjections()
TapkeeOutput embedHessianLocallyLinearEmbedding()
bool is_cancelled() const
TapkeeOutput embedEmpty()
TapkeeOutput embedManifoldSculpting()
CheckedParameter checked()
TapkeeOutput embedFactorAnalysis()
double ScalarType
default scalar value (can be overrided with TAPKEE_CUSTOM_INTERNAL_NUMTYPE define) ...
TAPKEE_INTERNAL_PAIR< tapkee::DenseSymmetricMatrix, tapkee::DenseSymmetricMatrix > DenseSymmetricMatrixPair
TapkeeOutput embedPassThru()
DenseSymmetricMatrixPair construct_neighborhood_preserving_eigenproblem(SparseWeightMatrix W, RandomAccessIterator begin, RandomAccessIterator end, FeatureVectorCallback feature_vector_callback, IndexType dimension)
An exception type that is thrown when computations were cancelled.
Eigen::SparseMatrix< tapkee::ScalarType > SparseWeightMatrix
sparse weight matrix type (non-overridable)
DenseSymmetricMatrix compute_diffusion_matrix(RandomAccessIterator begin, RandomAccessIterator end, DistanceCallback callback, const IndexType timesteps, const ScalarType width)
Computes diffusion process matrix. Uses the following algorithm:
TapkeeOutput embedtDistributedStochasticNeighborEmbedding()
DenseSymmetricMatrix compute_shortest_distances_matrix(const RandomAccessIterator &begin, const RandomAccessIterator &end, const Neighbors &neighbors, DistanceCallback callback)
Computes shortest distances (so-called geodesic distances) using Dijkstra algorithm.
Parameter target_dimension
Eigen::Matrix< tapkee::ScalarType, Eigen::Dynamic, 1 > DenseVector
dense vector type (non-overridable)
DenseMatrix triangulate(RandomAccessIterator begin, RandomAccessIterator end, PairwiseCallback distance_callback, const Landmarks &landmarks, const DenseVector &landmark_distances_squared, EigendecompositionResult &landmarks_embedding, IndexType target_dimension)
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
DimensionReductionMethod
Dimension reduction methods.
TapkeeOutput embedLinearLocalTangentSpaceAlignment()
DistanceCallback distance
Parameter check_connectivity
TapkeeOutput embedIsomap()
RandomAccessIterator begin
DenseVector compute_mean(RandomAccessIterator begin, RandomAccessIterator end, FeatureVectorCallback callback, IndexType dimension)
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)
A pimpl wrapper for projecting function.
static tapkee::ProjectingFunction unimplementedProjectingFunction()
Return result of the library - a pair of DenseMatrix (embedding) and ProjectingFunction.
CheckedParameter & inRange(T lower, T upper)
TAPKEE_INTERNAL_VECTOR< tapkee::tapkee_internal::LocalNeighbors > Neighbors
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()
ImplementationBase< RandomAccessIterator, KernelCallback, DistanceCallback, FeaturesCallback > initialize(RandomAccessIterator begin, RandomAccessIterator end, KernelCallback kernel, DistanceCallback distance, FeaturesCallback features, ParametersSet &pmap, const Context &ctx)
An exception type that is thrown when unsupported method is called.
TAPKEE_INTERNAL_PAIR< tapkee::DenseMatrix, tapkee::DenseVector > EigendecompositionResult
TapkeeOutput embedRandomProjection()
TapkeeOutput embedLandmarkMultidimensionalScaling()
TapkeeOutput embedStochasticProximityEmbedding()
Landmarks select_landmarks_random(RandomAccessIterator begin, RandomAccessIterator end, ScalarType ratio)
Parameter neighbors_method
TAPKEE_INTERNAL_VECTOR< tapkee::IndexType > Landmarks
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)
CheckedParameter & inClosedRange(T lower, T upper)
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)
Basic ProjectionImplementation that subtracts mean from the vector and multiplies projecting matrix w...
TapkeeOutput embedLandmarkIsomap()
SparseWeightMatrix tangent_weight_matrix(RandomAccessIterator begin, RandomAccessIterator end, const Neighbors &neighbors, PairwiseCallback callback, const IndexType target_dimension, const ScalarType shift, const bool partial_eigendecomposer=false)