scientific-agent-skills 中的 Aeon 时间序列聚类实战:从距离度量、均值方法到深度聚类器
本篇围绕 scientific-agent-skills 仓库中 aeon 技能的聚类参考文档 clustering.md 展开,系统讲解 Aeon 为时间序列定制的聚类算法族——分区算法、大规模数据集方法、弹性距离聚类、谱聚类、深度聚类器与特征型聚类器——并逐一说明其适用场景、距离度量与均值方法的选择依据。读完本文后,你可以针对"时间序列已对齐 / 存在时间偏移 / 数据量巨大 / 需要可解释特征"等不同数据特征,快速选定合适的聚类方案,并基于 fit_predict、cluster_centers_ 等标准接口搭建可复现的聚类流水线。
1. 技能背景与运行环境
aeon 技能位于仓库的 skills/aeon/SKILL.md,是面向时间序列机器学习的 Agent 技能,覆盖分类、回归、聚类、预测、异常检测、分割与相似性搜索等任务。其 Front Matter 声明了明确的适用边界:
- 适用于时序数据、序列模式或时间索引观测,且需要超越标准 ML 方法的专用算法的场景;
- 要求 Python 3.10+,依赖
aeon包(通过uv pip install安装),深度学习及扩展依赖需要aeon[all_extras]; - 技能版本基于 aeon 1.x(文档对标 v1.4.0),1.0 版本重构了预测与变换模块,导入路径与 0.x/sktime 时代不同。
在测试侧,tests/skill-requirements.toml 中声明了该技能的最小运行包集合:
[skills.aeon]
packages = ["aeon", "matplotlib", "numpy", "scikit-learn"]
安装命令(引自 SKILL.md,zsh 下需给 extras 加引号):
uv pip install "aeon>=1.4,<2"
# 需要深度学习估计器时:
uv pip install "aeon[all_extras]>=1.4,<2"
SKILL.md 同时提示:上游将 forecasting、anomaly_detection、segmentation、similarity_search、visualisation 视为实验性模块,而 clustering 属于稳定模块,可以放心用于生产流水线——这正是本文聚焦聚类的原因。
2. 聚类算法族总览
Aeon 的核心价值在于为时序数据提供了专用距离度量与均值方法,使其聚类算法不再是把时间序列摊平后做普通 k-means,而是真正在"形状空间"上运算。参考文档将算法划分为六类,下面逐类说明。
2.1 分区算法(Partitioning)
标准 k-means/k-medoids 的时序适配版:
| 算法 | 说明 |
|---|---|
TimeSeriesKMeans |
支持时序距离度量(DTW、Euclidean 等)的 K-means |
TimeSeriesKMedoids |
以真实时间序列作为聚类中心(medoid 语义,中心必然可解释) |
TimeSeriesKShape |
基于形状的聚类算法 |
TimeSeriesKernelKMeans |
核方法变体,适合非线性模式 |
适用条件:已知聚类数目、预期簇形状近似球形。
2.2 大规模数据集方法
TimeSeriesCLARA—— Clustering LARge Applications,通过采样逼近 k-medoids;TimeSeriesCLARANS—— CLARA 的随机化搜索变体。
适用条件:数据集大到标准 k-medoids 无法承受,需要可扩展性。
2.3 弹性距离聚类
专为对齐型相似度设计:
KASBA—— 带平移不变弹性均值(shift-invariant elastic averaging)的 K-means;ElasticSOM—— 使用弹性距离的自组织映射(Self-Organizing Map)。
适用条件:时间序列之间存在时间平移或形变(warping)。这类算法在步态、心电、工业信号等"同一模式、不同相位"的数据上尤为合适。
2.4 谱方法(Spectral Methods)
KSpectralCentroid—— 带质心计算的谱聚类。
适用条件:簇形状非凸、需要基于图的聚类思路时。
2.5 深度学习聚类
基于自编码器的神经网络聚类,通过学到的低维表示做聚类:
| 聚类器 | 编码器结构 |
|---|---|
AEFCNClusterer |
全卷积自编码器(Fully Convolutional) |
AEResNetClusterer |
残差网络自编码器 |
AEDCNNClusterer |
膨胀卷积(Dilated CNN)自编码器 |
AEDRNNClusterer |
膨胀 RNN 自编码器 |
AEBiGRUClusterer |
双向 GRU 自编码器 |
AEAttentionBiGRUClusterer |
注意力增强的 BiGRU 自编码器 |
适用条件:大数据集、需要学习式表示、或存在复杂非线性模式。注意这类估计器属于可选扩展,需要 aeon[all_extras] 提供的深度学习依赖。
2.6 基于特征的聚类(Feature-Based)
先把时间序列变换到特征空间,再在特征上聚类:
Catch22Clusterer—— 基于 22 个经典时序特征(Catch22);SummaryClusterer—— 基于描述性统计量;TSFreshClusterer—— 基于 tsfresh 自动特征。
适用条件:原始序列难以直接刻画、需要可解释特征时。这与 transformations.md 中介绍的 Catch22、TSFresh、SevenNumberSummary 等 CollectionTransformer 一脉相承——特征型聚类器本质上是"变换器 + 常规聚类器"的组合封装。
2.7 组合:ClustererPipeline
ClustererPipeline 允许把变换器与聚类器串联,搭建自定义聚类流水线,例如先 Normalizer 归一化再交给 TimeSeriesKMeans。
3. 快速上手:DTW + 重心均值的 KMeans
参考文档给出的 Quick Start 完整继承如下。这里用 GunPoint 手势识别数据集的训练集做无监督聚类(以分类数据充当聚类输入),距离选用 DTW,均值方法选用重心平均(barycentric averaging):
from aeon.clustering import TimeSeriesKMeans
from aeon.datasets import load_classification
# 加载数据(借用分类数据集做聚类演示)
X_train, _ = load_classification("GunPoint", split="train")
# 对时间序列做聚类
clusterer = TimeSeriesKMeans(
n_clusters=3,
distance="dtw", # 使用 DTW 距离
averaging_method="ba" # 重心平均(barycentric averaging)
)
labels = clusterer.fit_predict(X_train)
centers = clusterer.cluster_centers_
要点解读:
distance="dtw":让簇内距离计算走弹性对齐路径,而非逐点比较,适合存在相位偏移的序列;averaging_method="ba":决定cluster_centers_如何由簇成员"平均"得到,这是时序聚类与普通 k-means 最本质的差异点(见第 5 节);fit_predict/cluster_centers_:与 scikit-learn 生态完全一致的估计器 API,可直接接入Pipeline、交叉验证等既有工具。
数据加载方面,datasets_benchmarking.md 说明自 aeon 1.4 起多数分类/回归归档托管在 Zenodo,首次使用时自动下载并缓存;也可用 get_dataset_meta_data("GunPoint") 查看样本数、长度、类别数等元数据,用于评估数据规模是否适合所选算法。
4. 距离度量:聚类质量的底层决定因素
聚类文档列出的兼容距离度量分为四组,与 distances.md 的完整目录相互印证:
| 类别 | 度量 | 特点 |
|---|---|---|
| Lock-step(逐点) | Euclidean、Manhattan、Minkowski | 无对齐,速度最快;要求序列已对齐 |
| 弹性(带对齐) | DTW、DDTW、WDTW | 允许时间轴形变;DDTW 比较导数,对幅度偏移更稳健 |
| 编辑型 | ERP、EDR、LCSS | 容忍缺失/插入型差异;LCSS 对离群点鲁棒性最高 |
| 专用弹性 | MSM、TWE | 针对特定形变模式设计 |
从 distances.md 的复杂度分析看,距离选择直接决定聚类的可扩展性:Euclidean 为 O(n),带窗口约束的 DTW 为 O(nw)(w 为窗口宽度),全量 DTW 为 O(n²)。因此在大集合上聚类时,实践中应给 DTW 加 Sakoe-Chiba 窗口约束:
# 窗口约束(序列长度的 10%),兼顾速度并抑制病理性形变
clusterer = TimeSeriesKMeans(n_clusters=3, distance="dtw",
distance_params={"window": 0.1})
同时,多数距离对尺度敏感,聚类前建议做 z 归一化(SKILL.md 的 Best Practices 亦将此列为第一建议):
from aeon.transformations.collection import Normalizer
X_train = Normalizer().fit_transform(X_train)
此外,distances.md 还提供了 get_distance_function_names() 与 get_distance_function("dtw") 两个动态查询入口,可以在运行时枚举并获取可用距离函数,便于脚本化地做度量对比实验。
5. 均值方法(Averaging Methods):如何得到"簇中心"
时序聚类中最容易被忽视、却直接影响 cluster_centers_ 含义的设计是簇中心的计算方式。参考文档列出四种均值方法:
| 均值方法 | 说明 |
|---|---|
mean_average |
逐点算术平均,最快但忽略形变 |
ba_average |
基于 DTW 的重心平均(barycentric averaging),是弹性距离下的经典选择 |
kasba_average |
平移不变的弹性平均 |
shift_invariant_average |
通用的平移不变平均 |
适用条件(原文档归纳):当你需要用于可视化或初始化的代表性簇中心时,需要显式选择均值方法。理解要点在于:
- 使用
mean_average时,DTW 距离下的簇中心只是逐点平均,可能不落在任何"典型形状"上; - 使用
ba_average时,中心是通过 DTW 重心对齐迭代得到的时序,更适合作为聚类原型展示; - 若数据主要是相位平移关系,
kasba_average/shift_invariant_average这类平移不变方法能避免中心被不同相位"平均成噪声"。
这与算法选型一致:KASBA 本身就是"K-means + 平移不变弹性均值"的组合,适合时间平移显著的场景。
6. 算法选型决策表
综合参考文档的 Algorithm Selection 与距离/均值分析,可以整理成如下决策表(原文档六条优先级策略完整保留并补注):
| 首要诉求 | 推荐算法 | 依据 |
|---|---|---|
| 速度优先 | TimeSeriesKMeans + Euclidean |
Lock-step 距离 O(n),无对齐开销 |
| 需要对齐时间形变 | KASBA、TimeSeriesKMeans + DTW |
弹性距离 + 合适的均值方法 |
| 大数据集 | TimeSeriesCLARA、TimeSeriesCLARANS |
采样/随机搜索保证可扩展性 |
| 复杂非线性模式 | 深度聚类器(AE*Clusterer 系列) |
自编码器学习表示 |
| 可解释性 | Catch22Clusterer、SummaryClusterer |
特征空间可直接命名每个维度 |
| 非凸簇形状 | KSpectralCentroid |
基于图的谱方法不受球形假设约束 |
7. 评估:从内部指标到带标签数据
参考文档的评估部分建议使用 sklearn 或 aeon benchmarking 的聚类指标:
- 轮廓系数(Silhouette score):簇内紧密度与簇间分离度的综合度量;
- Davies-Bouldin 指数:越小越好,衡量簇间可分离性;
- Calinski-Harabasz 指数:越大越好,衡量簇间/簇内方差比。
from sklearn.metrics import silhouette_score, davies_bouldin_score, calinski_harabasz_score
# 需要基于所选距离度量重建距离矩阵后再计算(如 DTW 距离矩阵)
print(silhouette_score(X, labels, metric="precomputed"))
当手头有真实标签时(例如直接用 GunPoint 的类别标签评估无监督结果),还可以用 aeon benchmarking 提供的聚类专用指标——datasets_benchmarking.md 中给出了带标签匹配的聚类准确率:
from aeon.benchmarking.metrics.clustering import clustering_accuracy
accuracy = clustering_accuracy(y_true, y_pred)
实践建议:无标签场景用内部指标对比不同(距离, 均值方法)组合;有标签场景用 clustering_accuracy 校验,并以简单基线(Euclidean KMeans)作为参照,避免仅凭单一指标下结论。
8. 小结与延伸阅读
aeon 技能中的聚类参考文档以"距离度量 × 均值方法 × 算法族"三个维度组织了完整的时序聚类选型空间:分区算法处理常规场景,CLARA/CLARANS 处理规模,KASBA/ElasticSOM 处理相位形变,谱方法处理非凸结构,自编码器聚类器处理复杂模式,特征型聚类器则换取可解释性。所有算法共享 scikit-learn 风格 API,可直接与仓库其他技能文档中的变换器(transformations.md)、距离函数(distances.md)和数据加载工具(datasets_benchmarking.md)自由组合成完整流水线。
延伸阅读路径:
- skills/aeon/SKILL.md —— 技能总览、安装与数据格式规范(集合为
(n_cases, n_channels, n_timepoints),单序列为(n_channels, n_timepoints)); - skills/aeon/references/distances.md —— 全部距离度量、窗口约束参数与复杂度对照表;
- tests/skill-requirements.toml —— 技能测试所需的最小依赖声明。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00