Profile
Back to NewsBack
GitHub Trending 4 min
Reader Mode
jameschapman19/cca_zoo: Canonical Correlation Analysis Zoo: A collection of Regularized, Deep Learning based, Kernel, and Probabilistic methods in a scikit-learn style framework

jameschapman19/cca_zoo: Canonical Correlation Analysis Zoo: A collection of Regularized, Deep Learning based, Kernel, and Probabilistic methods in a scikit-learn style framework

12 hours ago

CCA-Zoo

CCA-Zoo

Multiview Canonical Correlation Analysis in Python

PyPI</a> Python</a> CI</a> codecov</a> DOI</a> License: MIT</a> uv</a> Ruff</a> Types: mypy strict</a>

CCA-Zoo is a Python library of **reference implementations of Canonical Correlation Analysis (CCA) algorithms from the literature**, from classical CCA (Hotelling 1936) through sparse, kernel, deep, and probabilistic variants — each documented with the paper it comes from. It's also built to be used directly: every model follows the same scikit-learn estimator API (fit, transform, fit_transform, score), is fully typed (PEP 561), and is tested against known closed-form solutions where one exists.


Installation

uv add cca-zoo        # or: pip install cca-zoo

Install optional extras as needed:

uv add "cca-zoo[deep]"          # DCCA variants (requires PyTorch + Lightning)
uv add "cca-zoo[probabilistic]" # Probabilistic CCA (requires NumPyro + JAX)
uv add "cca-zoo[tree]"          # TreeCCA (requires XGBoost, optionally LightGBM)
uv add "cca-zoo[all]"           # Everything above

(substitute pip install for uv add if you're not using uv)


Quick start

from cca_zoo.datasets import JointData
from cca_zoo.linear import CCA

Generate correlated two-view data from a linear latent variable model

data = JointData( n_views=2, n_samples=200, n_features=[50, 50], latent_dimensions=2, signal_to_noise=2.0, random_state=0, ) train_views = data.sample() test_views = data.sample()

Fit CCA and evaluate

model = CCA(latent_dimensions=2).fit(train_views) print(model.score(test_views)) # canonical correlations, shape (2,)

Project views into the shared latent space

z1, z2 = model.transform(test_views) # each shape (200, 2)

Available methods

cca_zoo.linear

| Class | Description | Views | |---|---|---| | CCA | Standard CCA (Hotelling 1936) | 2 | | rCCA | Regularised CCA / canonical ridge | 2 | | PLS | Partial Least Squares | 2 | | MCCA | Multiset CCA — pairwise sum objective | ≥2 | | GCCA | Generalised CCA — shared latent projection | ≥2 | | TCCA | Tensor CCA — higher-order cross-moment | ≥2 | | PartialCCA | CCA adjusted for confounding variables (Rao 1969) | ≥2 | | GRCCA | Group-regularised CCA (Tuzhilina, Tozzi & Hastie 2021) | ≥2 | | CCAR3 | CCA via reduced-rank regression, row-sparse in high dimensions (Donnat & Tuzhilina 2024) | 2 | | CCAEY | Eckart-Young CCA, full-batch L-BFGS-B (2 or more views) | ≥2 | | PLSEY | Eckart-Young PLS, full-batch L-BFGS-B | ≥2 | | StochasticCCAEY | CCAEY, fit by mini-batch momentum SGD | ≥2 | | SCCA_PMD | Sparse CCA via PMD (Witten 2009) | ≥2 | | SCCA_ADMM | Sparse CCA via ADMM (Suo 2017) | ≥2 | | SCCA_IPLS | Sparse CCA via iterative PLS (Mai & Zhang 2019) | ≥2 | | SCCA_Span | Hard-threshold ALS inspired by SpanCCA (Asteris 2016) | ≥2 | | ElasticCCA | Elastic net regularised CCA (Waaijenborg 2008) | ≥2 | | ParkhomenkoCCA | Soft-threshold sparse CCA (Parkhomenko 2009) | ≥2 | | SAR | Sparse alternating regression, BIC-selected penalty (Wilms & Croux 2015) | ≥2 | | PLS_ALS | ALS variant of PLS (power iteration) | ≥2 |

cca_zoo.nonparametric

| Class | Description | |---|---| | KCCA | Kernel CCA | | KGCCA | Kernel Generalised CCA | | KTCCA | Kernel Tensor CCA |

cca_zoo.tree (requires [tree])

| Class | Description | Views | |---|---|---| | TreeCCA | Gradient-boosted-tree CCA (Eckart-Young objective) | ≥2 |

cca_zoo.gam

| Class | Description | Views | |---|---|---| | GAMCCA | Generalized-additive-model CCA (Eckart-Young objective) | ≥2 |

cca_zoo.gp

| Class | Description | Views | |---|---|---| | GPCCA | Gaussian-process CCA (Eckart-Young objective), with predictive uncertainty | ≥2 |

cca_zoo.sparse

| Class | Description | Views | |---|---|---| | ElasticNetCCA | Sparse linear CCA via coordinate descent (Eckart-Young objective) | ≥2 |

cca_zoo.deep (requires [deep])

Built on PyTorch Lightning — models are trained with a standard lightning.Trainer, not a fit() wrapper. See the deep learning guide.

| Class | Reference | |---|---| | DCCA | Andrew et al. 2013 — pluggable objective | | DCCA_EY | Eigengame / Eckart-Young objective | | DCCA_NOI | Wang et al. 2015 — non-linear orthogonal iterations | | DCCA_SDL | Chang et al. 2018 — stochastic decorrelation loss | | DCCAE | Wang et al. 2015 — with autoencoder reconstruction | | DVCCA | Wang et al. 2016 — variational | | DTCCA | Wong et al. 2021 — deep tensor CCA | | DMCCA | Deep multiset CCA — pairwise-sum objective, ≥2 views | | DGCCA | Benton et al. 2019 — deep generalised CCA, ≥2 views | | SplitAE | Split autoencoder baseline | | BarlowTwins | Zbontar et al. 2021 | | VICReg | Bardes et al. 2022 |

cca_zoo.probabilistic

| Class | Reference | |---|---| | GFA | Klami, Virtanen & Kaski 2013 — Group Factor Analysis, per-view ARD; no extra dependencies | | ProbabilisticCCA (requires [probabilistic]) | Bach & Jordan 2005 — MCMC via NumPyro | | VariationalBayesCCA (requires [probabilistic]) | Wang 2007 — variational inference + ARD via NumPyro |

cca_zoo.model_selection

| Class | Description | |---|---| | GridSearchCV | Cross-validated hyperparameter search for multiview models |


Documentation

Full documentation, user guides, and API reference at: https://jameschapman19.github.io/cca_zoo/

See CHANGELOG.md for what's changed between releases.


Citing

If CCA-Zoo is useful in your research, please cite:

@article{Chapman2021,
  title   = {{CCA-Zoo}: A collection of Regularized, Deep Learning based, Kernel,
             and Probabilistic {CCA} methods in a scikit-learn style framework},
  author  = {Chapman, James and Wang, Hao-Ting and Wells, Lennie and Wiesner, Johannes},
  journal = {Journal of Open Source Software},
  volume  = {6},
  number  = {68},
  pages   = {3823},
  year    = {2021},
  doi     = {10.21105/joss.03823},
}

Contributing

Contributions are welcome. See docs/contributing.md for development setup, coding standards, and pull request guidelines. Please also read our Code of Conduct.

Found a security issue? See SECURITY.md for how to report it privately.

Chat with me