NASA C-MAPSS - Turbofan Degradation
A TMAP of 20,631 operating cycles from 100 simulated turbofan engines in the NASA C-MAPSS FD001 dataset, built from 15 z-scored sensor readings per cycle (cosine metric). The tree organizes cycles by sensor signature rather than by engine or time, so the mean remaining-useful-life (RUL) delta across tree edges is 42.9 cycles (204 edges exceed the 99th percentile at 289+ cycles). Lifecycle phases (healthy, degrading, failing) show moderate tree coherence (64.8% same-phase edges, mean subtree purity 0.599), with clear degrading-to-healthy transitions dominating (10,254 edges) over sudden degrading-to-failing jumps (3,748 edges). Failing cycles across all 100 engines cluster tightly together (concentration ratio 0.74, versus 1.0 for the whole map), and individual engine degradation paths - e.g. Engine 1's 89-hop, 10-transition path from RUL 191 to failure - can be traced directly on the tree alongside the underlying sensor drift (sensor s14 drops 27.7 units, s4 rises 26.6).
How it was made
import numpy as np
from tmap import TMAP
from tmap.graph.analysis import subtree_purity
# 15 sensors, dropped near-constant ones, z-scored per column
X = zscore_normalize(sensor_matrix[:, kept_sensor_cols])
model = TMAP(metric="cosine", n_neighbors=20, seed=42).fit(X)
# RUL gradient across tree edges
edges = model.tree_.edges
rul_delta = np.abs(rul[edges[:, 0]] - rul[edges[:, 1]])
print(f"Mean RUL gradient: {rul_delta.mean():.1f} cycles")
viz = model.to_tmapviz()
viz.add_color_layout("RUL", rul.tolist(), color="viridis")
viz.add_color_layout("lifecycle phase", phase_labels, categorical=True, color="Set1")
viz.write_html("turbofan_cmapss.html")