This repository contains the Manifold
class which uses the ISOMAP method (Tenenbaum, 2000) to characterize manifolds and extract latent variables. This latter component is accomplished with multidimensional scaling, though other methods such as locally linear embedding may be substituted. The notable drawback to ISOMAP is that it may be easily broken with outlier datapoints owing to its reliance on accurate geodesic distance calculation. However, ISOMAP remains an impressively accurate method of manifold mapping with few prior assumptions placed on the data. Other drawbacks include that the algorithm has O(N^3) complexity and that the manifold is defined by the downsampled graph rather than a set of equations that could be used to generate more points conforming to the underlying dynamics captured by the manifold.
To use this class, we first initialize the Manifold
object using manifold = Manifold("Description")
and load the data using manifold = manifold.createGraph(data)
. The resulting graph may be visualized with the function manifold.plotGraph()
. To implement the ISOMAP algorithm, we must first compute the geodesic distances between all nodes in the graph using the function manifold = manifold.shortestPath()
, followed by latent variable extraction via manifold = manifold.scale()
, which performs multidimensional scaling.
The data should be formatted as a MxN matrix with M observations and N dimensions.
Function | Purpose |
---|---|
createGraph() |
Create adjacency graph for performing ISOMAP |
latent() |
Function returning latent variables and corresponding original datapoints |
map() |
Map new datapoints to learned manifold |
plotGraph() |
Plot datapoints on adjacency graph |
scale() |
Perform multidimensional scaling using dissimilarity matrix |
shortestPath() |
Computing geodesic distances between points in adjacency graph |
This repository was used in the linked paper, which contains a more detailed explanation of ISOMAP and its drawbacks.