Code Monkey home page Code Monkey logo

dreimac's Introduction

PyPI version Downloads codecov License docs DOI

DREiMac: Dimensionality Reduction with Eilenberg-MacLane Coordinates

DREiMac is a library for topological data coordinatization, visualization, and dimensionality reduction. Currently, DREiMac is able to find topology-preserving representations of point clouds taking values in the circle, in higher dimensional tori, in the real and complex projective space, and in lens spaces.

In a few words, DREiMac takes as input a point cloud together with a topological feature of the point cloud (in the form of a persistent cohomology class), and returns a map from the point cloud to a well-understood topological space (a circle, a product of circles, a projective space, or a lens space), which preserves the given topological feature in a precise sense. For more information, please check the theory and examples in the documentation.

Basic usage

Here is a simple example; please check the Jupyter notebooks in the notebooks directory for further examples.

# basic imports
from dreimac import CircularCoords
from persim import plot_diagrams
import matplotlib.pyplot as plt
import numpy as np

# prepare plot with 4 subplots
f, (a0, a1, a2, a3) = plt.subplots(1, 4, width_ratios=[1, 1, 1, 0.2], figsize=(14,3))

# 200 samples from a noisy circle
n_samples = 200
np.random.seed(0)
Z = np.random.random((n_samples, 2)) - 0.5
X = Z / np.linalg.norm(Z, axis=1).reshape((n_samples, 1)) + (np.random.random((n_samples, 2)) - 0.5) * 0.2

# plot point cloud
a0.scatter(X[:,0], X[:,1], s=10)
a0.set_title("Input point cloud") ; a0.axis("off") ; a0.set_aspect("equal")

# plot the persistence diagram, showing a single prominent class
cc = CircularCoords(X, n_landmarks=200)
plot_diagrams(cc._dgms, title="Persistence diagram", ax=a1)

# plot the data colored by the circle-valued map constructed by DREiMac
circular_coordinates = cc.get_coordinates()
a2.scatter(X[:,0], X[:,1], c=circular_coordinates, s=10, cmap="viridis")
a2.set_title("Input colored by circular coordinate") ; a2.axis("off") ; a2.set_aspect("equal")

# plot colorbar
img = a3.imshow([[0,1]], cmap="viridis"); a3.set_visible(False)
cb = plt.colorbar(mappable=img,ticks=[0,0.5,1]) ; _ = cb.ax.set_yticklabels(["0","$\pi$","2$\pi$"])

output

More examples

For Jupyter notebooks with more examples, please check the documentation or this repository's docs/notebooks directory.

Installing

Make sure your Python version is >=3.8 and <3.12. DREiMac depends on the following python packages, which will be installed automatically when you install with pip: matplotlib, numba, numpy, persim, ripser, and scipy.

To install the latest release:

pip install dreimac

To install directly from GitHub:

pip install git+https://github.com/scikit-tda/DREiMac.git

Documentation and support

You can find the documentation here, including the API reference. If you have further questions, please open an issue and we will do our best to help you. Please include as much information as possible, including your system's information, warnings, logs, screenshots, and anything else you think may be of use.

Running the tests

If you want to check that your machine is running DREiMac properly, you may run the tests by running the following commands from the root directory of a clone of this repository.

pip install pytest
pip install -r requirements.txt
pytest .

Contributing

To contribute, you can fork the project, make your changes, and submit a pull request. If you're looking for a way to contribute, you could consider:

  • adding documentation to existing functionality;
  • adding missing tests to improve coverage;
  • adding a Jupyter notebook with a tutorial or demo;
  • adding functionality and the corresponding documentation and tests;
  • responding to a bug or feature request in the Github issues.

Citing

If you use this package, please cite the JOSS paper found here, using the following bibtex entry.

@article{Perea2023,
  doi = {10.21105/joss.05791},
  url = {https://doi.org/10.21105/joss.05791},
  year = {2023},
  publisher = {The Open Journal},
  volume = {8},
  number = {91},
  pages = {5791},
  author = {Jose A. Perea and Luis Scoccola and Christopher J. Tralie},
  title = {DREiMac: Dimensionality Reduction with Eilenberg-MacLane Coordinates},
  journal = {Journal of Open Source Software}
}

Acknowledgements

We thank Tom Mease for contributions and discussions. J.A.P. and L.S. were partially supported by the National Science Foundation through grants CCF-2006661 and CAREER award DMS-1943758.

License

This software is published under Apache License Version 2.0.

dreimac's People

Contributors

catanzaromj avatar ctralie avatar joperea avatar luisscoccola avatar tmease5580 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

dreimac's Issues

Circular coordinates on new points

Hello ๐Ÿ‘‹,

Thank you for this great implementation!

I would be interested in estimating the coordinates on a sample X and thenevaluating them at some new points X_new, that are in principle, close to the original ones. Is that feature available? Is it meaningful?

Looking at examples, I understood that what CircularCoordinates(X, n_landmarks).get_coordinates() returns is the evaluation of circular coordinates on X. Treating your code as a block-box, a first approach is to use nearest-neighbors to map X_new to X and then retrieve the coordinates. However, I'm thinking that one can certainly do better: if i understand well, you compute cohomology on landmarks L and you construct the coordinates on X. Is there an obstruction to using a different set of points, as long as it is contained in the offset of L? Would it be possible to obtain the function described in the output section?

If such a feature is not available, but you think it makes sense and it would be a good addition, I would happily contribute. Thank you for your help.

[JOSS] Software references in paper

Hi, first of all thanks for the well-written paper and great software! I love the detailed documentation with lots of examples, and how intuitive and easy to use it is.

I have a small comment regarding citing other software that you build upon. In particular, I think you should mention Ripser and Ripser.py as those are crucial to quickly computing persistent cohomology used to find circular coordinates. It might also be worth mentioning other software you use that has papers written on them (I could find papers on numba, matplotlib and numpy, you can decide which of these you want to include).

On a related note, my software package Ripserer also implements (a more limited form of) sparse circular coordinates. I understand that's easy to miss as I never advertised it and it is somewhat hidden in the docs. You could mention it alongside Dionysus in the statement of need.

Ref. #5791

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.