Sparse Coding - Research-Faithful Implementation
Paper-exact Olshausen & Field (1996) sparse coding with modern L1/FISTA optimization.
🚀 Paper-Exact Quickstart
# Install dependencies
python -m venv .venv && . .venv/bin/activate
pip install -U pip
pip install pillow matplotlib pyyaml
# Run paper-exact demo (requires natural images folder)
sparse-coding train --images ./images --out of_out --mode paper --seed 0
Outputs:
of_out/D.npy— learned dictionary (edge filters)of_out/A.npy— sparse coefficients- Reproduces classic Olshausen & Field (1996) results
⚡ CLI Quickstart
# Install package
pip install -e .[dev]
# Train dictionary from image folder
sparse-coding train --images ./images --out results --mode paper --seed 0
# Encode patches with existing dictionary
sparse-coding encode --dictionary results/D.npy --patches X.npy --out A.npy
# Reconstruct from sparse codes
sparse-coding reconstruct --dictionary results/D.npy --codes A.npy --out X_hat.npy
🔬 Python API
Modern L1 Sparse Coding (Fast)
import numpy as np
from sparse_coding import SparseCoder
# Create modern L1 sparse coder
coder = SparseCoder(n_atoms=128, mode='l1', seed=42)
# Fit dictionary to patches (p, N)
patches = np.random.randn(256, 10000) # 16x16 patches
coder.fit(patches, n_steps=30)
# Sparse encode new patches
codes = coder.encode(patches[:, :100])
# Reconstruct
reconstruction = coder.decode(codes)
Paper-Exact Olshausen & Field Mode
# Research-accurate reproduction
coder_paper = SparseCoder(
n_atoms=144, # Overcomplete dictionary
mode='paper', # Log sparsity penalty
ratio_lambda_over_sigma=0.14, # Paper's λ/σ ratio
seed=0
)
# Train with paper-exact alternating optimization
coder_paper.fit(whitened_patches, n_steps=50, lr=0.1)
# Results match original 1996 paper
dictionary = coder_paper.D # Edge-like receptive fields
📊 Key Features
- Paper-Exact Mode: Reproduces Olshausen & Field (1996) exactly
- Modern L1/FISTA: Fast optimization with KKT validation
- Zero-Phase Whitening: Research-accurate
R(f) = |f| exp(-(f/f₀)⁴)filter - Homeostatic Gains: Coefficient variance equalization
- CLI Interface: Train/encode/reconstruct from command line
- YAML Configs: Reproducible experiments with config files
🧪 Validation
The implementation passes rigorous tests:
- KKT Conditions: L1 solutions satisfy optimality conditions
- Sparsity Levels: 70-95% zero coefficients (typical)
- Paper Reproduction: Matches 1996 results on natural images
- Convergence: Objective decreases monotonically
⚙️ Configuration
Create config.yaml:
patch_size: 16
n_atoms: 144
n_steps: 50
lr: 0.1
f0: 200.0
samples: 50000
ratio_lambda_over_sigma: 0.14
Use with CLI:
sparse-coding train --images ./images --config config.yaml --out results
📚 Research Background
Implements the seminal sparse coding algorithm from:
Olshausen, B. A., & Field, D. J. (1996). Emergence of simple-cell receptive field properties by learning a sparse code for natural images. Nature, 381(6583), 607-609.
Key insight: Natural images can be efficiently represented using a sparse set of basis functions that resemble edge detectors found in primary visual cortex.
🎯 Mathematical Framework
Objective: Learn dictionary D and sparse codes A such that X ≈ DA
L1 Mode (Modern):
min_{D,A} ½‖X - DA‖²₂ + λ‖A‖₁
Paper Mode (Research-Exact):
min_{D,A} ½‖X - DA‖²₂ - λ ∑ log(1 + (aᵢ/σ)²)
Solved via alternating optimization with homeostatic gain control.
🔧 Installation & Development
# Development install
git clone https://github.com/your-repo/sparse-coding
cd sparse-coding
pip install -e .[dev]
# Run tests
pytest
# Lint code
ruff check .
mypy sparse_coding
📖 Citation
If you use this implementation in research:
@software{sparse_coding_2025,
title={Sparse Coding: Research-Faithful Implementation},
year={2025},
url={https://github.com/your-repo/sparse-coding}
}
@article{olshausen1996emergence,
title={Emergence of simple-cell receptive field properties by learning a sparse code for natural images},
author={Olshausen, Bruno A and Field, David J},
journal={Nature},
volume={381},
number={6583},
pages={607--609},
year={1996}
}
🏆 Why This Implementation?
- Research Faithful: Exact reproduction of seminal 1996 paper
- Modern Performance: Fast FISTA optimization for practical use
- Comprehensive: CLI, Python API, configs, validation
- Well-Tested: Passes KKT conditions and convergence tests
- Documented: Clear mathematical formulation and usage examples
Perfect for reproducing classic results or building modern sparse coding applications.
Metadata
Release files for sparse-coding 2.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sparse_coding-2.4.0.tar.gz | 401.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sparse_coding-2.4.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 883.7 kB
Release files / sparse_coding-2.4.0.tar.gz
| Download URL | sparse_coding-2.4.0.tar.gz |
|---|---|
| Size | 401.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
444a9d377fb6e3a0ee9da69d69acc48342f2f89abf18c432e501366a4ec929ff
|
|
BLAKE2b-256 checksum How to use checksums |
fa3256574ed65cccf8fec02f83201ee4dcdcb8b68304691ad6e8db70017c120d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.3+
|
Release files / sparse_coding-2.4.0-py3-none-any.whl
| Download URL | sparse_coding-2.4.0-py3-none-any.whl |
|---|---|
| Size | 482.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
656b99c74face3c778b01d9355fe0c125751157e837d6377b7e456aba091286d
|
|
BLAKE2b-256 checksum How to use checksums |
c5f6b943db147ea27dedcda654c13b3da489e237a0274f0b6534f9717fd70b99
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.3+
|