Skip to main content

Research-faithful sparse coding with Olshausen-Field paper-exact mode and modern L1/FISTA.

Project description

Sparse Coding - Research-Faithful Implementation

Paper-exact Olshausen & Field (1996) sparse coding with modern L1/FISTA optimization.

Python 3.9+ License: MIT

🚀 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.

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

sparse_coding-2.4.0.tar.gz (401.6 kB view details)

Uploaded Source

Built Distribution

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

sparse_coding-2.4.0-py3-none-any.whl (482.2 kB view details)

Uploaded Python 3

File details

Details for the file sparse_coding-2.4.0.tar.gz.

File metadata

  • Download URL: sparse_coding-2.4.0.tar.gz
  • Upload date:
  • Size: 401.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.3+

File hashes

Hashes for sparse_coding-2.4.0.tar.gz
Algorithm Hash digest
SHA256 444a9d377fb6e3a0ee9da69d69acc48342f2f89abf18c432e501366a4ec929ff
MD5 1714e6aaa30610c4b39e2daaa7ea0f61
BLAKE2b-256 fa3256574ed65cccf8fec02f83201ee4dcdcb8b68304691ad6e8db70017c120d

See more details on using hashes here.

File details

Details for the file sparse_coding-2.4.0-py3-none-any.whl.

File metadata

  • Download URL: sparse_coding-2.4.0-py3-none-any.whl
  • Upload date:
  • Size: 482.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.3+

File hashes

Hashes for sparse_coding-2.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 656b99c74face3c778b01d9355fe0c125751157e837d6377b7e456aba091286d
MD5 0ee965adc28ba05ec51dc79de67f35f3
BLAKE2b-256 c5f6b943db147ea27dedcda654c13b3da489e237a0274f0b6534f9717fd70b99

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