项目介绍 MATLAB实现基于随机森林(RF)进行轴承剩余寿命预测(含模型描述及部分示例代码)专栏近期有大量优惠 还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢
目录
MATLAB实现基于随机森林(RF)进行轴承剩余寿命预测的详细项目实例... 2
提供可复现的MATLAB项目示例以促进技术推广与教学实践... 5
挑战二:振动信号高采样率带来的数据规模与特征降维问题... 6
MATLAB实现基于随机森林(RF)进行轴承剩余寿命预测的详细项目实例
请注意此篇内容只是一个项目介绍 更多详细内容可直接联系博主本人
或者访问对应标题的完整博客或者文档下载页面(含完整的程序,GUI设计和代码详解)
滚动轴承作为旋转机械中最关键的基础部件之一,在电机、风机、机床、轨道交通、航空发动机以及各种过程工业设备中大量应用,其健康状态直接决定整套装备的运行安全与生产效率。轴承在长期运行过程中不可避免地承受周期性载荷、冲击载荷以及复杂工况下的振动与温度变化,滚动体与内外圈滚道之间会逐渐产生疲劳损伤、点蚀、剥落以及磨损。当这些损伤积累到一定程度时,就会表现为振动能量异常、频谱中故障特征频率幅值增强、温升增大、噪声变大,最终可能触发严重故障甚至灾难性失效。对于关键设备,一旦因轴承突然失效导致停机,不仅会带来昂贵的维修费用,还会造成生产中断、订单延误,甚至在一些高风险行业中引发设备损毁和人员安全事故。
在传统维护策略中,常见方式包括定期检修和事后维修。定期检修依赖经验和经验标准确定检修周期,往往无法精准反映轴承实际健康状态:为了保险,周期通常设置偏短,导致大量本可以继续运行的轴承被提前更换,增加了维护成本和备件消耗;而在复杂工况和高负荷环境下,某些轴承可能在两次定期检修之间就发生严重劣化,形成“超期服役”的隐患。事后维修则完全依赖故障发生后再停机处理,虽然在短期内节约了检修成本,但一旦发生突发性失效,会带来更高代价和风险。因此,逐步发展出状态维护与预知维护的理念,通过在线监测轴承振动、温度、转速、负载等信息,结合数据分析和智能算法,在故障早期识别和寿命评估方面提供决策依据。
在众多状态评估指标中,轴承剩余寿命(Remaining Useful Life,RUL)预测是一个核心问题。RUL表示轴承从当前时刻起,在当前或设定工况下能够维持正常功能的预计时间或循环数,是制定维护计划、合理安排备件和减少停机的重要依据。相比简单的“健康/故障”二分类判断,RUL预测的难度更高,需要在时间维度上刻画退化过程,并从连续的振动信号中提取与寿命演化相关的特征。轴承实际退化往往表现为非线性、多阶段和多因素耦合的特征:早期损伤阶段振动变化微弱,接近失效阶段振动幅值和特定频率成分明显增强,中间还可能受到工况变化、噪声干扰和传感器不稳定带来的影响。因此,建立准确、稳定且具有一定泛化能力的RUL预测模型,一直是装备健康管理领域的难点与研究热点。
在数据驱动方法中,随机森林(Random Forest,RF)是一类在工程应用中表现出较高鲁棒性和可解释性的集成学习算法。相较于单棵决策树易过拟合、对特征噪声敏感的缺点,随机森林通过构造多棵相互独立的决策树并对结果进行集成,既充分利用了决策树对非线性、复杂边界的表达能力,又通过随机采样和随机特征子集降低了方差和过拟合风险。对于轴承RUL预测这种特征维度较多、数据分布复杂并含有噪声的任务,随机森林在实际工程项目中表现出较好的稳定性和较低的调参成本。此外,随机森林还提供特征重要性评估机制,便于分析不同振动特征对寿命预测的贡献,从而为后续特征工程和传感器布置优化提供参考。
在现代工业环境中,大量振动传感器可以以高速采样方式采集轴承运行时的原始振动数据,数据量巨大、维度高且包含丰富的时间和频率信息。将这些信号通过MATLAB这样的工程计算平台进行统一处理,可以发挥MATLAB在信号处理、统计分析和机器学习工具箱方面的成熟能力,快速实现完整的RUL预测流程。MATLAB提供的滤波、包络解调、小波分解、频谱分析以及多种特征提取函数,使得轴承振动信号的时域、频域和时频域特征提取过程高度模块化;同时,统计与机器学习工具箱中的随机森林回归函数能够方便地完成模型构建和预测,减少基础算法开发工作量,使精力更多集中在工程问题建模和结果分析上。
在整个轴承RUL预测项目中,MATLAB不仅用于信号处理和模型训练,还可以实现数据可视化、模型性能评估以及参数调试。通过图形化界面展示振动波形、频谱特征、健康指标演化曲线和预测结果,便于对模型行为进行直观理解;借助误差指标、散点图和残差分析等方式,对模型的拟合能力与泛化性能进行全面评估。结合随机森林对特征重要性的分析,能够逐步筛选出更具代表性的退化特征,减少冗余维度,提升模型训练效率和预测稳定性。在MATLAB R2025b环境下,随机森林训练函数和可视化工具已经非常成熟,配合相对规范的数据组织与脚本管理,可以构建出一个可复现、易维护且便于扩展的轴承RUL预测工程项目。
综合来看,基于MATLAB平台、采用随机森林算法实现轴承剩余寿命预测,不仅可以兼顾预测精度、模型解释性以及工程实现难度,还能够与现有的监测系统和数据采集系统顺利对接,为工业设备提供可靠的预知维护决策支持。因此,围绕这一主题构建一个完整、可运行的项目实例,具有明显的工程应用价值和推广意义。
项目目标与意义
工程设备的可靠性提升与停机风险降低
本项目的首要目标是借助随机森林回归模型,构建一套稳定可靠的轴承剩余寿命预测方法,以此显著降低设备突发停机风险。轴承在关键设备中的作用类似于“关节”,任何一个关节的突然失效都可能导致整个系统停止运行。通过对轴承寿命进行连续预测,可以提前发现接近寿命终点的部件,在实际运行还处于“可工作但即将失效”的阶段就安排计划性停机和更换,从而避免突发故障造成的非计划停机和连锁损伤。随机森林模型能够处理复杂、非线性的退化趋势,并通过集成多棵决策树来提高预测结果的稳定性,即使存在一定的噪声和局部异常数据,也能保持较为平滑的寿命估计曲线。这种稳定性对于工程人员制定维护策略极为重要,因为维护决策不能频繁因为预测结果剧烈波动而改变。通过MATLAB平台搭建的预测系统,可在已有振动监测和SCADA系统基础上嵌入,实现在线或准在线的RUL预测功能,为生产调度与设备运维提供前瞻性信息,从而实实在在地提升整套设备的可靠性和安全性。
维护策略优化与维护成本的系统性降低
传统的定期维护模式往往以时间或运行里程为依据,缺乏对轴承实际性能退化状态的感知,容易出现“过维修”和“欠维修”并存的问题。本项目的目标之一是通过数据驱动的RUL预测结果,支撑基于状态的维护策略优化,实现维护资源和备件库存的合理配置。通过对不同轴承的RUL预测,可对多台设备、多位置轴承进行寿命排序,识别出失效风险较高的轴承优先安排更换,而对寿命仍然充裕的轴承延后维护时间,延长组件有效使用周期。这种精细化的维护策略可以减少不必要的提前更换,同时也避免因未能及时更换而造成严重损伤。随机森林模型训练过程中,能够根据历史失效数据学习不同负载、转速和工况组合下的寿命变化规律,在相同运行时间下区分轻载和重载轴承的真实寿命水平。通过MATLAB环境中对数据的批量处理与结果统计,可以对不同维护策略进行仿真对比,量化各策略在停机时间、备件消耗和维护工时上的差异,从而为企业制定长期的维护规划提供数据支持,最终实现维护成本的系统性降低。
面向工业智能化的健康管理数据闭环构建
本项目还旨在推动轴承健康管理从“数据采集”向“智能决策”延伸,构建一条完整的数据闭环。通过对振动信号进行预处理、特征提取和RUL预测,生成可供管理系统使用的高层健康状态指标,结合生产计划、设备档案和工况记录,实现从数据到决策的闭环反馈。随机森林模型在训练过程中可以利用大量历史故障案例和寿命数据,形成对不同故障模式和退化速率的综合理解,而MATLAB的数据可视化工具可将这些规律以特征重要性排序、寿命曲线对比等形式呈现给工程技术人员,帮助其审视现有的设计选型、润滑策略和设备配置是否合理。在长期运行中,RUL预测误差与现实寿命之间的差异又可以反向反馈用于模型再训练和特征工程优化,实现模型性能的持续迭代。在工业智能化的大背景下,通过这种数据闭环可以逐步积累丰富的运维经验和数据资产,为后续引入更复杂模型或跨设备健康管理平台打下基础。
提供可复现的MATLAB项目示例以促进技术推广与教学实践
本项目还承载着方法示范与经验推广的目标。通过在MATLAB R2025b环境中构建一个从原始数据处理、退化特征提取、随机森林建模到RUL预测与评估的完整工程实例,可以为工程技术人员和研究人员提供一个可直接运行与扩展的参考样例。相较于单纯讲解算法原理,一个可落地的工程示例更便于理解每一个处理步骤的作用和必要性,也便于在实际项目中根据自身工况进行裁剪和改造。MATLAB环境的统一性使得脚本、函数和数据组织更加清晰,便于复现和二次开发。本项目将在数据导入、特征构造、模型训练与参数设置、预测结果可视化等关键环节给出清晰的代码结构及说明,以形成一套系统完整、逻辑清晰的实现参考,从而降低在工业现场部署RUL预测技术的门槛,推动随机森林等机器学习方法在设备健康管理中的实用化和规范化应用。
项目挑战及解决方案
挑战一:轴承退化过程复杂、非线性且受多因素影响
轴承退化过程受到载荷水平、转速变化、润滑状态、环境温度、安装偏心以及材料缺陷等多种因素联合影响,退化路径往往并不呈现简单的线性规律。早期微裂纹阶段的振动信号变化非常微弱,甚至被背景噪声淹没;随着裂纹扩展、剥落面积增大,振动能量在特定频带逐渐累积,频谱中故障特征频率及其倍频、边带逐步强化,接近失效阶段又可能出现剧烈的振动波动。这种多阶段、非线性、甚至带有突变特征的退化过程,对任何预测模型都是一项挑战。随机森林虽然具备较强的非线性拟合能力,但若输入特征选择不当,模型仍然会陷入“看似精度尚可但泛化性能不足”的局面,尤其在工况多变的场景下,训练数据与实际运行数据的分布差异会放大预测误差。此外,轴承寿命数据往往存在右删失或不完整情况,有些轴承在试验结束时仍未真正失效,导致RUL标签存在截断,这也会给模型学习带来困难。
解决上述问题的关键在于两方面:一是通过精心设计特征工程,将轴承退化过程中的关键模式充分嵌入到特征空间中;二是利用随机森林对非线性关系的刻画能力,并在训练阶段引入交叉验证与特征重要性分析来提高模型的稳健性。在特征工程方面,采用多时间尺度、多统计量的特征组合策略,对同一时间窗内的振动信号提取均值、标准差、峭度、偏度、峰值、峰峰值、均方根、包络谱能量、特定频带能量比值等特征,同时结合滚动体故障、内圈故障和外圈故障特征频率附近的能量变化,构建一组对退化过程敏感却又不过度依赖单一指标的特征子集。对于不同转速和载荷工况,可以加入转速、负载等工况变量作为模型输入,使随机森林在训练时自动学习在不同工况下相同特征与寿命之间的映射差异。在模型训练阶段,采用训练集与验证集划分、K折交叉验证以及多次随机初始化的方式评估模型稳定性,并借助随机森林内置的特征重要性评估功能筛选冗余特征,降低模型复杂度,从而增强对非线性退化过程的刻画能力和实际工况下的鲁棒性。
挑战二:振动信号高采样率带来的数据规模与特征降维问题
轴承振动信号通常以高采样率采集,为捕获滚动体经过局部缺陷时的冲击成分,采样频率可以达到几十kHz甚至更高,这在长时间监测中会产生巨量数据。若直接在全部时域信号上进行模型训练,计算成本极高且容易引入大量噪声。同时,轴承退化往往需要从长时间尺度上观察其趋势,如果过于细粒度地处理数据,将难以在合理时间内完成训练与预测。另一方面,在每个时间窗内提取大量时域、频域与时频域特征虽可以丰富信息,但过高的特征维度会增加模型的复杂度,导致训练时间加长并可能出现维度灾难,进而影响随机森林的训练效率和预测性能。如何在信息保留与特征维度之间取得平衡,是项目中的关键问题之一。
针对这一挑战,采用“分段时窗 + 特征降维”的策略以实现数据量压缩与信息提取平衡。具体做法是将连续振动信号按固定长度或固定转数划分为多个相邻时间窗,每个时间窗通过快速特征提取得到一个特征向量,从而将原始高采样率时序数据转换为中等维度的特征序列。时间窗长度与步长会根据轴承故障特征频率范围进行合理设置,以兼顾时间分辨率与稳定性。在特征降维方面,一方面通过利用随机森林的特征重要性指标,对贡献较低的特征进行剔除或合并,另一方面可结合相关性分析、主成分分析等方法对高度相关的特征进行压缩,减少冗余维度。MATLAB中提供了高效的矩阵运算和统计分析工具,使得大规模特征矩阵的操作与降维过程可以在可接受时间内完成。通过这一策略,既避免了直接处理巨量原始信号带来的计算负担,又保留住了轴承退化的关键统计信息,使得随机森林在较合理的特征空间中进行学习,更有利于获得稳健的RUL预测结果。
挑战三:模型泛化能力与可解释性之间的平衡
在实际工程应用中,对于RUL预测模型的要求不仅仅是预测误差低,还包括对不同工况、不同机型和不同生产批次的轴承具有一定的泛化能力,以及为工程技术人员提供可理解的判断依据。某些深度学习模型在大数据条件下能够取得极高的预测精度,但在数据量有限、工况差异较大的环境下,往往面临过拟合以及“黑箱”问题,不利于工程现场的验证和推广。随机森林在一定程度上兼顾了精度与可解释性,但如果模型参数设置不当,例如树的数量过少或深度过大,同样可能导致欠拟合或过拟合。此外,工程现场往往希望了解哪些特征对寿命预测影响最大,以便在传感器布置与采集策略上进行优化,若模型无法给出清晰的特征贡献度分析,将削弱其工程指导意义。
在这一问题上,策略主要包括三方面。第一,通过合理设置随机森林参数,例如树的数量、最大分裂数、最小叶节点样本数等,在交叉验证基础上选取兼顾精度和泛化性能的参数组合。树的数量可以适当增大以降低方差,但同时控制单棵树的复杂度以减少过拟合风险。第二,充分利用MATLAB中随机森林模型提供的特征重要性评估功能,分析不同振动特征及工况变量在寿命预测中的权重,结合工程经验对特征集进行精简和重构,使得模型更聚焦于真正与退化过程相关的特征。第三,通过模型预测结果与真实寿命之间的误差分布分析,探索在不同工况、不同寿命阶段预测误差的变化规律,识别模型在早期退化、中期稳定阶段或临近失效阶段的预测优势与不足,从而有针对性地进行改进。在整个过程中,MATLAB提供的可视化工具可以将特征重要性条形图、预测对比散点图和误差箱线图直观呈现出来,帮助工程技术人员理解模型行为,增强模型在现场应用中的信任度。通过这些措施,在保持较好预测性能的同时,也提升了模型的解释性与可推广性。
项目模型架构
数据采集与样本构建模块
模型架构的第一部分是数据采集与样本构建模块,其核心任务是将轴承运行过程中的振动信号和相关工况信息转换成可用于模型训练的样本集。在典型的退化试验或实际运行场景中,轴承通过安装在轴承座或附近位置的加速度传感器进行振动测量,采样频率通常为12 kHz、25.6 kHz或更高,以保证能够捕捉到滚动体冲击和局部缺陷引起的高频成分。同时,系统需要同步记录轴转速、载荷、温度等工况参数,为后续模型引入工况信息提供条件。数据采集设备将这些信号连续记录为时间序列,存储在MATLAB可读取的格式中,例如.mat文件或标准二进制文件。样本构建的关键在于将长时间连续数据按时间窗进行切分,通常设定固定长度的滑动窗口,例如每个窗口包含N个采样点,对应若干转数或一定时间长度。通过滑动窗口方式,可以从长时间记录中生成大量相互关联的样本,每个样本包含该窗口内的振动信号及其对应的时间戳或转数。
在每一个时间窗中,将振动信号与工况信息打包,形成一个“原始样本”,但此时样本仍为高维度原始波形,不适合直接输入随机森林。为此,本模块在样本构建阶段会记录每个时间窗对应的寿命标签,即RUL或已消耗寿命。寿命标签可以根据试验过程中记录的失效时间或转数进行计算,例如从某个时间窗对应的时间位置到实际失效时刻之间的时间或转数。对于实际运行设备,可根据检修或更换记录来反推大致的寿命标签。最终,本模块输出的结果是一个包含多个时间窗的样本集合,每个样本都关联一个寿命值,为后续的特征提取和模型训练提供基础数据框架。
信号预处理与特征提取模块
第二个模块专注于信号预处理与特征提取。振动信号受到传感器噪声、电磁干扰以及设备其他部件振动的影响,原始波形中包含大量与轴承状态无关的成分,因此需要先进行预处理操作。常用预处理方法包括去趋势、带通滤波、去除工频干扰、归一化以及包络解调等。通过带通滤波可以聚焦于轴承故障频率范围附近的频带,例如根据轴承结构参数计算内圈、外圈、滚动体和保持架故障特征频率,并选择对应频段进行滤波处理。包络解调有助于提取冲击信号的包络信息,在频谱中凸显故障特征频率。预处理后的信号更加平稳,噪声成分相对减弱,为后续特征提取提供更干净的输入。
特征提取环节将时域、频域以及时频域信息压缩为有限维度的特征向量,常用时域特征包括均值、标准差、方差、均方根、峰值因子、峭度、偏度等,用于描述信号的能量大小、波动程度与尖峰程度。频域特征通过对时间窗信号进行快速傅里叶变换得到频谱后提取,例如总频谱能量、特定频段能量、中心频率、频谱重心、谐波能量比等。时频域特征可基于短时傅里叶变换或小波变换得到时频图,从中提取局部能量、瞬时频率等指标。MATLAB中提供丰富的信号处理函数,使得这些特征计算过程可以高度自动化。本模块最终输出的,是一个样本数乘以特征数的特征矩阵,其中每一行对应一个时间窗样本,每一列对应一个特征,所有特征经过适当的标准化或归一化处理,以便于随机森林训练。
随机森林回归模型构建模块
第三个模块是随机森林回归模型构建模块,负责基于特征矩阵和寿命标签训练一个预测RUL的回归模型。随机森林是一种集成学习方法,通过对多个回归树进行集成平均来提升预测性能和稳定性。其基本原理是:在训练过程中,从训练样本中通过自助采样(Bootstrap)多次随机抽取子样本集,每个子样本集用于训练一棵回归树;在每个树的节点分裂时,并不是使用全部特征,而是从特征集中随机抽取一个子集,基于该子集选择分裂特征和分裂点。这种“双重随机化”机制使得每棵树之间具有多样性,减少了模型对某些特征或训练样本的过度依赖。最终,在预测阶段,随机森林对新样本的输出等于所有树预测结果的平均值,从而在一定程度上降低单棵树的方差,提高整体泛化能力。
在MATLAB R2025b环境中,可以通过专门的回归森林训练函数完成模型构建。模型训练时需要设置树的数量、最大树深度、最小叶节点样本数以及选择的分裂标准等参数。树的数量增大可以提升模型的稳定性,但会增加训练时间;树深度控制模型的复杂度,过深易过拟合,过浅则可能欠拟合。随机森林的一个重要特性是可以计算每个特征在所有树中带来的误差降低贡献,从而得出特征重要性评分。在本模块中,除了训练基本模型,还会利用特征重要性对特征集进行分析,为后续特征筛选与模型优化提供依据。训练完成后,模型连同其参数与特征重要性信息一起保存,供预测模块和分析模块调用。
模型训练、验证与参数优化模块
第四个模块聚焦于模型训练、验证与参数优化。在实际工程场景中,仅凭一次训练并不能保证模型达到最佳效果,需要通过系统性的验证与参数调节过程进行优化。具体流程包括将可用数据划分为训练集、验证集和测试集,以时间顺序或随机方式划分,保证验证和测试数据能够代表未来工况。模型在训练集上进行拟合后,在验证集上评估预测性能,通过均方误差、平均绝对误差、R方等指标来衡量模型表现。通过在不同参数组合下重复训练并比较验证集性能,可以逐步找到较优的参数设置。例如,尝试不同树的数量、不同最大深度、不同最小叶节点样本数,在MATLAB中通过循环和结构数组保存各方案的结果,并最终选出在验证集上性能最优或性能与复杂度折衷最合理的一组参数。
除了传统的训练与验证,还可以采用K折交叉验证在有限数据条件下获取更稳健的模型性能评估。在K折交叉验证中,将数据划分为K个子集,轮流将其中一个子集作为验证集,其他子集作为训练集,多次训练与评估后取平均性能作为模型在该参数配置下的综合表现。MATLAB中提供了便捷的交叉验证接口和评估工具,可以在较少代码量下完成这一过程。同时,本模块还将利用随机森林的特征重要性分析结果,结合相关性分析对特征集进行简化,剔除贡献极低或高度冗余的特征,以降低模型复杂度并提高训练速度。最终,通过此模块获得一套经过验证、参数优化的随机森林RUL预测模型,并基于测试集评估其泛化能力,为实际应用提供参考。
预测与结果可视化模块
第五个模块负责利用训练好的随机森林模型对新数据进行RUL预测,并对预测结果进行可视化展示。对于处于运行状态的轴承,只需按照前述的数据采集、时间窗构建和特征提取流程,对最新一段振动信号生成特征向量,然后输入到已训练的随机森林模型中,即可获得当前时刻轴承的预测RUL。通过对连续时间窗进行预测,可以得到一条随时间变化的寿命预测曲线,理想情况下,该曲线应随时间单调递减,并在接近失效时逐渐接近零。为了评估预测效果,可将模型在试验数据上的预测RUL曲线与真实RUL曲线进行对比,计算误差指标并绘制散点图或曲线对比图,观察模型在不同寿命阶段的预测偏差。
MATLAB的绘图功能能够清晰地展示振动信号的时域波形、频谱、特征演化和RUL预测结果。预测与可视化模块会生成包括原始振动波形图、特征随时间变化图、真实与预测RUL对比图、预测误差分布图以及特征重要性条形图等多种图形。通过这些图形,可以直观判断模型是否捕捉到了退化趋势,预测误差是否在可接受范围内,特征选择是否合理。对于实际工程应用,还可以将预测结果导出为结构化数据,供上层监控系统或维护决策系统使用。综合以上模块,项目模型架构形成了从数据采集、预处理、特征构建、模型训练、验证优化到预测与可视化的完整闭环,满足轴承剩余寿命预测的工程需求。
项目模型描述及代码示例
数据导入与基本预处理示例
clc; % 清空命令行窗口,便于从头查看执行过程的提示信息
close all; % 关闭当前打开的所有图形窗口,防止旧图干扰新的结果展示
dataFile = 'bearing_run2.mat'; % 指定轴承试验数据文件名,文件中包含振动信号与时间信息
load(dataFile,'accData','timeVec','fs'); % 从mat文件中读取加速度数据、时间向量和采样频率,变量名与试验数据结构对应
accData = double(accData); % 将振动数据转换为双精度类型,保证后续信号处理和特征提取的数值精度
timeVec = double(timeVec); % 将时间向量也转换为双精度,以保持与振动数据相同的数据类型
N = numel(accData); % 统计当前试验记录中振动样本的总点数,用于后续窗口划分和诊断
dt = 1/fs; % 根据采样频率计算时间步长,便于在频域分析和时间轴构建中使用
T_total = (N-1)*dt; % 估算本次记录的总时长,便于评估数据覆盖的寿命阶段范围
accData = detrend(accData,'linear'); % 对振动信号执行线性去趋势操作,消除低频漂移和传感器偏置影响
accData = accData - mean(accData); % 再次减去均值,以确保信号整体零均值,有利于后续频谱分析稳定性
f_high = 8000; % 设定带通滤波器的上限频率,避免过高频段噪声干扰特征频率附近能量
filterOrder = 4; % 设定巴特沃斯滤波器的阶数,阶数适中可以兼顾幅频特性和平稳性
figure; % 新建图形窗口,用于展示预处理前后的信号效果
plot(timeVec,accData); % 绘制原始去趋势振动信号随时间变化的波形曲线
hold on; % 保持当前图像,便于在同一坐标系叠加滤波后信号
plot(timeVec,acc_bp); % 绘制带通滤波后的信号曲线,对比信号在目标频带的变化
xlabel('Time / s'); % 标注横坐标为时间,单位为秒,方便读者理解信号持续时间
ylabel('Acceleration / g'); % 标注纵坐标为加速度幅值,可用工程习惯的g单位表示
title('Bearing vibration signal before and after bandpass filtering'); % 设置图像标题,概括图中展示内容
时间窗划分与寿命标签构建示例
winLength = round(0.2*fs); % 设置每个时间窗长度为0.2秒,对应固定采样点数,平衡时间分辨率与统计稳定性
winStep = round(0.1*fs); % 设置相邻时间窗步长为0.1秒,实现50%重叠以更平滑地追踪退化趋势
rul_full = 3600; % 以秒为单位假定一次完整寿命试验的总运行时间,这里取3600秒作为示例总寿命
rulVec = zeros(numWins,1); % 预分配RUL标签向量存储空间,每个时间窗对应一个RUL值
t_center = zeros(numWins,1); % 预分配时间中心向量,记录每个窗口中心点的时间位置
for k = 1:numWins % 遍历所有时间窗,逐步计算每个窗的中心时间和对应RUL
idxEnd = idxStart + winLength - 1; % 计算当前窗口终点索引,确保窗口内包含固定长度数据
if idxEnd > N % 防止窗口终点超出数据长度,若超出则跳出循环避免错误
break; % 结束循环以保持窗口边界合理
end % 窗口边界检查结束
t_center(k) = timeVec(round((idxStart + idxEnd)/2)); % 计算当前窗中心时间,通过起止索引平均并在时间向量中取值
rulVec(k) = max(rul_full - t_center(k),0); % 根据中心时间估算剩余寿命,保证RUL不为负值
end % 时间窗遍历和标签计算结束
validIdx = rulVec > 0; % 生成逻辑索引,只保留RUL大于零的时间窗样本
rulVec = rulVec(validIdx); % 使用逻辑索引过滤RUL向量,去除不合理样本
fprintf('Total windows with positive RUL: %d\n',numel(rulVec)); % 在命令行输出有效时间窗数量,便于粗略检查样本规模
振动特征提取示例
numWins = numel(rulVec); % 更新有效时间窗数量,为后续特征矩阵分配空间提供依据
numFeatures = 10; % 设定初始提取的特征维度数量,这里以10个基础特征为示例
for k = 1:numWins % 遍历每一个有效时间窗,对其中信号进行特征提取
idxStart = (k-1)*winStep + 1; % 为当前窗口计算对应的起始索引,与前面窗口划分策略一致
seg = acc_bp(idxStart:idxEnd); % 从带通滤波后的信号中截取当前窗口的振动子序列
x_mean = mean(seg); % 计算窗口信号的均值,用于描述整体偏移趋势
x_std = std(seg); % 计算标准差,用于刻画振动波动幅度
x_kurt = kurtosis(seg); % 计算峭度,用于反映尖峰程度和冲击特性
x_skew = skewness(seg); % 计算偏度,用于描述波形左右不对称程度
x_pp = max(seg) - min(seg); % 计算峰峰值,用于量化信号的最大幅值范围
x_crest = max(abs(seg))/(x_rms + eps); % 计算峰值因子,防止分母为零时使用eps保持数值稳定
Y = fft(seg); % 对当前窗口信号进行快速傅里叶变换,获取频域表示
P2 = abs(Y/numel(seg)); % 计算双边幅度谱,按点数归一化以便频谱比较
P1 = P2(1:floor(numel(seg)/2)+1); % 取正频率部分的单边振幅谱,避免重复频率
P1(2:end-1) = 2*P1(2:end-1); % 单边谱中除直流和最高频外的幅值乘2,保持能量守恒
band1 = freqAxis >= 500 & freqAxis < 2000; % 定义第一个频段掩码,主要针对低中频区域能量
band3 = freqAxis >= 5000 & freqAxis <= 8000; % 定义第三个频段掩码,聚焦高频冲击能量
e_total = sum(P1.^2); % 计算整个单边频谱的能量总和,作为归一化基准
e1 = sum(P1(band1).^2)/(e_total + eps); % 计算频段1能量占比,防止能量为零时分母为零
e2 = sum(P1(band2).^2)/(e_total + eps); % 计算频段2能量占比,用于反映中高频变化
e3 = sum(P1(band3).^2)/(e_total + eps); % 计算频段3能量占比,关注高频冲击与缺陷相关能量
featureMat(k,1) = x_mean; % 将均值特征写入特征矩阵的第一列
featureMat(k,2) = x_rms; % 将均方根特征写入第二列,用于表示振动强度
featureMat(k,3) = x_std; % 将标准差写入第三列,加强对幅值波动的刻画
featureMat(k,4) = x_kurt; % 将峭度写入第四列,用于捕捉冲击性特征
featureMat(k,5) = x_skew; % 将偏度写入第五列,用于描述分布偏斜
featureMat(k,7) = x_crest; % 将峰值因子写入第七列,衡量峰值与平均能量关系
featureMat(k,10) = e3; % 将高频能量占比写入第十列,聚焦疲劳剥落等冲击信号
end % 完成所有时间窗的特征计算与填充
featureMean = mean(featureMat,1); % 计算每个特征在全部样本上的均值,为标准化做准备
featureMatNorm = (featureMat - featureMean)./(featureStd + eps); % 对特征矩阵进行标准化处理,使各特征具有相近尺度
随机森林回归模型训练示例
rng(2025); % 固定随机数种子,确保随机森林模型训练结果具有可重复性
numSamples = size(featureMatNorm,1); % 获取特征矩阵的样本数量,为划分训练和测试集提供依据
idxAll = idxAll(randperm(numSamples)); % 对样本索引进行随机排列,消除样本顺序对划分结果的影响
trainRatio = 0.7; % 设置训练集占总样本比例为70%,保证有足够数据用于模型拟合
numTrain = round(trainRatio*numSamples); % 根据比例计算训练样本的数量,用于索引分割
idxTrain = idxAll(1:numTrain); % 取前部分索引作为训练集样本编号集合
X_train = featureMatNorm(idxTrain,:); % 根据训练样本索引提取对应的标准化特征行作为训练输入
Y_train = rulVec(idxTrain); % 提取训练样本对应的RUL标签向量,作为回归目标
X_test = featureMatNorm(idxTest,:); % 提取测试样本的特征矩阵,用于评估模型泛化性能
numTrees = 150; % 设置随机森林中回归树的数量,足够数量可以提高预测稳定性
minLeafSize = 10; % 设置最小叶节点样本数,避免生成过于细碎的叶节点以降低过拟合风险
rfModel = TreeBagger(numTrees,X_train,Y_train,... % 调用TreeBagger函数构建随机森林回归模型,输入树数、训练特征和目标变量
'MinLeafSize',minLeafSize,... % 指定叶节点最小样本数,控制单棵树的复杂度
'OOBPrediction','On',... % 启用袋外预测功能,以监控训练过程中的泛化误差
figure; % 打开新图形窗口,用于展示袋外误差随树数变化的曲线
oobErrorVec = oobError(rfModel); % 从模型中提取袋外误差向量,每增加一棵树就有一个误差估计
plot(oobErrorVec,'LineWidth',1.5); % 绘制袋外误差曲线,观察误差是否随树数增加而收敛
xlabel('Number of trees'); % 标注横坐标为树的数量,便于了解训练规模
ylabel('Out-of-bag MSE'); % 标注纵坐标为袋外均方误差,反映模型泛化性能变化
title('Out-of-bag error evolution for RF RUL model'); % 设置标题描述图像内容为随机森林袋外误差演化
mse_test = mean((Y_pred_test - Y_test).^2); % 计算测试集上预测与真实RUL的均方误差,评估平均误差能量
mae_test = mean(abs(Y_pred_test - Y_test)); % 计算测试集上的平均绝对误差,更直观反映平均偏差量
R2_test = 1 - sum((Y_pred_test - Y_test).^2)/sum((Y_test - mean(Y_test)).^2); % 根据总平方和与残差平方和计算R方指标,描述拟合优度
fprintf('Test R2: %.4f\n',R2_test); % 输出测试集R方,数值越接近1说明拟合能力越强
figure; % 打开新图形窗口,展示真实值与预测值的散点关系
hold on; % 保持图像以便叠加参考线
xlabel('True RUL'); % 给横坐标添加标签表示真实剩余寿命
title('Random Forest RUL prediction performance on test set'); % 设置图像标题总结本图的含义
特征重要性分析与特征筛选示例
featureNames = {'mean','rms','std','kurt','skew','pp','crest','E500-2k','E2k-5k','E5k-8k'}; % 为各特征指定名称,便于可视化和解释含义
figure; % 打开新图形窗口,用于展示特征重要性条形图
bar(sortedImp); % 绘制特征重要性柱状图,柱高表示对应特征的重要性数值
xticks(1:numel(sortedImp)); % 设置横坐标刻度位置,使其对应每一个特征条
xticklabels(sortedNames); % 用排序后的特征名称作为横坐标刻度标签,方便识别特征
ylabel('Predictor importance (OOB delta error)'); % 标注纵坐标,说明数值含义为袋外误差变化量
topK = 7; % 选择重要性最高的前7个特征用于构建简化模型,减小特征维度
selIdx = sortedIdx(1:topK); % 通过排序索引截取重要性较高的特征下标集合
X_train_sel = X_train(:,selIdx); % 从训练集特征矩阵中提取选中维度构成新的训练输入
X_test_sel = X_test(:,selIdx); % 从测试集特征矩阵中提取选中维度形成新的测试输入
rfModel_sel = TreeBagger(numTrees,X_train_sel,Y_train,... % 使用筛选后的特征重新训练随机森林模型
'Method','regression',... % 指定回归模式以输出连续寿命值
'MinLeafSize',minLeafSize,... % 保持与原始模型相同的叶节点大小设定
'OOBPrediction','On'); % 启用袋外预测以监控筛选后模型的泛化表现
Y_pred_sel = predict(rfModel_sel,X_test_sel); % 使用简化特征随机森林模型对测试集进行预测
mse_sel = mean((Y_pred_sel - Y_test).^2); % 计算简化模型在测试集上的MSE以与完整特征模型比较
mae_sel = mean(abs(Y_pred_sel - Y_test)); % 计算简化模型在测试集上的MAE,评估误差水平变化
fprintf('Selected-feature RF Test MSE: %.2f\n',mse_sel); % 在命令行输出筛选特征模型的MSE
fprintf('Selected-feature RF Test MAE: %.2f\n',mae_sel); % 输出筛选特征模型的MAE,比较两种模型差异
基于时间顺序的RUL预测曲线示例
t_test_sorted = t_center(idxTest(sortIdxTime)); % 根据排序索引生成按时间升序排列的测试时间序列
Y_test_sorted = Y_test(sortIdxTime); % 按相同顺序排列真实RUL,使之与时间排序一致
Y_pred_sorted = Y_pred_test(sortIdxTime); % 同样对预测RUL按照时间排序,便于绘制对比曲线
figure; % 打开新图形窗口,用于展示RUL随时间变化的预测曲线
hold on; % 保持图像以便叠加预测曲线
plot(t_test_sorted,Y_pred_sorted,'r--','LineWidth',1.5); % 绘制预测RUL曲线,使用红色虚线表示模型估计的寿命趋势
ylabel('RUL / s'); % 标注纵坐标为剩余寿命,同样以秒为单位
legend('True RUL','Predicted RUL'); % 添加图例区分真实寿命曲线与预测曲线
title('Time-ordered RUL evolution: true vs RF prediction'); % 设置图像标题概括该图展示的时间序RUL比较情况
figure; % 新建图形窗口,专门展示预测误差随时间的变化情况
plot(t_test_sorted,Y_pred_sorted - Y_test_sorted,'k-','LineWidth',1.2); % 绘制预测误差曲线,纵坐标为预测值减真实值
xlabel('Time / s'); % 标注横坐标为时间
title('RF RUL prediction error over operating time'); % 设置标题说明该图展示随机森林RUL误差随时间的变化
yline(0,'r--'); % 添加横向零线作为参考,方便判断误差正负方向和偏差大小
简单封装预测接口示例
newSeg = acc_bp(1:winLength); % 以实际运行数据中的一个最新时间窗作为示例,截取相同长度的振动序列
new_mean = mean(newSeg); % 计算新时间窗信号的均值特征
new_rms = rms(newSeg); % 计算新时间窗信号的均方根特征
new_std = std(newSeg); % 计算新时间窗信号的标准差
new_kurt = kurtosis(newSeg); % 计算新时间窗信号的峭度
new_pp = max(newSeg) - min(newSeg); % 计算新时间窗信号的峰峰值
new_crest = max(abs(newSeg))/(new_rms + eps); % 计算新时间窗信号的峰值因子
P1_new = P2_new(1:floor(numel(newSeg)/2)+1); % 截取正频率半谱部分
P1_new(2:end-1) = 2*P1_new(2:end-1); % 对非端点频率幅值乘2以保持单边谱能量一致
band1_new = freqAxis_new >= 500 & freqAxis_new < 2000; % 定义频段1掩码对应500至2000Hz
band2_new = freqAxis_new >= 2000 & freqAxis_new < 5000; % 定义频段2掩码对应2000至5000Hz
band3_new = freqAxis_new >= 5000 & freqAxis_new <= 8000; % 定义频段3掩码对应5000至8000Hz
e2_new = sum(P1_new(band2_new).^2)/(e_total_new + eps); % 计算频段2能量占比
e3_new = sum(P1_new(band3_new).^2)/(e_total_new + eps); % 计算频段3能量占比
feat_new = [new_mean,new_rms,new_std,new_kurt,new_skew,new_pp,new_crest,e1_new,e2_new,e3_new]; % 将新时间窗所有特征拼接成行向量
feat_new_norm = (feat_new - featureMean)./(featureStd + eps); % 对新特征应用与训练阶段相同的标准化变换
feat_new_sel = feat_new_norm(selIdx); % 提取重要性最高的特征子集,以匹配筛选特征模型的输入尺寸
predictedRUL_new = predict(rfModel_sel,feat_new_sel); % 使用筛选特征随机森林模型对新时间窗进行RUL预测,得到当前剩余寿命估计值
fprintf('Predicted RUL for current window: %.2f s\n',predictedRUL_new); % 在命令行输出预测RUL结果,供在线监测系统或人工参考
数据导入与基本预处理示例
clc; % 清空命令行窗口,便于从头查看执行过程的提示信息
close all; % 关闭当前打开的所有图形窗口,防止旧图干扰新的结果展示
dataFile = 'bearing_run2.mat'; % 指定轴承试验数据文件名,文件中包含振动信号与时间信息
load(dataFile,'accData','timeVec','fs'); % 从mat文件中读取加速度数据、时间向量和采样频率,变量名与试验数据结构对应
accData = double(accData); % 将振动数据转换为双精度类型,保证后续信号处理和特征提取的数值精度
timeVec = double(timeVec); % 将时间向量也转换为双精度,以保持与振动数据相同的数据类型
N = numel(accData); % 统计当前试验记录中振动样本的总点数,用于后续窗口划分和诊断
dt = 1/fs; % 根据采样频率计算时间步长,便于在频域分析和时间轴构建中使用
T_total = (N-1)*dt; % 估算本次记录的总时长,便于评估数据覆盖的寿命阶段范围
accData = detrend(accData,'linear'); % 对振动信号执行线性去趋势操作,消除低频漂移和传感器偏置影响
accData = accData - mean(accData); % 再次减去均值,以确保信号整体零均值,有利于后续频谱分析稳定性
f_high = 8000; % 设定带通滤波器的上限频率,避免过高频段噪声干扰特征频率附近能量
filterOrder = 4; % 设定巴特沃斯滤波器的阶数,阶数适中可以兼顾幅频特性和平稳性
figure; % 新建图形窗口,用于展示预处理前后的信号效果
plot(timeVec,accData); % 绘制原始去趋势振动信号随时间变化的波形曲线
hold on; % 保持当前图像,便于在同一坐标系叠加滤波后信号
plot(timeVec,acc_bp); % 绘制带通滤波后的信号曲线,对比信号在目标频带的变化
xlabel('Time / s'); % 标注横坐标为时间,单位为秒,方便读者理解信号持续时间
ylabel('Acceleration / g'); % 标注纵坐标为加速度幅值,可用工程习惯的g单位表示
title('Bearing vibration signal before and after bandpass filtering'); % 设置图像标题,概括图中展示内容
时间窗划分与寿命标签构建示例
winLength = round(0.2*fs); % 设置每个时间窗长度为0.2秒,对应固定采样点数,平衡时间分辨率与统计稳定性
winStep = round(0.1*fs); % 设置相邻时间窗步长为0.1秒,实现50%重叠以更平滑地追踪退化趋势
rul_full = 3600; % 以秒为单位假定一次完整寿命试验的总运行时间,这里取3600秒作为示例总寿命
rulVec = zeros(numWins,1); % 预分配RUL标签向量存储空间,每个时间窗对应一个RUL值
t_center = zeros(numWins,1); % 预分配时间中心向量,记录每个窗口中心点的时间位置
for k = 1:numWins % 遍历所有时间窗,逐步计算每个窗的中心时间和对应RUL
idxEnd = idxStart + winLength - 1; % 计算当前窗口终点索引,确保窗口内包含固定长度数据
if idxEnd > N % 防止窗口终点超出数据长度,若超出则跳出循环避免错误
break; % 结束循环以保持窗口边界合理
end % 窗口边界检查结束
t_center(k) = timeVec(round((idxStart + idxEnd)/2)); % 计算当前窗中心时间,通过起止索引平均并在时间向量中取值
rulVec(k) = max(rul_full - t_center(k),0); % 根据中心时间估算剩余寿命,保证RUL不为负值
end % 时间窗遍历和标签计算结束
validIdx = rulVec > 0; % 生成逻辑索引,只保留RUL大于零的时间窗样本
rulVec = rulVec(validIdx); % 使用逻辑索引过滤RUL向量,去除不合理样本
fprintf('Total windows with positive RUL: %d\n',numel(rulVec)); % 在命令行输出有效时间窗数量,便于粗略检查样本规模
振动特征提取示例
numWins = numel(rulVec); % 更新有效时间窗数量,为后续特征矩阵分配空间提供依据
numFeatures = 10; % 设定初始提取的特征维度数量,这里以10个基础特征为示例
for k = 1:numWins % 遍历每一个有效时间窗,对其中信号进行特征提取
idxStart = (k-1)*winStep + 1; % 为当前窗口计算对应的起始索引,与前面窗口划分策略一致
seg = acc_bp(idxStart:idxEnd); % 从带通滤波后的信号中截取当前窗口的振动子序列
x_mean = mean(seg); % 计算窗口信号的均值,用于描述整体偏移趋势
x_std = std(seg); % 计算标准差,用于刻画振动波动幅度
x_kurt = kurtosis(seg); % 计算峭度,用于反映尖峰程度和冲击特性
x_skew = skewness(seg); % 计算偏度,用于描述波形左右不对称程度
x_pp = max(seg) - min(seg); % 计算峰峰值,用于量化信号的最大幅值范围
x_crest = max(abs(seg))/(x_rms + eps); % 计算峰值因子,防止分母为零时使用eps保持数值稳定
Y = fft(seg); % 对当前窗口信号进行快速傅里叶变换,获取频域表示
P2 = abs(Y/numel(seg)); % 计算双边幅度谱,按点数归一化以便频谱比较
P1 = P2(1:floor(numel(seg)/2)+1); % 取正频率部分的单边振幅谱,避免重复频率
P1(2:end-1) = 2*P1(2:end-1); % 单边谱中除直流和最高频外的幅值乘2,保持能量守恒
band1 = freqAxis >= 500 & freqAxis < 2000; % 定义第一个频段掩码,主要针对低中频区域能量
band3 = freqAxis >= 5000 & freqAxis <= 8000; % 定义第三个频段掩码,聚焦高频冲击能量
e_total = sum(P1.^2); % 计算整个单边频谱的能量总和,作为归一化基准
e1 = sum(P1(band1).^2)/(e_total + eps); % 计算频段1能量占比,防止能量为零时分母为零
e2 = sum(P1(band2).^2)/(e_total + eps); % 计算频段2能量占比,用于反映中高频变化
e3 = sum(P1(band3).^2)/(e_total + eps); % 计算频段3能量占比,关注高频冲击与缺陷相关能量
featureMat(k,1) = x_mean; % 将均值特征写入特征矩阵的第一列
featureMat(k,2) = x_rms; % 将均方根特征写入第二列,用于表示振动强度
featureMat(k,3) = x_std; % 将标准差写入第三列,加强对幅值波动的刻画
featureMat(k,4) = x_kurt; % 将峭度写入第四列,用于捕捉冲击性特征
featureMat(k,5) = x_skew; % 将偏度写入第五列,用于描述分布偏斜
featureMat(k,7) = x_crest; % 将峰值因子写入第七列,衡量峰值与平均能量关系
featureMat(k,10) = e3; % 将高频能量占比写入第十列,聚焦疲劳剥落等冲击信号
end % 完成所有时间窗的特征计算与填充
featureMean = mean(featureMat,1); % 计算每个特征在全部样本上的均值,为标准化做准备
featureMatNorm = (featureMat - featureMean)./(featureStd + eps); % 对特征矩阵进行标准化处理,使各特征具有相近尺度
随机森林回归模型训练示例
rng(2025); % 固定随机数种子,确保随机森林模型训练结果具有可重复性
numSamples = size(featureMatNorm,1); % 获取特征矩阵的样本数量,为划分训练和测试集提供依据
idxAll = idxAll(randperm(numSamples)); % 对样本索引进行随机排列,消除样本顺序对划分结果的影响
trainRatio = 0.7; % 设置训练集占总样本比例为70%,保证有足够数据用于模型拟合
numTrain = round(trainRatio*numSamples); % 根据比例计算训练样本的数量,用于索引分割
idxTrain = idxAll(1:numTrain); % 取前部分索引作为训练集样本编号集合
X_train = featureMatNorm(idxTrain,:); % 根据训练样本索引提取对应的标准化特征行作为训练输入
Y_train = rulVec(idxTrain); % 提取训练样本对应的RUL标签向量,作为回归目标
X_test = featureMatNorm(idxTest,:); % 提取测试样本的特征矩阵,用于评估模型泛化性能
numTrees = 150; % 设置随机森林中回归树的数量,足够数量可以提高预测稳定性
minLeafSize = 10; % 设置最小叶节点样本数,避免生成过于细碎的叶节点以降低过拟合风险
rfModel = TreeBagger(numTrees,X_train,Y_train,... % 调用TreeBagger函数构建随机森林回归模型,输入树数、训练特征和目标变量
'MinLeafSize',minLeafSize,... % 指定叶节点最小样本数,控制单棵树的复杂度
'OOBPrediction','On',... % 启用袋外预测功能,以监控训练过程中的泛化误差
figure; % 打开新图形窗口,用于展示袋外误差随树数变化的曲线
oobErrorVec = oobError(rfModel); % 从模型中提取袋外误差向量,每增加一棵树就有一个误差估计
plot(oobErrorVec,'LineWidth',1.5); % 绘制袋外误差曲线,观察误差是否随树数增加而收敛
xlabel('Number of trees'); % 标注横坐标为树的数量,便于了解训练规模
ylabel('Out-of-bag MSE'); % 标注纵坐标为袋外均方误差,反映模型泛化性能变化
title('Out-of-bag error evolution for RF RUL model'); % 设置标题描述图像内容为随机森林袋外误差演化
mse_test = mean((Y_pred_test - Y_test).^2); % 计算测试集上预测与真实RUL的均方误差,评估平均误差能量
mae_test = mean(abs(Y_pred_test - Y_test)); % 计算测试集上的平均绝对误差,更直观反映平均偏差量
R2_test = 1 - sum((Y_pred_test - Y_test).^2)/sum((Y_test - mean(Y_test)).^2); % 根据总平方和与残差平方和计算R方指标,描述拟合优度
fprintf('Test R2: %.4f\n',R2_test); % 输出测试集R方,数值越接近1说明拟合能力越强
figure; % 打开新图形窗口,展示真实值与预测值的散点关系
hold on; % 保持图像以便叠加参考线
xlabel('True RUL'); % 给横坐标添加标签表示真实剩余寿命
title('Random Forest RUL prediction performance on test set'); % 设置图像标题总结本图的含义
特征重要性分析与特征筛选示例
featureNames = {'mean','rms','std','kurt','skew','pp','crest','E500-2k','E2k-5k','E5k-8k'}; % 为各特征指定名称,便于可视化和解释含义
figure; % 打开新图形窗口,用于展示特征重要性条形图
bar(sortedImp); % 绘制特征重要性柱状图,柱高表示对应特征的重要性数值
xticks(1:numel(sortedImp)); % 设置横坐标刻度位置,使其对应每一个特征条
xticklabels(sortedNames); % 用排序后的特征名称作为横坐标刻度标签,方便识别特征
ylabel('Predictor importance (OOB delta error)'); % 标注纵坐标,说明数值含义为袋外误差变化量
topK = 7; % 选择重要性最高的前7个特征用于构建简化模型,减小特征维度
selIdx = sortedIdx(1:topK); % 通过排序索引截取重要性较高的特征下标集合
X_train_sel = X_train(:,selIdx); % 从训练集特征矩阵中提取选中维度构成新的训练输入
X_test_sel = X_test(:,selIdx); % 从测试集特征矩阵中提取选中维度形成新的测试输入
rfModel_sel = TreeBagger(numTrees,X_train_sel,Y_train,... % 使用筛选后的特征重新训练随机森林模型
'Method','regression',... % 指定回归模式以输出连续寿命值
'MinLeafSize',minLeafSize,... % 保持与原始模型相同的叶节点大小设定
'OOBPrediction','On'); % 启用袋外预测以监控筛选后模型的泛化表现
Y_pred_sel = predict(rfModel_sel,X_test_sel); % 使用简化特征随机森林模型对测试集进行预测
mse_sel = mean((Y_pred_sel - Y_test).^2); % 计算简化模型在测试集上的MSE以与完整特征模型比较
mae_sel = mean(abs(Y_pred_sel - Y_test)); % 计算简化模型在测试集上的MAE,评估误差水平变化
fprintf('Selected-feature RF Test MSE: %.2f\n',mse_sel); % 在命令行输出筛选特征模型的MSE
fprintf('Selected-feature RF Test MAE: %.2f\n',mae_sel); % 输出筛选特征模型的MAE,比较两种模型差异
基于时间顺序的RUL预测曲线示例
t_test_sorted = t_center(idxTest(sortIdxTime)); % 根据排序索引生成按时间升序排列的测试时间序列
Y_test_sorted = Y_test(sortIdxTime); % 按相同顺序排列真实RUL,使之与时间排序一致
Y_pred_sorted = Y_pred_test(sortIdxTime); % 同样对预测RUL按照时间排序,便于绘制对比曲线
figure; % 打开新图形窗口,用于展示RUL随时间变化的预测曲线
hold on; % 保持图像以便叠加预测曲线
plot(t_test_sorted,Y_pred_sorted,'r--','LineWidth',1.5); % 绘制预测RUL曲线,使用红色虚线表示模型估计的寿命趋势
ylabel('RUL / s'); % 标注纵坐标为剩余寿命,同样以秒为单位
legend('True RUL','Predicted RUL'); % 添加图例区分真实寿命曲线与预测曲线
title('Time-ordered RUL evolution: true vs RF prediction'); % 设置图像标题概括该图展示的时间序RUL比较情况
figure; % 新建图形窗口,专门展示预测误差随时间的变化情况
plot(t_test_sorted,Y_pred_sorted - Y_test_sorted,'k-','LineWidth',1.2); % 绘制预测误差曲线,纵坐标为预测值减真实值
xlabel('Time / s'); % 标注横坐标为时间
title('RF RUL prediction error over operating time'); % 设置标题说明该图展示随机森林RUL误差随时间的变化
yline(0,'r--'); % 添加横向零线作为参考,方便判断误差正负方向和偏差大小
简单封装预测接口示例
newSeg = acc_bp(1:winLength); % 以实际运行数据中的一个最新时间窗作为示例,截取相同长度的振动序列
new_mean = mean(newSeg); % 计算新时间窗信号的均值特征
new_rms = rms(newSeg); % 计算新时间窗信号的均方根特征
new_std = std(newSeg); % 计算新时间窗信号的标准差
new_kurt = kurtosis(newSeg); % 计算新时间窗信号的峭度
new_pp = max(newSeg) - min(newSeg); % 计算新时间窗信号的峰峰值
new_crest = max(abs(newSeg))/(new_rms + eps); % 计算新时间窗信号的峰值因子
P1_new = P2_new(1:floor(numel(newSeg)/2)+1); % 截取正频率半谱部分
P1_new(2:end-1) = 2*P1_new(2:end-1); % 对非端点频率幅值乘2以保持单边谱能量一致
band1_new = freqAxis_new >= 500 & freqAxis_new < 2000; % 定义频段1掩码对应500至2000Hz
band2_new = freqAxis_new >= 2000 & freqAxis_new < 5000; % 定义频段2掩码对应2000至5000Hz
band3_new = freqAxis_new >= 5000 & freqAxis_new <= 8000; % 定义频段3掩码对应5000至8000Hz
e2_new = sum(P1_new(band2_new).^2)/(e_total_new + eps); % 计算频段2能量占比
e3_new = sum(P1_new(band3_new).^2)/(e_total_new + eps); % 计算频段3能量占比
feat_new = [new_mean,new_rms,new_std,new_kurt,new_skew,new_pp,new_crest,e1_new,e2_new,e3_new]; % 将新时间窗所有特征拼接成行向量
feat_new_norm = (feat_new - featureMean)./(featureStd + eps); % 对新特征应用与训练阶段相同的标准化变换
feat_new_sel = feat_new_norm(selIdx); % 提取重要性最高的特征子集,以匹配筛选特征模型的输入尺寸
predictedRUL_new = predict(rfModel_sel,feat_new_sel); % 使用筛选特征随机森林模型对新时间窗进行RUL预测,得到当前剩余寿命估计值
fprintf('Predicted RUL for current window: %.2f s\n',predictedRUL_new); % 在命令行输出预测RUL结果,供在线监测系统或人工参考
更多详细内容请访问
http://【机械故障诊断】基于随机森林与MATLAB的轴承剩余寿命预测系统MATLAB实现基于随机森林(RF)进行轴承剩余寿命预测的详细项目实例(含完整的程序,GUI设计和代码详解)_Matlab灰狼算法优化SVM资源-CSDN下载 https://download.csdn.net/download/xiaoxingkongyuxi/90259171
https://download.csdn.net/download/xiaoxingkongyuxi/90259171
http:// https://download.csdn.net/download/xiaoxingkongyuxi/90259171
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐







所有评论(0)