一个输入向量,同时预测 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−xminxmax−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 :提供
trainNetwork、lstmLayer等深度学习接口 - Statistics and Machine Learning Toolbox :提供
kmeans、evalclusters、pdist2等聚类与距离函数 - Parallel Computing Toolbox(可选):GPU 训练需要
有 NVIDIA GPU 时 ExecutionEnvironment 设为 'gpu' 可显著加速;无 GPU 则回退为 'cpu'(对应 MainLSTMNN.m 的配置)。数据文件 Sarcos_data.mat、DataC.mat 以及训练好的网络 LSTMNET.mat、KLNET.mat 均需与脚本放在同一目录。
九、应用场景
这套"聚类 + 多输出 LSTM"的范式,本质是把一个复杂的多目标回归问题拆成若干局部子问题,因此能平移到很多领域:
- 工业机器人:机械臂逆动力学建模、关节力矩在线预测,是本文数据的直接来源场景。
- 能源与负荷预测:同一时刻预测多台机组/多类型负荷(电、热、冷),输出之间天然耦合。
- 化工与流程工业:多组分的软测量,用易测变量同时反演多个难测的质量指标。
- 气象与环境:由一组观测同时预测温度、湿度、风速、污染物浓度等多个变量。
- 金融与风控:由宏观特征同时预测多个相关标的或多项风险指标。
任何"一个输入、多个相关输出"的回归任务,都可以借鉴这条路线。
十、结语
"多输出"并不可怕,可怕的是用一个全局模型硬扛所有样本的异质性。K-means 负责"分"------把空间切成局部;LSTM 负责"治"------在每个局部里精确拟合 7 维映射。二者叠加,就是一套朴素、可解释、易复现的多输出回归方案。
当然,本文工程还有可打磨之处:为每个簇各训练一个 LSTM 并做集成、对输出 6 这类"难预测"目标单独调参、引入输出间相关性的联合损失,都是值得进一步探索的方向。如果你也在做多目标预测,不妨从这套思路起步。