sparse_simpls — Sparse SIMPLS (Chun & Keleş 2010)

Group: Sparse · Registry tolerance: 1e-08

Description

Sparse SIMPLS with soft-threshold lambda

Registry note — R spls 2.3.2 (Chun & Keles 2010) is the canonical external reference. The in-tree NumPy port SparseSimplsPythonReference provides a hermetic alternative when R is unavailable.

Parameters

Name

Type

Default

Notes

n_components

int

4

registry benchmark cell value

sparsity_lambda

float

0.05

registry benchmark cell value

Explanations

Bibliographic source

Chun, H. & Keleş, S. (2010). Sparse partial least squares regression for simultaneous dimension reduction and variable selection. Journal of the Royal Statistical Society: Series B 72(1), 3–25. DOI 10.1111/j.1467-9868.2009.00723.x.

Mathematical principle

The default sparse path follows the Chun–Keles/R spls pattern. At each step a cross-covariance direction Z is soft-thresholded at \(\eta\max_j|Z_j|\); nonzero variables are accumulated, ordinary SIMPLS is refitted on that active union, and Y is deflated for the next component. The final model is therefore a SIMPLS refit on the selected columns, not merely a permanently thresholded weight vector.

Appropriate uses

Joint linear prediction and variable screening when a compact wavelength set is required.

Limits and validation

The selected set depends on eta and component count; the default Chun–Keles-style path differs from the optional legacy thresholding path.

Implementation

The standard branch is implemented in cpp/src/core/model.cpp. Setting the legacy compatibility switch selects the older per-component absolute-threshold algorithm, so results from the two branches are not interchangeable.

Sources and provenance

Current implementation: cpp/src/core/model.cpp.

API and bindings

C ABI (ABI 2): n4m_estimators_sparse_simpls_fit. Use the linked public header for the exact signature, configuration, and result handles.

Python: no current AST-verified public n4m re-export was found for this method. The linked C ABI above is the documented surface in this checkout.

R (source-verified): sparse_simpls_fit(X, Y, n_components, sparsity_lambda = 0.05).

The source signature has additional required inputs, so no example call is fabricated.

MATLAB / Octave (source-verified): sparse_simpls(X, Y, n_components, sparsity_lambda).

The source signature has additional required inputs, so no example call is fabricated.

Registry parity references 📐

  • 📐 ref.python_chun_keles_spls (python · python) — chun_keles_spls 1.0 · strict (rmse_rel ≤ 1e-08) — In-tree NumPy port of Chun & Keles 2010 sparse PLS (the default pls2 / simpls configuration of R spls::spls). Verified against the R 2.3.2 package on the parity cells.

  • 📐 ref.r_spls (R · r) — spls 2.3.2 · strict (rmse_rel ≤ 1e-08) — R spls 2.3.2 (Chun & Keles). Predicts via the regression coefficient matrix from sparse-thresholded SIMPLS.

Benchmarks

Archived measurement identity. Backend labels in this table are the raw IDs recorded when the benchmark ran (including historical pls4all.* IDs). They preserve measurement provenance and do not describe a current public Python, R, or MATLAB binding; use the source-verified API and bindings section above for current entry points.

Adaptive wall-clock per cell measured against full_matrix.csv. Only backends that implement this method are listed; libraries without the method are omitted.

Verdict  ·  ✓ ref / ≈ ref / ~ shape mark a reference-gate pass at strict / relaxed / qualitative tolerance  ·  ✓ bind = archived binding-harness result agrees with the C++ baseline  ·  ⇄ cross-check = documented by-design selector/RNG/model, noncanonical API/facade convention, or secondary oracle  ·  ✗ divergent  ·  ⚠ error  ·  — not run. The fastest backend per column is marked 🏆.

Reference gate: strict — numeric equivalence (rmse_rel_tol ≤ 1e-08).

Rows tagged with 📐 are the canonical parity references for this method (declared in parity_timing.registry). C++ and external rows show reference parity; archived language-harness rows show binding parity against the C++ backend. Hover the icon for role and tolerance band.

BackendParity200×50 (ms)
C++ native · libn4m
pls4all.cpp.blas+omp✓ ref 7e-161.89 ms
Python · archived pls4all benchmark
pls4all.python✓ bind1.93 ms
pls4all.sklearn✓ bind1.88 ms🏆
R · archived pls4all benchmark
pls4all.R✓ 5e-154.60 ms
pls4all.R.formula✓ 5e-155.64 ms
pls4all.R.mdatools✓ 5e-156.30 ms
pls4all.R.pls✓ 5e-155.36 ms
Python · external
📐ref.python_chun_keles_splssource3.55 ms
R · external
📐ref.r_spls⇄ +6e-1513.4 ms
BackendParity200×50 (ms)
C++ native · libn4m
pls4all.cpp.blas+omp✓ ref 7e-161.93 ms
Python · archived pls4all benchmark
pls4all.python✓ bind1.87 ms🏆
pls4all.sklearn✓ bind1.92 ms
R · archived pls4all benchmark
pls4all.R✓ 5e-154.97 ms
pls4all.R.formula✓ 5e-156.05 ms
pls4all.R.mdatools✓ 5e-156.32 ms
pls4all.R.pls✓ 5e-155.77 ms
Python · external
📐ref.python_chun_keles_splssource3.54 ms
R · external
📐ref.r_spls⇄ +6e-1512.8 ms
BackendParity200×50 (ms)
C++ native · libn4m
pls4all.cpp.blas+omp✓ ref 7e-161.91 ms🏆
Python · archived pls4all benchmark
pls4all.python✓ bind1.98 ms
pls4all.sklearn✓ bind1.95 ms
R · archived pls4all benchmark
pls4all.R✓ 5e-154.83 ms
pls4all.R.formula✓ 5e-155.49 ms
pls4all.R.mdatools✓ 5e-156.00 ms
pls4all.R.pls✓ 5e-155.74 ms
Python · external
📐ref.python_chun_keles_splssource3.58 ms
R · external
📐ref.r_spls⇄ +6e-1512.0 ms

See also: benchmark overview · methods index · interactive dashboard