分而治之:K-means 聚类 + LSTM 的多输出回归实战

一个输入向量,同时预测 7 个目标量------机器人动力学里最常见的难题,被一条"先聚类、后建模"的朴素思路拆解得异常清爽。本文结合一份完整的 MATLAB 工程,把研究背景、算法步骤、公式原理、参数设定与实验结果讲透。


一、研究背景:为什么"多输出"是个真问题

在机器人、化工、能源等工程场景里,我们经常遇到这样的情况:一次测量拿到 21 个输入特征,却要同时给出 7 个彼此关联的输出目标。本文所用数据来自 SARCOS 机械臂逆动力学数据集------这是一个公开的多输出回归基准,输入是 7 个关节的角位置、角速度、角加速度共 21 维特征,输出是 7 个关节的力矩共 7 维目标。这类数据最早收录于 Rasmussen 与 Williams 的经典教材《Gaussian Processes for Machine Learning》,长期以来被当作检验多输出回归算法的"试金石"。

多输出回归难在两点。其一,目标之间不是独立的 :一个机械臂的各关节力矩由整体运动状态共同决定,彼此存在耦合,逐目标独立建模会白白丢掉这种相关性。其二,单一全局模型往往"一碗水端平":真实数据在不同工作区间表现出不同的输入输出规律,用一个模型强行拟合所有区间,等于让模型在异构的动力学特性上取平均,精度自然受限。

于是就有了本文要讲的思路:先用 K-means 把高维样本空间切成若干"局部",再在每个局部上训练 LSTM 做 7 维多输出回归。这就是典型的"分而治之"(divide-and-conquer)策略。

二、主要功能:一份完整工程在做什么

这份工程由几个 .m 脚本和 .mat 数据文件组成,功能清晰、层次分明:

文件 作用
Kmeans_CT.m 用合成数据演示 K-means 聚类与测试样本路由,理解聚类基本流程
MainKmeans.m 在 SARCOS 数据上确定最优聚类数、执行聚类并可视化
MainKmeans_LSTM.m 完整管线:K-means 聚类 → 归一化 → LSTM 训练 → 多输出回归评估
MainKmeans_LSTMPlus.m 在上述基础上补充全部 7 个输出的完整评价指标
MainLSTMNN.m 独立 LSTM 版本,直接读入预聚类后的 DataC.mat 进行回归

一句话概括主要功能:以 K-means 聚类作为数据预处理,以 LSTM 网络作为回归器,完成"21 维输入 → 7 维输出"的端到端多目标预测,并用 MSE、NMSE、RMSE、MAPE、R² 五项指标对每个输出逐一评价。

三、技术路线:一条清晰的两阶段管线

整体流程可以画成下面这条链:

复制代码
加载 SARCOS 数据
      │
      ▼
拼接 [X_train, Y_train] 成 28 维样本矩阵
      │
      ▼
Calinski-Harabasz 指标扫描 K=1~10,确定最优 K
      │
      ▼
K-means 聚类(平方欧氏距离,5 次重复)
      │
      ▼
可视化聚类 + 用 pdist2 把测试样本路由到最近质心
      │
      ▼
mapminmax 归一化到 [0,1]
      │
      ▼
搭建 LSTM:sequenceInput → lstm(64) → dropout(0.1) → fc(7) → regression
      │
      ▼
Adam 优化器训练,predictAndUpdateState 预测
      │
      ▼
反归一化 + 逐输出计算五项误差指标 + 绘图

这条路线最巧妙的地方在于把聚类和回归解耦:聚类阶段只在 28 维特征空间(输入 21 维 + 输出 7 维)里找结构,回归阶段才让 LSTM 专注拟合局部映射。测试样本则通过"到哪个质心近、就归入哪个簇"的规则被路由,整条链路无需人工干预。

四、算法步骤详解

4.1 确定聚类数 K

代码用 evalclusters 配合 Calinski-Harabasz(CH)指数,在 K=1 到 10 之间扫描,取 CH 值最大的 K 作为最优聚类数。CH 指数衡量的是"簇间离散度"与"簇内紧凑度"之比,值越大说明聚类结构越明显。在本数据上最优 K=2,说明机械臂的样本天然地聚成两大工作区间。

4.2 K-means 聚类

对 28 维样本执行 K-means,距离度量选平方欧氏距离(sqeuclidean),并设 5 次重复初始化以降低对初始质心的敏感度。聚类完成后,训练样本被划分为簇 1 与簇 2。

4.3 测试样本路由

pdist2 计算每个测试样本到两个质心的欧氏距离,把测试样本分配给距离最近的簇。这一步保证了测试阶段与训练阶段使用同一套"分片规则"。

4.4 归一化与 LSTM 训练

mapminmax 把输入、输出统一归一化到 0,1,消除量纲差异。随后搭建 LSTM 网络:输入层接收 21 维特征,LSTM 隐藏层设 64 个单元,dropout 层以 0.1 的概率随机丢弃以抑制过拟合,全连接层输出 7 维,最后接回归损失层。这正是"多输出"的关键------一个网络同时吐出 7 个预测值

4.5 预测与评估

predictAndUpdateState 对训练集、测试集做前向预测,再反归一化回原始量纲,逐输出计算 MSE、NMSE、RMSE、MAPE、R²,并对每个输出绘制"预测值 vs 真实值"对比曲线。

五、公式原理

5.1 K-means 目标函数

K-means 最小化簇内平方和(WCSS):

J=∑k=1K∑xi∈Sk∥xi−μk∥2 J = \sum_{k=1}^{K} \sum_{x_i \in S_k} \| x_i - \mu_k \|^2 J=k=1∑Kxi∈Sk∑∥xi−μk∥2

其中 SkS_kSk 是第 kkk 个簇的样本集合,μk\mu_kμk 是簇质心。算法交替执行"分配样本到最近质心"与"用均值更新质心"两步,直到收敛。

5.2 Calinski-Harabasz 指数

CH(K)=Tr(BK)/(K−1)Tr(WK)/(N−K) CH(K) = \frac{\mathrm{Tr}(B_K) / (K-1)}{\mathrm{Tr}(W_K) / (N-K)} CH(K)=Tr(WK)/(N−K)Tr(BK)/(K−1)

BKB_KBK、WKW_KWK 分别为簇间、簇内散布矩阵,NNN 为样本数。CH 越大,簇间越分散、簇内越紧凑。

5.3 LSTM 门控机制

LSTM 靠三个门控制信息流,核心递推如下:

ft=σ(Wfht−1,xt+bf)it=σ(Wiht−1,xt+bi)C~t=tanh⁡(WCht−1,xt+bC)Ct=ft⊙Ct−1+it⊙C~tot=σ(Woht−1,xt+bo)ht=ot⊙tanh⁡(Ct) \begin{aligned} f_t &= \sigma(W_f h_{t-1}, x_t + b_f) \\ i_t &= \sigma(W_i h_{t-1}, x_t + b_i) \\ \tilde{C}t &= \tanh(W_C h_{t-1}, x_t + b_C) \\ C_t &= f_t \odot C{t-1} + i_t \odot \tilde{C}_t \\ o_t &= \sigma(W_o h_{t-1}, x_t + b_o) \\ h_t &= o_t \odot \tanh(C_t) \end{aligned} ftitC~tCtotht=σ(Wfht−1,xt+bf)=σ(Wiht−1,xt+bi)=tanh(WCht−1,xt+bC)=ft⊙Ct−1+it⊙C~t=σ(Woht−1,xt+bo)=ot⊙tanh(Ct)

遗忘门 ftf_tft 决定丢弃多少旧记忆,输入门 iti_tit 决定写入多少新信息,输出门 oto_tot 决定输出多少隐藏状态。正是这套门控让 LSTM 能捕捉序列中的长期依赖。

5.4 归一化

x′=x−xmin⁡xmax⁡−xmin⁡ x' = \frac{x - x_{\min}}{x_{\max} - x_{\min}} x′=xmax−xminx−xmin

将所有特征压缩到 0,1,预测后再反归一化回原始尺度。

5.5 评价指标

以 yiy_iyi 为真实值、y^i\hat{y}_iy^i 为预测值、yˉ\bar{y}yˉ 为均值、nnn 为样本数:

MSE=1n∑i=1n(yi−y^i)2,RMSE=MSE MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i-\hat{y}_i)^2, \qquad RMSE = \sqrt{MSE} MSE=n1i=1∑n(yi−y^i)2,RMSE=MSE

MAPE=1n∑i=1n∣yi−y^iyi∣,R2=1−∑(yi−y^i)2∑(yi−yˉ)2 MAPE = \frac{1}{n}\sum_{i=1}^{n}\left|\frac{y_i-\hat{y}_i}{y_i}\right|, \qquad R^2 = 1 - \frac{\sum (y_i-\hat{y}_i)^2}{\sum (y_i-\bar{y})^2} MAPE=n1i=1∑n yiyi−y^i ,R2=1−∑(yi−yˉ)2∑(yi−y^i)2

代码中的 NMSE 定义为 ∑(yi−y^i)2/∑(yi−yˉ)2\sum (y_i-\hat{y}_i)^2 / \sum (y_i-\bar{y})^2∑(yi−y^i)2/∑(yi−yˉ)2,恰等于 1−R21-R^21−R2。R² 越接近 1、MSE/RMSE/MAPE 越小,说明拟合越好。

六、参数设定

下表汇总了 LSTM 训练的关键超参数:

参数 取值 含义
隐藏单元数 64 LSTM 记忆单元维度
Dropout 率 0.1 随机失活比例
优化器 Adam 自适应学习率优化
初始学习率 0.001 起始步长
学习率调度 piecewise 分段下降
学习率下降周期 100 epoch 每 100 轮调整一次
学习率下降因子 0.8 每次乘 0.8
最大迭代轮数 600 训练上限
Mini-Batch 20(GPU)/ 10(CPU) 批大小
梯度阈值 1 梯度裁剪
执行环境 gpu / cpu 优先 GPU 加速

聚类阶段的参数:聚类数 K 由 CH 指数自动确定为 2,距离度量为平方欧氏距离,重复初始化 5 次。

七、实验结果分析

7.1 聚类结果

聚类评价图展示了 CH 指数随聚类数的变化,其峰值位置即最优 K=2。聚类分配和聚类中心图(训练集与测试集各一张)直观呈现了两个簇的样本分布及其质心位置,可以看到两个工作区间在特征平面上有清晰的分界。指标聚类效果图则进一步画出两个簇在 28 个维度上的轮廓曲线,两个簇的形状差异明显,验证了"分而治之"的合理性。

7.2 回归结果

七个输出的测试集表现汇总如下(数据源自工程输出日志):

输出 训练 R² 测试 R² 测试 RMSE 测试 MAPE
Y1 0.9028 0.4247 5.8715 28.01%
Y2 0.6998 0.6472 3.1020 22.66%
Y3 0.7962 0.6704 1.8404 33.26%
Y4 0.9569 0.7616 3.0386 27.77%
Y5 0.7901 0.5851 0.2045 19.57%
Y6 0.7996 0.0970 0.3505 16.66%
Y7 0.9446 0.8491 0.4172 19.31%

把这张表读透,能看出三个值得注意的现象。

第一,训练与测试之间存在明显的"泛化落差"。 例如输出 1 的训练 R² 高达 0.90,测试 R² 却掉到 0.42。这一半来自深度网络对小样本局部区域的过拟合,另一半则与本文工程"只用了簇 1 的样本训练、却在全量测试集上评估"有关------训练分布与测试分布不完全一致,测试集里簇 2 的样本对模型而言是"没见过的领地"。

第二,不同输出的难度差异巨大。 输出 7 测试 R² 达到 0.8491,是全场最佳;而输出 6 测试 R² 仅 0.0970,几乎等于"预测了个寂寞"。这说明 7 个关节力矩的可预测性并不均等,有些关节受输入信息的解释力更强,有些则含有更高的噪声成分。这也提醒我们:多输出回归不能只看平均指标,必须逐个目标检视

第三,MAPE 与 R² 的结论未必一致。 输出 6 的 MAPE 看起来最低(16.66%),但那是因为其真实值本身的波动范围小、相对误差被摊薄,R² 却暴露了它几乎没有捕捉到真实变化。单一指标会骗人,多指标交叉验证才可靠。

对应地,工程为每个输出都生成了"预测值 vs 真实值"对比图(训练集、测试集各一张,共 14 张)。输出 7 的曲线里预测与真实几乎重合,而输出 6 的曲线则明显"各走各的",与指标结论完全吻合。

八、运行环境

这套工程在 MATLAB2020 环境下运行,依赖以下工具箱:

  • Deep Learning Toolbox :提供 trainNetworklstmLayer 等深度学习接口
  • Statistics and Machine Learning Toolbox :提供 kmeansevalclusterspdist2 等聚类与距离函数
  • Parallel Computing Toolbox(可选):GPU 训练需要

有 NVIDIA GPU 时 ExecutionEnvironment 设为 'gpu' 可显著加速;无 GPU 则回退为 'cpu'(对应 MainLSTMNN.m 的配置)。数据文件 Sarcos_data.matDataC.mat 以及训练好的网络 LSTMNET.matKLNET.mat 均需与脚本放在同一目录。

九、应用场景

这套"聚类 + 多输出 LSTM"的范式,本质是把一个复杂的多目标回归问题拆成若干局部子问题,因此能平移到很多领域:

  • 工业机器人:机械臂逆动力学建模、关节力矩在线预测,是本文数据的直接来源场景。
  • 能源与负荷预测:同一时刻预测多台机组/多类型负荷(电、热、冷),输出之间天然耦合。
  • 化工与流程工业:多组分的软测量,用易测变量同时反演多个难测的质量指标。
  • 气象与环境:由一组观测同时预测温度、湿度、风速、污染物浓度等多个变量。
  • 金融与风控:由宏观特征同时预测多个相关标的或多项风险指标。

任何"一个输入、多个相关输出"的回归任务,都可以借鉴这条路线。

十、结语

"多输出"并不可怕,可怕的是用一个全局模型硬扛所有样本的异质性。K-means 负责"分"------把空间切成局部;LSTM 负责"治"------在每个局部里精确拟合 7 维映射。二者叠加,就是一套朴素、可解释、易复现的多输出回归方案。

当然,本文工程还有可打磨之处:为每个簇各训练一个 LSTM 并做集成、对输出 6 这类"难预测"目标单独调参、引入输出间相关性的联合损失,都是值得进一步探索的方向。如果你也在做多目标预测,不妨从这套思路起步。


相关推荐
SpikeKing2 小时前
AIDD - SAbDab2 抗体感知聚类(Antibody-Perceived Clustering)
聚类·抗体·aidd·sabdab2·mmseqs
Tasiorh2 天前
《基于LSTM-RNN-CBAM模型和动态规划模型的交易策略》
rnn·lstm·动态规划
焱童鞋4 天前
基于DJL的LSTM水文预报模型训练完整指南
人工智能·rnn·lstm
牧羊人.3334 天前
速通机器学习 11| K-Means 聚类
机器学习·kmeans·聚类
阿图灵5 天前
基于 LSTM 的中文电商评论情感分类:从数据处理到 91% 准确率实战
人工智能·深度学习·分类·nlp·lstm·情感分类
小趴蔡ha6 天前
12 K-Means 聚类入门:没有标签如何发现数据分组
算法·kmeans·聚类
在学了加油7 天前
LSTM-糖尿病预测模型优化探索
人工智能·rnn·lstm
其美杰布-富贵-李8 天前
聚类算法详解:K-means、层次聚类与 DBSCAN
算法·机器学习·kmeans·聚类
崖边看雾8 天前
机器学习——K-Means(啤酒数据集挖掘)
人工智能·机器学习·kmeans