Skip to content

Repository files navigation

🛸 SETI Anomaly Detection

A from-scratch reimplementation of the Pardo et al. 2025 unsupervised technosignature-detection pipeline (arXiv:2505.03927), evaluated honestly on the labelled Kaggle SETI Breakthrough Listen dataset — plus Cadence Console, an interactive 3D web app for exploring the results.

Author: Satyansh Tripathi · built to share with the Penn State Extraterrestrial Intelligence Center (PSETI)

The Cadence Console point cloud — every cadence rendered as a star, positioned by its cross-correlation fingerprint and coloured by anomaly score

📄 Full write-up: report/writeup.pdf  ·  🎛️ Interactive app: Cadence Console


💡 The idea

Each sample is a cadence — 6 spectrograms taken while the telescope alternates between pointing at a target star (ON-target, planes 0/2/4) and away (OFF-target, planes 1/3/5):

Cadence order:  [ A ,  B ,  A ,  C ,  A ,  D ]
Plane index:      0    1    2    3    4    5
                 ON   OFF  ON   OFF  ON   OFF

A real technosignature appears only in the ON planes; human interference (RFI) shows up in all six. The whole pipeline is unsupervised — labels are used only for the final evaluation, never for training.


🔭 The pipeline (three filters)

# Filter Idea Code Notebook
1 Cross-correlation + UMAP + KDE Fingerprint how the 6 planes correlate, then score how close each cadence sits to a synthetic "real-signal" cluster src/cc_filter.py 03
2 Frequency rarity Model candidate frequencies with a GMM; a rare frequency is less RFI-like src/freq_score.py 04
3 Thumbnail similarity Do the 3 ON thumbnails clump together and away from the OFF ones? src/similarity_score.py 05

Combined score + evaluation: notebooks/06_evaluation.ipynb (src/evaluate.py).


📊 The honest result

On our 1,120-cadence local subset (the full 131 GB dataset doesn't fit locally), all three filters — and their combination — score near chance:

Score Filter 1 Filter 2 Filter 3 Combined
AUC-ROC 0.51 0.52 0.48 0.51

This is a carefully diagnosed negative result, not a tuned-to-labels number. A synthetic sanity check confirms the method does separate signals when ground truth is known (65% neighbour purity vs. a 1.6% chance baseline), and a supervised classifier can't beat chance on the same features either — so it isn't a UMAP/KDE bug. The likely cause: this Kaggle competition is genuinely hard for non-deep-learning methods, and 1,120 files is a tiny slice of the ~60,000-cadence survey. See the report for the full diagnosis, and kaggle_full_run.py to re-run the whole pipeline at full scale on Kaggle's mounted copy of the data.


🎛️ Cadence Console — try it yourself

An interactive 3D explorer for the pipeline: fly through a point cloud of every cadence, click any one to inspect its spectrogram and real filter scores, or inject a synthetic signal and watch it run through the live pipeline. Built with FastAPI + vanilla JS / Three.js — no CDNs, no build step, runs fully offline.

Click any cadence to inspect its 6-plane waterfall and real filter scores

Click a cadence → its 6-plane A/B/A/C/A/D waterfall + real Filter 1/2/3 scores.

Inject a synthetic signal and score it through the real pipeline

Inject a synthetic ON-target signal → scored live through the real pipeline.

Run it (from the project root, with the venv created — see Setup):

# 1. Build the cache once (~1–2 min): fits the models + 3D embedding
python app/generate_cache.py

# 2. Start the server
uvicorn app.server:app --port 8000

# 3. Open http://127.0.0.1:8000

On Windows you can skip activating the venv and call its Python directly:

D:\et_proj\venv\Scripts\python.exe app\generate_cache.py
D:\et_proj\venv\Scripts\python.exe -m uvicorn app.server:app --port 8000

More detail — endpoints, architecture, how injection is scored live — in app/README.md.


🗂️ Repository layout

src/         reusable pipeline code (loaders, the 3 filters, evaluation)
notebooks/   01 exploration → 06 evaluation (each walked through step by step)
app/         Cadence Console web app (FastAPI backend + Three.js frontend)
report/      writeup.pdf + all figures
assets/      screenshots used in this README
kaggle_full_run.py   run the whole pipeline at full scale on Kaggle

⚙️ Setup

See SETUP.md. In short: Python 3.11 venv, pip install -r requirements.txt. The Kaggle data is not committed (see .gitignore); download a local subset with download_subset.py, or use Kaggle Notebooks for full scale.


📚 Key references

  • Pardo et al. 2025arXiv:2505.03927 — the pipeline reimplemented here
  • Zhang et al. 2019 — arXiv:1901.04636 — self-supervised autoencoder for SETI
  • Brzycki et al. 2022 — setigen (synthetic signal generation)
  • Ma et al. 2023 — arXiv:2301.12670 — deep-learning search, 820 stars
  • Lebofsky et al. 2019 — Breakthrough Listen data format

📄 License

Released under the MIT License — free to use, modify, and share with attribution.

About

Unsupervised SETI technosignature-detection pipeline (Pardo et al. 2025 reimplementation) + Cadence Console 3D explorer app. Honest evaluation on the Kaggle Breakthrough Listen dataset.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages