KOPA: A Kuramoto Oscillator Phase Adapter for Long-Term Forecasting of Periodic Multivariate Time Series

Nhan Thai · Tran Thanh Phuong✉

Faculty of Information Technology, Lac Hong University, Bien Hoa, Dong Nai, Vietnam

ICCIES 2027 · International Conference on Computational Intelligence in Engineering Science

In one paragraph

Traffic, electricity and weather series are dominated by a known cycle (the day, the week), but every channel sits at a slightly different phase of that cycle and the phase drifts within a window. KOPA treats the channels as what they physically are: a population of coupled oscillators. From the look-back window it estimates, in closed form, the harmonic profile and the phase drift of each channel, then propagates the phase deviations over the forecast horizon with the Kuramoto model

φ̇i = di + Σj Kij sin(φj − φi),   K = κ Ũ ŨT / (N r)

on a learned low-rank coupling graph, so that physically coupled channels pull each other back into alignment instead of fanning out. The coupled harmonic forecast is added to any backbone, which only has to model the residual. A per-channel gate initialised at zero makes the combined model start exactly at the backbone, and the adapter adds only N(r+1)+2 parameters.

Settings improved
67 / 72
6 datasets × 4 horizons × 3 backbones
Average MSE reduction
2.1 %
up to 10 % (C-Rössler, PatchTST)
Extra parameters
N(r+1)+2
82 on a 16-channel system, 4,312 on Traffic (862 channels)
Backbones
3
DLinear, PatchTST, iTransformer (+ CycleNet reference)

Results

Average MSE reduction of +KOPA over its backbone, averaged over three backbones and four horizons. Gains are largest where the fundamental cycle is strongest (PEMS04, PEMS08 and the coupled Rössler network).

DatasetNPPLVσd/ω1Gain (%)
Traffic862240.980.005+1.38
Electricity321240.940.013+1.31
PEMS043072880.970.058+1.72
PEMS081702880.970.058+3.57
Weather211440.460.257+1.34
C-Rössler16300.950.047+3.48
MSE reduction of +KOPA per dataset, horizon and backbone
MSE reduction of +KOPA over the backbone for each dataset and horizon. The gain is present at every horizon and does not vanish at the longest one.

What does the work: harmonic removal, drift, or coupling?

An ablation on DLinear separates the three ingredients. Harmonic removal alone (+Harm) provides the bulk of the gain on every dataset. Propagating the estimated phase drift (+Drift) adds on the two PEMS datasets and on the Rössler network. The Kuramoto coupling (+KOPA) adds a further 0.6–0.9 % on PEMS04 and PEMS08 — the two datasets whose channels are tightly phase-locked (high PLV) and drift at different rates (large σd). Two cheap window-level diagnostics therefore tell in advance when the coupling is worth enabling.

Ablation on DLinear
Ablation on the DLinear backbone: MSE reduction of the three variants, averaged over horizons.
Learned coupling matrices
Learned coupling matrices K (×103) for the 16-oscillator Rössler network and the 170 PEMS08 sensors. Training starts from the uniform mean-field coupling and learns which channels act as hubs of the phase dynamics.

Properties

Six elementary properties are stated and verified numerically: exact reduction to the backbone at initialisation (P0); exact recovery of harmonic coefficients on whole cycles (P1); approximate recovery of the detuning (P2); gradient-flow structure of the phase dynamics (P3); bounded phase dispersion under sufficient coupling from a phase-cohesive start (P4); and a Lipschitz bound of the harmonic-forecast error in terms of the phase error (P5).

Code

The code package contains the three backbones, the CycleNet reference, the KOPA module, the data loaders (auto-download of the public benchmarks, generator of the coupled Rössler network), the phase diagnostics, the numerical checks of P0–P5, and the resume-safe training grid that produces every number in the paper.

pip install -r requirements.txt
python diagnostics.py ./outputs      # Table 2 statistics
python theory_checks.py ./outputs    # Table 1 checks (P0–P5)
python train.py --out ./outputs      # full grid of the paper
python summarize.py ./outputs

Plugging KOPA into your own backbone takes four lines:

from models import KOPA
kopa = KOPA(L, H, N, P, mode='kopa')           # P = base period of the cycle
s_back, s_fut = kopa(x_normalised)             # (B, L, N), (B, H, N)
y = backbone(x_normalised - kopa.beta * s_back) + kopa.beta * s_fut

Citation

@inproceedings{thai2027kopa,
  title     = {{KOPA}: A {Kuramoto} Oscillator Phase Adapter for Long-Term Forecasting
               of Periodic Multivariate Time Series},
  author    = {Thai, Nhan and Tran, Thanh Phuong},
  booktitle = {International Conference on Computational Intelligence in Engineering
               Science (ICCIES)},
  year      = {2027}
}