BatteryMHM: a 557-feature "harmonic" descriptor that beats a deep NeuralODE on battery state-of-health — CPU-only, no weights
▲ 22 r/huggingface+4 crossposts

BatteryMHM: a 557-feature "harmonic" descriptor that beats a deep NeuralODE on battery state-of-health — CPU-only, no weights

I’ve open-sourced the method behind a battery state-of-health model that, somewhat annoyingly for my own priors, beats a published deep net on a standard benchmark using only tree ensembles on CPU.

The idea. Instead of feeding raw cycling curves to an RNN/transformer, I fold every measurement into a 9-class “harmonic” space (HIN(k) = 1 + ((k−1) mod 9)), score pairwise interactions through a fixed 9×9 compatibility matrix, and aggregate into a 557-dim descriptor (Chi histograms, Markov transitions, a Miller-sequence multi-scale calculus, entropy). Then ExtraTrees + XGBoost.

Result (MIT–Stanford–TRI / Severson et al., Nature Energy 2019, 144 cells, 5-fold CV, 30% observation window ≈ 45 cycles):

|Model |MAE |RMSE |PCC |R² |

|This method |**0.0114**|**0.0200**|0.884|0.747|

|Attentive NeuralODE (Li 2021) |0.012 |0.020 |0.900|0.810|

|RF (Microsoft BatteryML, ICLR’24)|0.2459 |0.3140 |0.610|0.269|

Wins MAE/RMSE; still behind the NeuralODE on PCC/Spearman/R² (it’s not a clean sweep). 21.6× lower MAE than BatteryML’s strongest sklearn baseline, with a shorter window.

Honest limitations. On the materials track (Matbench mp_e_form) the same descriptor gets 0.1513 eV/atom — beats the classic RF+Magpie baseline but is well behind modern GNNs (CGCNN/CHGNet). The bundled demo is synthetic (a signal check, not the benchmark). No trained weights are shipped — you train your own (seconds, CPU). License is CC-BY-NC-4.0 and the method is patent-pending, so it’s “open to read/run/research,” not OSI-open — flagging that up front.

Repo (method, demo, tests, docs): https://huggingface.co/williamTLmiller/batterymhm

pip install "git+https://huggingface.co/williamTLmiller/batterymhm"

python demo.py

I’m genuinely curious about: is the win mostly the modular fold-map representation, or just that trees beat small-data deep nets on ~144 cells? I’d love for people to (a) try the descriptor on other sequence/tabular tasks, or (b) find their own way past 0.0114. Challenge thread is in the repo’s Community tab.

u/Ornery-Control2855 — 5 days ago