2026-02-09 16:15:41 +01:00
|
|
|
|
# Sparse Optimization
|
|
|
|
|
|
|
2026-02-09 18:31:14 +01:00
|
|
|
|
Sparse PCA, Elastic Net, and Box–Tao decomposition with Rust speed.
|
2026-02-09 16:15:41 +01:00
|
|
|
|
|
|
|
|
|
|
## Sparse PCA
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
import numpy as np
|
|
|
|
|
|
from optimizr import sparse_pca_py
|
|
|
|
|
|
|
|
|
|
|
|
X = np.random.randn(500, 20)
|
|
|
|
|
|
components = sparse_pca_py(X, n_components=5, l1_ratio=0.15)
|
|
|
|
|
|
print(components.shape) # (5, 20)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-02-09 18:31:14 +01:00
|
|
|
|
- Output: component matrix `(n_components, n_features)`; rows are sparse loadings.
|
|
|
|
|
|
- Tuning: increase `l1_ratio` for harder sparsity; decrease to retain variance.
|
|
|
|
|
|
|
2026-02-09 16:15:41 +01:00
|
|
|
|
## Elastic Net
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
import numpy as np
|
|
|
|
|
|
from optimizr import elastic_net_py
|
|
|
|
|
|
|
|
|
|
|
|
X = np.random.randn(200, 8)
|
|
|
|
|
|
y = np.random.randn(200)
|
|
|
|
|
|
coeffs = elastic_net_py(X, y, l1_ratio=0.3, alpha=0.01)
|
|
|
|
|
|
print(coeffs)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-02-09 18:31:14 +01:00
|
|
|
|
- Handles collinearity better than pure Lasso; use for factor shrinkage.
|
|
|
|
|
|
- Sweep `alpha` on a log scale (e.g., $10^{-3}$ to $10^{-1}$) and pick via validation.
|
|
|
|
|
|
|
|
|
|
|
|
## Box–Tao decomposition
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
from optimizr import box_tao_decomposition_py
|
|
|
|
|
|
solution = box_tao_decomposition_py(X)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Useful for constrained sparse decomposition problems; the Rust backend keeps iterations fast.
|
|
|
|
|
|
|
|
|
|
|
|
## Practical notes
|
|
|
|
|
|
- Inputs must be NumPy arrays; standardize features for stable conditioning.
|
|
|
|
|
|
- For high dimensional data, start with fewer components/features to avoid over-regularization.
|
|
|
|
|
|
- Combine with risk metrics: use sparse loadings to build interpretable factors, then evaluate with `compute_risk_metrics_py`.
|