Federated Design¶
The design rules behind the node/server split, and the notation used throughout these docs.
Rule 1 — The Locality Rule¶
Does this operation require both modalities simultaneously? No → node-local. Yes → server, and minimise what it receives.
Applied mechanically, this single question reproduces the whole architecture. It is also reusable: it is the scalpel to apply to any centralized method you want to federate.
The consequence is that communication cost concentrates entirely in the few coupled steps, which then become the scaling bottleneck; see Architecture.
Rule 2 — Split-Π¶
Centralized MaxFuse stores a matching as triples over both index spaces:
Federated MaxFuse splits it so each node holds only its own indices:
generalised as \(\Pi_{(\mathrm{i}-1,\,2)}\) for node index \(\mathrm{i} \in \{1,2\}\).
Indices are private; weights are shared. Node 1 learns that its cell k matched something with score \(w_k\), never which cell. The shared weights are what allow both nodes to apply the same pivot filter α independently and stay consistent without an extra round trip.
Rule 3 — Normalisation shifts the correlation¶
The trick that makes federated matching cheap. Centralized Pearson correlation is
If each node instead ships the mean-centred, L2-normalised matrix
then the server's correlation collapses to a plain dot product, \(\rho = X_1' \cdot X_2'^\top\), and the entire server matching kernel becomes
This is mathematically identical to the centralized computation. The normalisation work moves to the data owner, and the server does linear algebra on representations that have already been smoothed and rescaled.
Inherited, not invented
The reference implementation already centres per row and L2-normalises before its dot product
(maxfuse/utils.py::cdist_correlation). Fed-MaxFuse's contribution is recognising that this
factorisation is a federation boundary and moving the two normalisation lines to the nodes.
Rule 4 — Exchange projections, never features¶
Where a computation genuinely couples the nodes, as the singular-vector search inside CCA does, the exchanged object is a latent score vector of length N (samples) rather than a weight vector of length p (features).
Scores live in sample space and are already projections; saliences live in feature space and carry feature semantics. Sending scores is both smaller and less revealing. See Iterative Federated CCA.
Notation¶
| Symbol | Meaning |
|---|---|
| \(\mathrm{i} \in \{1,2\}\) | Node index |
| \(\mathbf{X}_\mathrm{i}\) | Node i's active (all-feature) dataset |
| \(\mathbf{X}_\mathrm{i}^\circ\) | Node i's shared (linked-feature) dataset |
| \(\mathbf{X}_\mathrm{i}^m\) | Meta-cell representation |
| \(\widetilde{\mathbf{X}}\), \(\mathbf{X}'\) | Fuzzily smoothed; L2-normalised |
| \(\mathbf{G}_{X_\mathrm{i}}\) | k-NN graph |
| \(\Pi_{(\mathrm{i}-1,\,2)}\) | Node i's half of the matching |
| \(w\) | Fuzzy smoothing interpolation weight |
| \(\alpha,\ \beta\) | Pivot and propagation filtering weights |
| \(T,\ C,\ K\) | Refinement iterations, CCA components, SVPM iterations |
| \(\xi_c,\ \omega_c\) | Latent score vectors |
| \(u_c,\ v_c\) | Salience (approximate singular) vectors |
Design trade-offs accepted¶
| Decision | Benefit | Cost |
|---|---|---|
| Star topology | Simple orchestration; one place to reason about | Single point of failure; message bottleneck |
| Exchange smoothed data | Large privacy improvement over raw | Not a formal guarantee |
| Split-Π with shared weights | Consistent filtering with no extra round trip | Weights leak match quality |
| Open sklearn's CCA into Mode B PLS | Makes CCA federable at all | Re-implementation must track upstream numerics |
| Noise-interpolated SVPM init | Avoids sharing a real data column | Adds a parameter to tune, though the sweep shows it barely matters |
| No federated batching | Simpler implementation | Accuracy gap on large asymmetric datasets |
That last row is the main known limitation; see Comparison with Centralized MaxFuse.