
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.