Skip to main content

CMAD: A Lightweight Framework for Extreme Spatio-Temporal Anomaly Detection

Project description

Convolution Matrix Anomaly Detection (CMAD)

CMAD is a lightweight, unsupervised framework for detecting clusters of negative spatio-temporal anomalies in sequential 2D data. It is designed for applications such as ice melt detection, environmental degradation, loss analysis, and decline-focused change detection.

CMAD operates on consecutive time steps, requires no labels, and adapts automatically to arbitrary spatial resolutions.


⚠️ Important Version Note

This version of CMAD detects clusters of negative anomalies only.

An anomalous event is identified when a spatially contiguous cluster of locations exhibits an extreme negative change between consecutive time steps that exceeds the normal (e.g., loss, decrease, melting, erosion).

Positive changes are intentionally ignored in this release.


Key Features

  • ✔ Unsupervised (no training labels required)
  • ✔ Works with images or generic 2D time-series arrays
  • ✔ Supports arbitrary spatial dimensions (no fixed size)
  • ✔ Adaptive IQR-based thresholding
  • ✔ Binary anomaly masks (1 = anomaly, 0 = normal)
  • ✔ CPU-only by default (GPU-ready via PyTorch)
  • ✔ Suitable for large spatio-temporal datasets

Method Overview

Given a time series of 2D data
[ X = {X_1, X_2, \dots, X_T}, \quad X_t \in \mathbb{R}^{H \times W} ]

CMAD performs:

  1. Temporal differencing [ D_t = X_{t+1} - X_t ]

  2. 2×2 convolution with stride-2 downsampling

    • Captures localized spatial changes while reducing resolution
  3. Second-stage 2×2 pooling

    • Aggregates local neighborhoods to emphasize spatially coherent patterns
  4. Adaptive IQR-based thresholding

    • Per-cell thresholds learned from training data
  5. Back-projection

    • Detected anomalous regions are mapped back to the original spatial resolution using back projection strategy
  6. Negative-only cluster filtering

    • A region is marked anomalous only if:
      • It exceeds the adaptive threshold and
      • The temporal difference is negative
      • The signal forms a spatially contiguous cluster

Demo Code

from cmad import CMAD
import numpy as np

X_train = np.random.randn(30, 64, 64)
X_test  = np.random.randn(10, 64, 64)


#Demo Code for CPU
cmad = CMAD(device="cpu")
cmad.fit_from_array(X_train)

anomaly_masks = cmad.predict_from_array(X_test)
print(anomaly_masks.shape)  # (T-1, H, W)


## Demo Code for GPU (cuda)
cmad = CMAD(device="cuda")
cmad.fit_from_array(X_train)
anomaly_masks = cmad.predict_from_array(X_test)

## Demo Code for Apple Silicon (MPS)
cmad = CMAD(device="mps")
cmad.fit_from_array(X_train)
anomaly_masks = cmad.predict_from_array(X_test)

Synthetic Demo Example

import numpy as np
import matplotlib.pyplot as plt
from cmad import CMAD

T, H, W = 20, 50, 50
X = np.random.randn(T, H, W)

# Inject negative anomaly
X[10:, 20:25, 20:25] -= 5

X_train = X[:15]
X_test = X[15:]

cmad = CMAD(device="cpu")
cmad.fit_from_array(X_train)

anomaly_masks = cmad.predict_from_array(X_test)

accumulated = anomaly_masks.sum(axis=0)
plt.imshow(accumulated, cmap="hot")
plt.colorbar()
plt.title("Accumulated Negative Anomalies")
plt.show()

Installation

pip install cmad

Citation

If you use CMAD in your research, please cite the following paper:

@inproceedings{devnath2024cmad,
  author    = {Maloy Kumar Devnath and Sudip Chakraborty and Vandana P. Janeja},
  title     = {CMAD: Advancing Understanding of Geospatial Clusters of Anomalous Melt Events in Sea Ice Extent},
  booktitle = {Proceedings of the 32nd ACM SIGSPATIAL Conference},
  year      = {2024},
  publisher = {ACM},
  doi       = {10.1145/3678717.3691280}
}

Full Reference

Maloy Kumar Devnath, Sudip Chakraborty, and Vandana P. Janeja. 2024.
CMAD: Advancing Understanding of Geospatial Clusters of Anomalous Melt Events in Sea Ice Extent.
Proceedings of the 32nd ACM International Conference on Advances in Geographic Information Systems (SIGSPATIAL ’24).
ACM. https://doi.org/10.1145/3678717.3691280

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cmad-0.1.0.post3.tar.gz (10.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cmad-0.1.0.post3-py3-none-any.whl (8.4 kB view details)

Uploaded Python 3

File details

Details for the file cmad-0.1.0.post3.tar.gz.

File metadata

  • Download URL: cmad-0.1.0.post3.tar.gz
  • Upload date:
  • Size: 10.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.17

File hashes

Hashes for cmad-0.1.0.post3.tar.gz
Algorithm Hash digest
SHA256 ca33f5cfa7cec49949f84e476d27e53745bf8e832be8b5eda23e65363f22d164
MD5 36969087cf92225536ced3db0df660d8
BLAKE2b-256 aaab1903764232d2abf76d65c27e3012bd8b9bf0cc00a20036767d1134c0228f

See more details on using hashes here.

File details

Details for the file cmad-0.1.0.post3-py3-none-any.whl.

File metadata

  • Download URL: cmad-0.1.0.post3-py3-none-any.whl
  • Upload date:
  • Size: 8.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.17

File hashes

Hashes for cmad-0.1.0.post3-py3-none-any.whl
Algorithm Hash digest
SHA256 cdc3f4a3db3fbb46b1877358b48ee476a39599d364e02359ee6382639cd4e8a1
MD5 ed65e6529e1ca0c9c1f7152369644f8c
BLAKE2b-256 4cae56e39446b484231a6a29eb98fe005039ec6dc7a32fa00cfbf5dc1bf746bc

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page