新闻详情

新闻详情

首页 / 资讯中心 / 详情

基于SVM的齿轮箱轴承故障诊断:从振动信号特征提取到MATLAB实现

发布时间:2026/9/25 15:16:08来源:尧图网络
基于SVM的齿轮箱轴承故障诊断:从振动信号特征提取到MATLAB实现
简介这是一份基于支持向量机SVM的齿轮箱轴承故障诊断文档面向机械设备状态监测、故障诊断方向的研究人员、工程师及相关专业学生。文档内容扎实先概述轴承在旋转设备中的重要性再系统分析滑动轴承的磨粒磨损、刮伤、咬合、疲劳剥蚀、腐蚀等失效形式继而介绍轴承故障诊断的发展趋势与智能诊断思路并重点讲解SVM的统计学习原理、结构风险最小化思想和在故障分类中的应用价值。同时文档给出诊断流程与MATLAB程序覆盖振动信号数据采集、预处理、特征提取、模型训练和故障识别等关键环节便于读者理解并复现基于SVM的故障诊断方案。资源包为1个docx文件大小仅196KB轻量易读截至目前已有1944人学习下载适合课程设计、毕业设计或工程入门人员参考。1. 基于SVM的齿轮箱轴承故障诊断先让振动信号变成一张能训练的表格轴承故障早期冲击成分往往埋在噪声里频谱上的边带肉眼很难分辨。与其靠经验盯包络谱不如把问题交给分类器——基于SVM的齿轮箱轴承故障诊断本质上就是把振动信号分到“正常、内圈、外圈、滚动体”这几个类别里。SVM在小样本、二维表格数据上的稳定性恰好对得上故障诊断的真实场景故障样本难得、标注成本高、数据量通常只有几百组。这个方向常见的交付物就是一份包含MATLAB程序和说明的文档核心流程是先从振动信号里提取特征再训练SVM分类器最后用混淆矩阵验证效果。适合正在做设备状态监测的人、拿这类题目做毕业设计的学生以及想从深度学习回归到经典机器学习里找可靠方案的一线工程师。2. 从振动信号到特征矩阵时域、频域与标签的组织方式很多第一次接触SVM故障诊断的人会问为什么不能把原始波形直接丢给分类器从原理上讲SVM输入的是一个二维矩阵行是样本、列是特征。原始振动序列虽然也能被当成一行特征但一段8192点的信号就意味着8192维RBF核的核矩阵是样本数的平方量级算不动是小事更麻烦的是“维度灾难”——样本只有几百组特征却有几千维SVM几乎必然过拟合。特征提取的作用是把一段信号压缩成十几个有物理意义的指标同时完成降维和去噪。这一章解决的就是诊断流程的第一步怎么把原始波形整理成SVM能直接吃进去的表格。2.1 为什么不能把原始波形直接丢给SVM从数学上看SVM在一个特征空间里切超平面样本维度越高超平面越容易“钻空子”把训练集分对但换一组数据就翻车。轴承振动信号里还藏着相位问题同一类故障在不同转速下波形起始相位完全不一样按逐点欧氏距离去度量两个同类样本之间的距离可能比不同类的还要大。特征提取把波形压缩成均值、峭度、重心频率这类统计量之后相位信息被丢掉留下来的才是和故障类型真正相关的信息。另外还有一个工程原因原始波形的存储和读取成本高。现场采集的数据动辄几十MB而特征矩阵只有几百KB无论做交叉验证还是后续部署特征表格都用起来更顺手。这个阶段做扎实了后面SVM训练只是几分钟的事。2.2 时域特征峭度、峰值因子这类冲击敏感指标怎么算轴承故障在时域上最典型的表现是周期性冲击时域特征里最能抓住这一点的是峭度和峰值因子。峭度是四阶中心矩除以方差平方正常振动信号近似高斯分布峭度接近3出现早期剥落时冲击成分让峭度明显升高。峰值因子是峰值除以均方根值对单次大幅值冲击更敏感。下面是提取一组时域特征的MATLAB函数function fea extract_features(x, fs) % x: 单段振动信号行向量 % fs: 采样率用于频域特征计算 % fea: 1x12 的特征向量 N length(x); M mean(x); % 均值反映信号直流分量 S std(x); % 标准差能量波动程度 RMS sqrt(mean(x.^2)); % 均方根值振动能量总体水平 Peak max(abs(x)); % 峰值冲击幅值 % 峭度四阶中心矩 / 方差^2早期故障冲击越强峭度越高 Kurt mean((x - M).^4) / (S^4 eps); % 偏度三阶中心矩 / 方差^1.5反映波形不对称性 Skew mean((x - M).^3) / (S^3 eps); AR mean(abs(x)); % 平均绝对值作为稳定分母 CF Peak / (RMS eps); % 峰值因子冲击类故障的经典指标 SF RMS / (AR eps); % 波形因子 IF Peak / (AR eps); % 脉冲因子 CIF Peak / (mean(sqrt(abs(x))) eps)^2; % 裕度因子 % 频域特征见下一小节 Xf fft(x); A abs(Xf(1:floor(N/2))); f (0:floor(N/2)-1) * fs / N; FC sum(f .* A) / (sum(A) eps); % 重心频率 RMSF sqrt(sum((f.^2) .* A) / (sum(A) eps)); % 均方频率 VF sum(((f - FC).^2) .* A) / (sum(A) eps); % 频率方差 fea [M, S, RMS, Peak, Kurt, Skew, CF, SF, IF, CIF, FC, RMSF, VF]; end这段代码里有几个地方值得说明。计算波形因子和脉冲因子时如果直接用mean(x)做分母遇到直流分量为零的振动信号绝大多数情况都是零会产生无穷大或极不稳定的数值所以这里用平均绝对值AR替代。每个除法后面都加了eps防止除以零。峭度公式里的S^4在MATLAB里可能超出数值范围如果遇到警告可以先对x做归一化再用。2.3 频域特征重心频率与频率方差时域特征只看幅值随时间的变化看不出能量集中在哪个频段。轴承内圈故障的特征频率和转频、啮合频率往往不同频域特征能把这些差异表达出来。对每段信号做FFT取单边幅值谱然后计算三个统计量重心频率表示频谱能量集中的位置均方频率反映频带分布范围频率方差衡量能量在重心附近的离散程度。这三个量在齿轮箱不同故障状态下区分度比较明显代码已在上面函数中一并实现。如果发现时域加频域特征仍然无法区分某些类别比如滚动体故障和正常状态在频谱上几乎重合常见做法是按频带拆开看能量分布。MATLAB里用小波包分解很方便wpt wpdec(x, 3, db4); % 3层小波包分解db4小波 E wenergy(wpt); % 各节点能量百分比把小波包各频带能量百分比追加到特征向量后面相当于把频域特征细分到子带。这个做法能有效提升滚动体故障的分类效果代价是特征维度增加需要相应增加样本量或做特征筛选。2.4 批量生成特征矩阵与标签表单个样本的特征提取写好之后要把整个数据集批量跑一遍组织成标准的特征矩阵。假设原始数据按故障类型分目录存放每个目录下是若干段振动信号的mat文件% 数据目录结构: ./data/1_normal, ./data/2_inner, ./data/3_outer, ./data/4_ball dirs {1_normal, 2_inner, 3_outer, 4_ball}; labels [1 2 3 4]; % 标签用数字编码 fs 12800; % 采样率按实际数据修改 X []; % 特征矩阵 Y []; % 标签向量 for k 1:length(dirs) files dir(fullfile(data, dirs{k}, *.mat)); for i 1:length(files) d load(fullfile(files(i).folder, files(i).name)); x d.signal; % 每段信号, 注意字段名要对应 fea extract_features(x, fs); X [X; fea]; % 行拼接 Y [Y; labels(k)]; end end save(feature_matrix.mat, X, Y);注意每类样本量最好不少于30段总量在100组以上SVM的交叉验证结果才有意义。故障样本少就通过重叠滑窗把长信号切成分段样本段长度取转频周期的整数倍左右。标签和故障状态的对应关系建议单独存一份说明避免后续弄混。常见编码是1正常、2内圈、3外圈、4滚动体这个映射关系在训练和评估阶段要始终保持一致。3. SVM核函数与关键参数在MATLAB里的设置C、KernelScale、多分类策略特征矩阵准备好之后下一步是在MATLAB里训练SVM。这一章先把SVM最影响诊断结果的三个设置讲清楚惩罚系数C、核函数及KernelScale、多分类策略。很多教程直接给一句“用fitcecoc就行”但参数为什么这么设、改了会怎样才是实际调试时最花时间的部分。3.1 硬间隔、软间隔和BoxConstraint的关系SVM的目标是在两类样本之间找一个超平面并且让间隔最大化。硬间隔要求所有训练样本都被正确分类且落在间隔边界之外这在轴承振动数据上几乎做不到——信号里有噪声、冲击干扰总有一个两个样本跑到对面阵营里。硬间隔SVM会把这种个别异常点当成支持向量决策边界被带跑训练集准确率看着不低推广却很差。软间隔SVM允许部分样本出现在间隔内部甚至被错分用一个松弛变量度量违反程度并用C参数控制惩罚力度。C越大模型越不愿意放过训练集里的错误边界越复杂C越小允许更多错分边界越平滑但可能欠拟合。MATLAB里C对应templateSVM的BoxConstraint参数默认值是1。轴承故障诊断的经验范围通常是0.01到100先按数量级网格搜索再在最优值附近细化。推导上不需要自己实现梯度下降MATLAB底层用SMO算法求解对偶问题KKT条件决定哪些样本成为支持向量。但C的数量级直接影响支持向量的数量C过大时支持向量很多边界曲折C过小时支持向量很少边界过于宽松。理解这个关系比背公式更能指导调参。3.2 核函数选型RBF的KernelScale参数到底在调什么线性核只能切线性边界单一稳定工况下偶尔够用但轴承故障数据在特征空间里往往是非线性分布的。多项式核需要调阶数阶数高一点数值就溢出工程上很少用它。默认且稳妥的选择是RBF高斯核它把样本映射到无穷维特征空间同时真正参与计算的只是样本间的距离。RBF核的宽度参数在MATLAB里叫KernelScale这个名字容易让人误解。它的含义是当两个样本的距离达到KernelScale量级时核函数值衰减到接近0。KernelScale越小距离稍远一点的样本就被判定为“不像”边界越曲折容易过拟合KernelScale越大远近样本都能互相影响边界越平滑可能欠拟合。它和很多资料里的gamma参数的关系是gamma 1 / (2 * KernelScale^2);也就是说热搜里常见的硬间隔SVM、梯度下降、KKT这些关键词真正落实到MATLAB调参时你只需要记住两个旋钮BoxConstraint和KernelScale。第一版可以KernelScale取1跑完交叉验证再看是增还是减。3.3 多分类与fitcecoc的默认策略fitcsvm原生只做二分类齿轮箱轴承诊断有四种状态需要用fitcecoc做多分类封装。它的原理是把多分类拆成多个二分类器默认策略是one-vs-one也就是任意两类之间训练一个SVM四类问题一共训练六个分类器最终通过投票决定类别。相比one-vs-allone-vs-one在类别较为均衡时边界更精细对故障诊断这种每类样本量差不多的场景更合适。在用fitcecoc时要把templateSVM作为Learners传进去这样BoxConstraint和KernelScale才会生效。如果不传默认用的是线性核你再怎么调KernelScale都不起作用这是常见的隐形坑。3.4 网格搜索找最优C和KernelScale手调参数靠感觉网格搜索才是可复现的做法。先粗后细第一轮给C和KernelScale各取四五个值用5折交叉验证选出最优组合第二轮在最优值附近细化。MATLAB代码如下rng(42); % 固定随机种子保证结果可复现 C_list [0.1 1 10 100]; KS_list [0.5 1 2 4]; acc_best 0; for C C_list for ks KS_list t templateSVM(KernelFunction, rbf, ... BoxConstraint, C, KernelScale, ks); mdl fitcecoc(Xtr, Ytr, Learners, t, KFold, 5); acc 1 - kfoldLoss(mdl); fprintf(C%.1f KernelScale%.1f acc%.4f\n, C, ks, acc); if acc acc_best acc_best acc; C_best C; ks_best ks; end end end fprintf(最优: C%.1f KernelScale%.1f acc%.4f\n, ... C_best, ks_best, acc_best);这里用的是kfoldLoss它返回的是分类误差所以用1减去得到准确率。注意变量命名Xtr和Ytr是已经归一化过的训练集不是原始特征这个细节在下一章展开。网格搜索跑完后最优C和KernelScale要保存下来后面训练最终模型和部署都要用同一组参数。4. 跑通最小诊断流程训练、验证、混淆矩阵的MATLAB实现工具与参数都准备好后可以跑一个完整的诊断流程。这一章把从数据划分到模型保存的每一步都写成可执行代码顺序就是正确顺序尽量不要跳步。4.1 数据划分用cvpartition做分层HoldOut训练SVM之前先划分数据集。常见比例是训练集70%、测试集30%但直接用randperm随机切会有一个问题某类故障样本本来就不多随机切完测试集里可能只剩下两三个该类样本混淆矩阵没法看。cvpartition在传入标签向量时会自动按标签比例分层每一类在训练集和测试集中的占比大致相同。load(feature_matrix.mat); % 包含 X 和 Y rng(42); cv cvpartition(Y, HoldOut, 0.3); Xtr X(cv.training, :); Ytr Y(cv.training); Xte X(cv.test, :); Yte Y(cv.test); fprintf(训练样本: %d, 测试样本: %d\n, ... sum(cv.training), sum(cv.test));逻辑说明cvpartition返回的对象用training和test两个索引向量区分训练集与测试集。HoldOut指定保留30%作为测试集剩下的70%训练。这里固定rng(42)是为了让每次运行划分结果一致否则每次跑出来的准确率都不一样自己都说不清模型到底好不好。4.2 归一化必须在划分之后做这是整个流程里最容易出错也最影响结果的一步。很多人先对整个特征矩阵做zscore再划分训练测试集看起来无伤大雅实际上已经造成测试集信息泄漏归一化时用到了测试集的均值和标准差相当于测试集的部分统计信息提前进了模型。正确做法是只计算训练集的统计量然后用它变换测试集。[Ztr, mu, sigma] zscore(Xtr); % 防呆处理常数值特征的标准差为0会导致测试集出现NaN sigma(sigma 0) 1; Zte (Xte - mu) ./ sigma;参数说明zscore的第一个输出是归一化后的训练集第二、第三个输出分别是均值和标准差。测试集变换时不能用zscore直接做而是手动减训练集均值、除训练集标准差。这一步做错测试集准确率大概率虚高2%到5%做跨工况验证时更明显。这是故障诊断里必须守住的边界。4.3 训练、预测与混淆矩阵用上一章网格搜索得到的最优参数训练最终模型在测试集上预测并画混淆矩阵t templateSVM(KernelFunction, rbf, ... BoxConstraint, C_best, KernelScale, ks_best); mdl fitcecoc(Ztr, Ytr, Learners, t); Ypred predict(mdl, Zte); acc mean(Ypred Yte); fprintf(SVM测试集准确率: %.2f%%\n, acc * 100); figure; confusionchart(Yte, Ypred);代码里的C_best和ks_best就是3.4节网格搜索输出的值这里直接复用。fitcecoc在训练阶段会自动生成六个二分类器预测时每个样本让六个分类器投票票数最多的类别作为输出。confusionchart直接用真实标签和预测标签绘图矩阵对角线上是正确分类的数量非对角线上的块越密集说明哪两类最容易被混淆。老版本MATLAB没有这个函数可以用confusionmat自己画热力图效果一样。4.4 保存模型把训练结果沉淀成可复用文件诊断模型不能每次重新训练训练完成后要保存成文件现场只需要加载模型和新数据的特征就能预测。MATLAB推荐的做法是saveCompactModel(mdl, bearing_svm_model.mat); % 部署时加载模型对新的特征向量预测 new_mdl loadCompactModel(bearing_svm_model.mat); Ynew predict(new_mdl, Zte(1, :));saveCompactModel会去掉训练数据只保留模型结构和支持向量文件体积比直接save小不少。部署时注意两件事一是必须带上特征提取函数新数据要先走extract_features再进模型二是归一化的mu和sigma也要保存下来预测前对特征做同样的变换。这些零散文件建议统一放在一个目录下路径用相对路径换机器也能跑。5. 避坑与排查SVM故障诊断中常见的5个翻车点SVM本身是一个成熟算法故障诊断项目翻车往往不在算法而在数据准备和流程顺序。这里列五个我见过频率最高的坑每条按现象、原因、解决顺序写清楚对照检查能省下大量调试时间。5.1 训练集95%测试集60%归一化顺序错了现象训练集交叉验证准确率很高测试集突然掉20个百分点而且每次重新划分结果波动很大。 原因先对整个特征矩阵归一化再划分训练测试集。测试集的均值和标准差被混进了训练过程模型在测试集上“作弊”了但泛化能力没有真实提升。 解决把归一化移到划分之后只用训练集的mu和sigma变换测试集。同时检查代码里的zscore是不是写在了cvpartition前面。这个坑在网上一搜一大片中招的人几乎都是同样的顺序问题。5.2 滚动体故障总被分到“正常”样本长度不够现象混淆矩阵里其他三类都挺好唯独滚动体故障大量被预测成正常。 原因滚动体故障特征频率不是转频的整数倍故障点接触时间短冲击能量在时域上比较稀散。如果一段信号只覆盖一两个旋转周期滚动体故障的冲击特征根本统计不出来。 解决把样本长度加长到覆盖5到10个旋转周期或者用重叠滑窗切样本。切完后检查一下每类样本的峭度均值滚动体故障样本的峭度通常应该比正常类高出一截如果差距不明显再加小波包频带能量特征试试。5.3 拿到docx里的MATLAB程序中文注释全是乱码现象复制docx里的代码到MATLAB编辑器中文注释变成乱码直接运行报错。 原因docx里嵌入的代码通常是GBK编码MATLAB新版本默认UTF-8读取时解码不一致。 解决在MATLAB编辑器里用“另存为”把编码改成UTF-8或者干脆把中文注释删掉只保留英文和代码。如果程序本身是用中文注释写的先在一个文本编辑软件里转成UTF-8再复制。这个问题的触发频率很高和MATLAB版本无关纯编码事件。5.4 SVM训练极慢把原始波形当成特征了现象fitcecoc训练几分钟跑不完或者直接内存溢出。 原因输入矩阵不是特征表而是原始波形矩阵比如X的维度是240×8192。RBF核需要计算样本间的核矩阵复杂度接近样本数的平方再乘特征维度特征维度上万时计算量爆炸。 解决回到第2章先把波形压缩成十几个特征。如果确实想保留波形部分信息先用PCA或自编码器降维到50维以内再进SVM。特征维度超过样本量时优先考虑线性核或者先做特征筛选。5.5 换个转速就失效工况变了现象训练集和测试集来自同一转速时准确率95%换一批不同负载或转速的数据准确率跌到70%以下。 原因时域特征里的幅值、均方根值对转速和负载敏感模型学到的是“这个转速下的正常状态长什么样”而不是“轴承坏没坏”。 解决训练时把不同转速、不同负载的数据混进训练集让SVM见过尽量宽的工况变化。频率类特征尽量除以转频做归一化把绝对频率变成相对阶次。这属于故障诊断里的跨工况泛化问题SVM本身不会自动解决要在数据组织阶段提前考虑。6. 进阶用法用预测分数做置信度筛选让模型敢说“不知道”6.1 用分数gap把不确定样本筛出来分类准确率看着不错并不代表模型在现场可靠。实际部署时总有一些样本落在类别边界附近强行给它贴一个标签还不如直接标记为“待人工复核”。predict函数在输出标签的同时还会返回每个样本对每个类别的分数利用这个分数可以做置信度筛选。[Ypred, score] predict(mdl, Zte); % score: 样本数×类别数矩阵, 每行是该样本属于各类的得分 [score_sorted, idx_sorted] sort(score, 2, descend); gap score_sorted(:, 1) - score_sorted(:, 2); % gap 是最高分与次高分的差距, 越大说明模型越确定 threshold 0.1; suspicious gap threshold; Ypred(suspicious) 0; % 0 表示待人工复核这里的score是多分类器对每个类别的投票得分汇总数值范围大致在-1到1之间。gap越大说明最高分和次高分拉开明显距离模型对这个样本的归属比较笃定gap很小说明两个类别得分接近模型本质上是“掷硬币”。阈值0.1只是一个起点我一般会先画出gap的直方图选一个能把边界样本明显分离的拐点再微调。6.2 模型落地的小习惯把训练好的模型和mu、sigma、特征提取函数打包到一起保存成统一的版本目录。新来一段信号先算特征再归一化再预测然后看分数gap决定是否置信。我第一次上线时只盯着准确率结果现场一条没见过的冲击干扰直接让模型把正常样本判成故障误报了一整晚。后来我养成了一个习惯凡是gap低于阈值的样本不管预测成哪一类一律标记为“待校验”不直接进报警逻辑。这样虽然偶尔要多看几张波形图但再也没有出现过让现场提心吊胆的误报。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

XXE漏洞从原理到实战:外部实体注入的检测、利用与防御 2026/9/25 15:52:51

XXE漏洞从原理到实战:外部实体注入的检测、利用与防御

做了几年安全测试,如果只让我选一个“看起来冷门、实际一打一个准”的漏洞,我大概率会选XXE。很多团队把精力全扑在SQL注入和XSS上,结果某一天扫出个XML外部实体注入,直接懵在原地——这玩意儿到底怎么利用?怎么修复&a…

阅读更多 →
RAG+LLM抽取年报AI变量,构建绿色全要素生产率实证模型 2026/9/25 15:52:51

RAG+LLM抽取年报AI变量,构建绿色全要素生产率实证模型

简介:面向金融科技与环境经济交叉领域的研究者,项目包演示了基于RAG与大语言模型分析A股上市公司年报的完整流程,旨在量化评估人工智能对企业绿色全要素生产率(GTFP)的影响,并引入融资约束异质性视角开展稳…

阅读更多 →
我写了 50 个 Claude Code Skill 才发现,前 30 个都白写了:SKILL.md 配置避坑清单 2026/9/25 15:52:25

我写了 50 个 Claude Code Skill 才发现,前 30 个都白写了:SKILL.md 配置避坑清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
好用的电商数据API接口分享:TaoToken统一Key接入京东/淘宝天猫/1688商品详情数据API 2026/9/25 15:52:25

好用的电商数据API接口分享:TaoToken统一Key接入京东/淘宝天猫/1688商品详情数据API

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
9款AI论文写作软件实测:用TaoToken统一Key打通开题报告、论文大纲与期刊论文工作流 2026/9/25 15:52:19

9款AI论文写作软件实测:用TaoToken统一Key打通开题报告、论文大纲与期刊论文工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
AI Agent 框架探秘:拆解 OpenHands 的 Microagents 配置骨架 2026/9/25 15:52:19

AI Agent 框架探秘:拆解 OpenHands 的 Microagents 配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉