---
name: Estimate Online Covariance
slug: estimate-online-covariance
category: Data
description: Estimate Online Covariance updates covariance, correlation, or precision matrices one observation at a time with precise. Use it for streaming data or as a partial_fit alternative to batch-only sklearn.covariance estimators.
github: "https://github.com/microprediction/precise/tree/main/.claude/skills/estimate-online-covariance"
language: Python
stars: 333
forks: 58
install: "npx degit https://github.com/microprediction/precise/tree/main/.claude/skills/estimate-online-covariance ~/.claude/skills/estimate-online-covariance"
installs_to: ~/.claude/skills/estimate-online-covariance
source_path: .claude/skills/estimate-online-covariance/SKILL.md
collection_size: 6
category_size: 668
collection_url: "https://dirskills.com/collections/microprediction/precise"
added: 2026-08-12T04:43:52.400Z
last_synced: 2026-08-12T04:43:52.400Z
canonical_url: "https://dirskills.com/skills/estimate-online-covariance"
---

# Estimate Online Covariance

Estimate Online Covariance updates covariance, correlation, or precision matrices one observation at a time with precise. Use it for streaming data or as a partial_fit alternative to batch-only sklearn.covariance estimators.

**Install:**

```bash
npx degit https://github.com/microprediction/precise/tree/main/.claude/skills/estimate-online-covariance ~/.claude/skills/estimate-online-covariance
```

## README

# Estimate online covariance with precise

`precise` provides sklearn-style estimators with a single `partial_fit` contract. Pure numpy.

```bash
pip install precise
```

## The pattern

```python
import numpy as np
from precise import EwaCovariance        # exponentially weighted; recency-biased

est = EwaCovariance(r=0.05)              # r in (0,1]; larger = faster forgetting
for y in stream:                         # y is a 1-D array (one observation)
    est.partial_fit(y)

est.covariance_     # (d, d) ndarray, symmetric and PSD by construction
est.correlation_    # unit-diagonal correlation
est.precision_      # inverse covariance (when well-conditioned)
est.location_       # running mean
est.n_samples_      # observations seen
```

`fit(X)` is the batch drop-in (`X` is 2-D, rows = observations); it resets then replays rows, so
it matches `sklearn.covariance`'s call shape.

## Choosing the class

`all_estimators()` lists every estimator; `estimator_from_name("LedoitWolfCovariance")` looks one up.
Sensible defaults by situation:

- general / recency-weighted: `EwaCovariance(r=...)`
- many variables relative to samples (p/n large) or ill-conditioned: `LedoitWolfCovariance`, `OASCovariance`, `ShrunkCovariance`, `FactorCovariance`
- heavy tails / outliers: `HuberCovariance`, `TylerCovariance`
- regime changes: `AdaptiveEwaCovariance`, `DCCCovariance`
- you don't know: use the **choose-covariance-estimator** skill (`suggest(X)`).

## Notes

- All estimators are truly online — constant work per observation, no growing buffers.
- State is a JSON-able dict: `est.get_state()` / `est.set_state(s)` for mid-stream checkpointing.
- `covariance_` is always symmetric PSD; don't hand-symmetrize or clip it yourself.
- Named series with a changing universe? Use the **keyed-dynamic-universe** skill instead.
