搞时序数据这块的朋友,应该都有过被缺失值和异常值折磨的经历。尤其是传感器采集的连续数据,一旦出现一段长时间的“空洞”或者某个瞬间的“毛刺”,后面所有基于它的统计特征、模型输入全部跟着失真。我这次要分享的是一个我近期搭完的模型,用 K均值聚类 + KNN-LSTM-RF数据填补 做时序数据清洗,整体在Matlab下实现,效果比我之前单独用插值或者单一ML模型要稳很多。这篇文章会把模型怎么设计、为什么这么搭配、关键代码怎么落地、调试中踩了哪些坑都讲清楚,适合正在做时序数据预处理、论文实验或者工业数据治理的读者参考。
为什么选这套组合而不是直接上深度学习?原因很简单,时序数据的“脏”分很多种,有随机缺失、连续缺失、离群异常,还有因为传感器状态切换导致的分布漂移。单一模型很难同时应对这些情况,所以我一开始的定位就不是“一个算法打天下”,而是“多个模型分层协作”。K均值负责捕捉数据的整体结构和状态切换,KNN做局部的快速填补,LSTM负责处理带时间依赖的连续缺失段,RF则作为兜底的异常识别和填补结果校验器。四个算法各管一段,组合起来就是一个完整的清洗流水线。
1. 为什么做这个模型:时序数据清洗的“脏乱差”
1.1 时序数据清洗的场景与痛点
我最早接触数据清洗是在一个工业设备振动信号的项目里。传感器每100毫秒采集一次振动值,一天就是86万个点,其中总会有那么几段因为通信抖动、设备重启、信号干扰出现空洞或者跳变。如果用最简单的线性插值去填,短缺失还好,长缺失段填出来的曲线完全不符合设备的自然振动规律。如果直接丢弃缺失段,又会破坏时序的完整性,导致后续做频域分析时出现频谱泄漏。
痛点其实就三个:第一,缺失不是均匀分布,而是有成段出现的特点,这种连续缺失最不好处理。第二,数据本身有周期性或者状态切换,不同工况下同样位置的传感器数值范围差异很大,用一个全局阈值判断异常完全不靠谱。第三,填补之后的质量怎么评估?如果只追求“填满”,填出来的数据可能引入新的噪声,反而让下游模型变差。这些痛点决定了清洗模型必须具备两种能力:一是能区分出数据的不同状态,二是能结合时间上下文去做填补,而不是孤立地看每个点。
1.2 算法选型:为什么是K均值+KNN-LSTM-RF
我在选型阶段对比过很多方案。纯线性插值不行,因为它只利用了两个最近有效点,缺乏全局信息。用ARIMA或者简单指数平滑可以处理平稳序列,但遇到工况切换、趋势突变就滞后。单一LSTM虽然能学时间依赖,但训练时间长且对异常点敏感,数据里噪声一大,预测结果容易跑偏。
最终决定用K均值聚类来做最前置的分段。K均值可以把整个长序列按相似度切分成不同状态的片段,每个片段内部的特征比较一致,这样后续的填补就在各自的“状态上下文”里进行,而不是混着所有状态去填。KNN负责短缺失段的填补,它的原理是找最相似的K个邻居加权平均,在聚类划分完成之后,邻居搜索的准确性和速度都明显提升。对于长缺失段,KNN找不到足够的相似近邻,就让LSTM上场。LSTM通过训练历史窗口来预测下一个值,天然适配时间序列的递推关系。最后的RF随机森林,一方面对填补后的完整数据做异常值复核,另一方面通过特征重要性反馈给前面的环节做参数微调。
这套组合的逻辑其实有点像流水线质检:先粗分料(K均值),再精细补缺(KNN和LSTM分工),最后复检包装(RF)。每个环节解决一类特定问题,这才是我选择它的核心原因。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 网络设计与协同原理
2.1 K均值聚类:给数据先“划片”
K均值聚类在时序数据里的作用,不是用来分类的,而是用来找“模式片段”的。我用的方法是把原始时间序列分割成固定长度的小窗口,比如每60个点一个窗口,然后对窗口提取特征向量。特征可以简单到直接用原始值序列,也可以做统计特征,比如均值、方差、峰值因子、频谱质心。这一点很关键:如果只用原始值,窗口相位不一致会导致聚类结果乱掉;加一点统计特征之后,相同状态下采集的数据即使起始相位不同,也能被分到同一个簇。
实际操作中,K值的确定不是拍脑袋。我会用轮廓系数(Silhouette Coefficient)结合肘部法则,先在K=2到K=10的范围内跑一遍,看轮廓系数曲线,选择拐点位置。举个我实际跑过的例子,一组包含启停工况的电流时序数据,K=3时轮廓系数最高,对应了“稳定运行”“启动冲击”“停机衰减”三种状态,这个划分结果直接让后续填补误差下降了15%以上。
K均值这部分在Matlab里的实现非常方便,内置的kmeans函数支持多种距离度量,我用的是默认的平方欧氏距离,配合“KMeans++”初始化方法来避免随机种子带来的局部最优问题。需要注意的是,K均值对异常值敏感,所以我在做聚类之前会先用一个简单的3倍中位数绝对偏差(MAD)阈值做一次粗筛,把特别离谱的毛刺先剔除掉,不然聚类中心会被异常点拉偏。
2.2 KNN与LSTM的交替填补策略
KNN和LSTM的职责划分,我总结为一个简单的原则:缺失段长度小于阈值T就交给KNN,大于阈值的交给LSTM。T的值取决于数据的采样频率和自相关长度。对于100毫秒采样的振动数据,T设在20左右;对于逐小时采样的气象数据,T可以放宽到48。
KNN填补的具体做法是:对于缺失位置
