ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于SVM的齿轮箱轴承故障诊断:MATLAB特征提取与模型训练全解析

基于SVM的齿轮箱轴承故障诊断:MATLAB特征提取与模型训练全解析 简介面向齿轮箱滑动轴承故障诊断与机器学习应用场景的成套资料围绕支持向量机SVM对振动信号进行故障类型识别展开适用于机械工程、智能制造及相关专业学生的课程设计、论文研究或工业预研。内容系统覆盖滑动轴承常见失效形式磨粒磨损、刮伤、咬合、疲劳剥蚀、腐蚀等、故障诊断与预测性维护意义、SVM的统计学习原理与优缺点并给出从数据采集、预处理、特征提取到模型训练与分类的完整实施路径其中结合了可参考的Matlab程序便于在实际信号中尝试复现。资源为1个docx文档大小仅196KB目前已有1944人学习/下载适合希望快速上手SVM故障诊断方法的研究者与工程师直接获取一套从理论到代码验证的紧凑参考资料无需再四处搜集相关知识。1. 这套方案解决什么问题别再靠“听”诊轴承了齿轮箱轴承故障在产线上有个很现实的问题故障早期基本听不出来等振动异常到老技师隔着机罩都能判断时往往已经伤及齿轮甚至整机——备件停机成本早就超过了换轴承本身。基于SVM的齿轮箱轴承故障诊断含matlab程序做的是这样一件事把轴承振动信号转换成一组“人类能解释、机器能计算”的特征再用支持向量机把正常、外圈故障、内圈故障、滚动体故障这几类状态分出来。它把诊断从经验活变成了可量化的流程采集信号、提取特征、训练模型、部署到采集软件上自动识别。这套行的价值点在“小样本”三个字上。轴承故障数据不像图像数据集那样动辄几万张很多现场能拿到的有效故障样本只有几十到几百组这种尺度下SVM比CNN更务实——收敛快、参数少、单机就能跑而且训练出的模型是稀疏支持向量部署时计算量非常小。适合谁设备维护和状态监测工程师、做传动系统课题的研究生以及想把“诊断”加进现有监控系统但又不想上深度学习服务器的人。需要的前提也很低一台装着MATLAB的台式机一段可用的振动信号哪怕是公开数据集就能把整条链路跑起来。2. 为什么选SVM而不是硬上神经网络小样本分类的边界与核函数选型SVM在轴承故障诊断里被广泛使用不是因为它新而是因为它和这个问题的特性匹配得恰到好处。要先理解这一点后面的参数调起来才不会像在调“玄学”。2.1 故障诊断的本质是分类问题SVM的归纳偏置恰好匹配轴承故障诊断在算法层面就是一个分类任务给定一段振动信号的若干特征判断它属于正常、外圈故障、内圈故障还是滚动体故障。关键难点在于故障样本非常贵——你得真的把轴承跑坏或人为加工缺陷才能拿到标签数据。这就导致可用的训练样本量通常只有几十到几百条每条的维度却可能有几十维。SVM支持向量机的立身之本就是小样本高维分类。它的优化目标是找最大间隔超平面决策边界只由少数支持向量决定而不是像逻辑回归那样依赖全部样本的统计信息。即使样本量少只要支持向量选得准泛化能力依然可观。从优化角度看SVM求解的是一个凸二次规划问题收敛到全局最优没有局部极值的困扰最优性由KKT条件判定这也是MATLAB中quadprog或SMO类求解器收敛判据的核心。相比神经网络的梯度下降要反复试学习率、怕陷入鞍点SVM的训练确定性高得多这在工程上意味着——同一份代码换台机器跑结果基本可复现。提示软间隔SVM中的惩罚系数C本质是在“最大限度推开两类”和“容忍个别难分样本”之间做折中。C小模型偏向宽松、容易欠拟合C大模型偏向严格、容易把噪声也学进去。轴承振动信号里噪声很强C不宜一开始就设到100以上。2.2 核函数怎么选RBF是默认项线性核和多项式核的使用边界SVM做非线性分类靠的是核函数kernel。在MATLAB统计与机器学习工具箱里fitcsvm和fitcecoc都支持通过KernelFunction指定核常见有四种它们的适用场景差别很大核函数决策边界形态MATLAB写法适用场景主要参数线性核超平面linear特征已高维、近似线性可分无多项式核多项式曲面polynomial有先验知道阶次低维少量特征PolynomialOrderRBF高斯核任意复杂曲面rbf特征关系未知默认首选KernelScaleSigmoid核类神经网络曲面sigmoid很少用数值易不稳定无实际做轴承诊断时我基本只用RBF高斯径向基核。原因很直接特征是振动信号的统计量、频域峰值等它们和故障类别之间没有已知的线性关系也没有明确的“该用几阶多项式”的先验RBF核能逼近任意非线性边界相当于一个万能近似器参数只需要调一个KernelScale等价于gamma——在MATLAB里写templatesvm(KernelFunction,rbf,KernelScale,scale)就行。RBF核有一个要记住的直觉KernelScale越小每个支持向量的影响范围越小决策边界越弯、越容易过拟合KernelScale越大边界越平滑但太小会让所有样本都变成支持向量、失去泛化能力。调参时我一般让KernelScale在特征数值尺度附近的一个数量级区间内网格搜索而不是凭感觉直接填个0.1。2.3 多分类策略一对一为什么比一对多稳轴承故障诊断至少是四分类正常、外圈、内圈、滚动体而标准SVM在数学上是个二分类器。要在MATLAB里做多分类记住一条fitcsvm是二分类fitcecoc才是多分类接口。fitcecoc底层用的是ECOC纠错输出码框架把多分类问题拆成多个二分类子问题。常见的拆分策略有两种一对一One-vs-OneOvO和一对多One-vs-AllOvA。OvA的问题是每个子分类器都要拿“某一类”对“剩下所有类”训练一旦原始样本不均衡多数类会严重压制少数类训练出的子模型往往把边界推向少数类一侧。OvO则是每两两类别之间训练一个子分类器四分类就是6个子分类器投票决策——每个子问题只有两个类样本不均衡的影响小得多单个子分类器也更容易训好。代价是子分类器数量随类别数平方增长但四分类时只有6个部署计算量完全可接受。先别急着上真实故障数据我用一段两行数据验证环境是否正常。打开MATLAB命令行确认统计与机器学习工具箱可用ver(stats);如果输出里没有Statistics and Machine Learning Toolbox说明工具箱没装或没激活后面fitcecoc代码跑不了。确认已安装后再用一个小例子测试多分类接口rng(42); X [randn(20,2) [2,2]; ... randn(20,2) [-2,-2]; ... randn(20,2) repmat([2,-2],20,1)]; Y [ones(20,1); 2*ones(20,1); 3*ones(20,1)]; mdl fitcecoc(X, Y, ... Learners, templatesvm(KernelFunction,rbf,KernelScale,1)); pred predict(mdl, X); acc mean(pred Y); disp([训练集回判准确率: , num2str(acc)]);这段代码生成三类高斯分布的点用fitcecoc训练一个RBF核SVM多分类器。注意Learners参数传入的是templatesvm返回的模板对象这是fitcecoc与fitcsvm在参数传递上最大的区别——所有SVM参数都包在模板里。回判准确率接近1是正常的说明接口和环境没问题可以继续往下做真实特征。3. 特征提取才是真正的算法环节时域统计量、包络谱与轴承特征频率很多第一次接触这个方向的人会以为重点在SVM调参上实际恰恰相反。SVM只是最后一步的分类工具决定诊断上限的是你喂给它的特征有没有把故障信息表达出来。特征提取做不好换什么核函数都是白搭。3.1 时域特征峭度、峰值因子与标准差哪些特征真的能分时域特征是从原始振动波形上直接算的统计量计算最快、物理意义最直观。早期轴承故障在时域上表现为周期性的冲击脉冲会显著改变波形形态所以统计特征是最基础的一层。特征物理含义MATLAB实现对什么敏感均值信号直流分量mean(x)安装误差、轴弯曲趋势标准差振动能量std(x)整体强度变化峭度波形冲击性kurtosis(x)早期剥落、点蚀产生的冲击峰值因子峰值与有效值之比peak_factor(x)冲击型故障初发波形因子有效值与整流均值之比rms/mean(abs(x))波形畸变但能量未大增裕度因子峰值与整流均方根之比peak/sqrt(mean(abs(x)))稀疏冲击比峰值因子更灵敏我一般用一个特征提取函数把这个特征一次算出来顺便把频谱和包络谱特征也一起算好避免为每个特征重复读数据。注意kurtosis函数在MATLAB里默认是样本峭度和很多论文里定义的总体峭度略有差异但趋势一致不用过度纠结。3.2 频域特征包络谱解调与轴承特征频率BPFO/BPFI/BSF/FTF时域特征能告诉你“波形有没有冲击”但说不清冲击来自外圈还是内圈。这个信息藏在频谱的边带结构里靠的是包络谱解调——先对振动信号做Hilbert变换得到解析信号取模得到包络再对包络做FFT得到的包络谱会在故障特征频率处出现明显谱峰。轴承每类故障都有可计算的特征频率公式是固定的取决于轴承几何参数外圈故障频率BPFO (n/2) × fr × (1 - d/D × cosα)内圈故障频率BPFI (n/2) × fr × (1 d/D × cosα)滚动体故障频率BSF (D/(2d)) × fr × (1 - (d/D)² × cos²α)保持架故障频率FTF (fr/2) × (1 - d/D × cosα)其中n是滚动体数量d是滚动体直径D是轴承节径α是接触角fr是轴转频转速除以60。工程上有个更省事的习惯直接用整个轴承的型号查手册拿到BPFO系数比如某型号的BPFO 5.42×fr再用轴转频乘一下就能定位包络谱里的峰值位置。一段能直接用的matlab计算特征频率的脚本function [BPFO, BPFI, BSF, FTF] bearing_freq(n, d, D, alpha, fr) % n: 滚动体数量 % d: 滚动体直径 (mm) % D: 节径 (mm) % alpha: 接触角 (rad) % fr: 轴转频 (Hz) BPFO (n/2) * fr * (1 - d/D * cos(alpha)); BPFI (n/2) * fr * (1 d/D * cos(alpha)); BSF (D/(2*d)) * fr * (1 - (d/D)^2 * cos(alpha)^2); FTF (fr/2) * (1 - d/D * cos(alpha)); end用的时候注意单位d和D只要保持比例关系一致即可单位不用非得毫米alpha如果手里是角度值先执行alpha deg2rad(alpha)。还有个细节内圈故障的特征频率会受转频调制包络谱里除了BPFI本身BPFI周边还会出现间隔为fr的边带排查频谱时要看整簇而不是只看单根谱线。包络谱求解代码function [env_spectrum, f_axis] envelope_spectrum(signal, fs) % signal: 原始振动信号 % fs: 采样率 (Hz) analytic hilbert(signal); % Hilbert变换 envelope abs(analytic); % 包络信号 nfft 2^nextpow2(length(envelope)); % 补零到2的幂次 env_spectrum abs(fft(envelope, nfft)) / length(envelope); f_axis (0:nfft-1) * fs / nfft; % 频率轴 env_spectrum env_spectrum(1:nfft/2); f_axis f_axis(1:nfft/2); end注意hilbert是MATLAB信号处理工具箱的函数如果提示未定义要先确认Signal Processing Toolbox已安装。包络谱的谱线数和频率分辨率由fft的点数决定采样时长越长分辨率越高诊断时我习惯至少保证0.5Hz的分辨率否则特征频率附近的边带会糊成一片。3.3 特征矩阵组装与标准化matlab里的数据洗法单个样本算出的特征要拼成一个特征向量再组装成整个数据集的矩阵。比如你对每段信号算了6个时域特征、在包络谱上取了5个特征频率处的幅值、再加上几个频带能量那每个样本就是十几维的行向量几百个样本就组成了几百行的矩阵。组装代码的基本套路是这样% 假设 feats_cell 是每段信号的特征行向量组成的元胞数组 X cell2mat(feats_cell(:)); % 每一行是一个样本的特征 X X(:, [1,2,3,4,5,6, 8,10]); % 用matlab数组取出多列的方式做筛选特征维数不是越多越好这一点在轴承诊断里尤其明显。特征太多但样本太少时SVM容易在无关维度上找到一些恰好能分开样本的伪规律换一批数据就失效。我处理特征矩阵前一般先做两件事第一用箱形图检测异常值把明显偏离的样本标记出来人工确认是故障还是传感器误触第二当特征超过20维且样本不足100时先跑一遍lasso回归看哪些特征对标签有稳定贡献再做删减。虽然lasso是为回归设计的但用在特征选择上效果也够用而且MATLAB的lasso函数可以直接吃特征矩阵和标签向量输出稀疏系数非零项对应的就是有效特征。4. 用matlab跑通SVM轴承故障诊断完整流程与核心代码把特征矩阵准备成什么样、训练代码怎么写是决定复现成败的关卡。这一章的完整流程照抄即可但每一处我都标注了为什么这么写。4.1 数据划分与标签设计训练集测试集怎么分才不“作弊”整个数据集要分成的角色有两个训练集用来拟合模型测试集用来模拟“没见过的新数据”。一个非常隐蔽的错误是先用全部数据做标准化再划分训练/测试集或者用全部数据算出来的统计量去标准化训练集和测试集——这样测试集的信息已经掺进了训练过程测试准确率虚高现场部署立刻原形毕露。正确顺序是先划分、后标准化。而且要按类别分层抽样避免某一类样本全落在测试集里。% X: 特征矩阵 (N×M), Y: 标签列向量 (N×1), 类别为1/2/3/4 rng(2024); % 固定随机种子结果可复现 cv cvpartition(Y, HoldOut, 0.25, Stratify, true); trainIdx cv.training; testIdx cv.test; XTrain X(trainIdx, :); YTrain Y(trainIdx, :); XTest X(testIdx, :); YTest Y(testIdx, :);cvpartition的Stratify选项会保证每个类别在训练集和测试集中的占比大致相同这是轴承故障数据划分必须开的参数。HoldOut, 0.25表示留出25%作为测试集如果总体样本不到100条建议改成留一法或五折交叉验证因为25%的测试集可能只有十来个样本算出来的准确率方差会非常大。rng(2024)这行不是可有可无——不固定随机种子每次跑程序划分结果都不同复现数据时你会怀疑自己改错了代码。4.2 归一化不能泄漏训练集和测试集不能各算各的SVM是基于距离和间隔的模型特征不归一化的话量级大的特征会主导距离计算SVM会忽略掉物理意义重要但数值小的特征。正确的做法是只在训练集上计算均值mu和标准差sigma测试集直接调用同一套统计量做变换。% 在训练集上计算标准化参数 mu mean(XTrain); sg std(XTrain); XTrainStd (XTrain - mu) ./ sg; % 测试集用训练集的mu/sg做同样变换不能重新计算 XTestStd (XTest - mu) ./ sg;常见错误写法是写成[XTestStd, mu2, sg2] zscore(XTest)这样测试集用了自己的均值和方差相当于“偷看”了测试集的分布准确率会虚高。要记住诊断模型部署后现场进来的每一个实时样本都是“没见过的新数据”它只能使用训练阶段固化下来的mu和sg。这两个数值建议在训练完成后和模型一起保存部署时加载。4.3 fitcecoc训练SVM多分类模型核心代码与参数含义训练代码不长但参数不要直接抄默认值。核心是fitcecoc加templatesvm模板重点调两个参数BoxConstraint即C和KernelScale即gamma的倒数。% 定义SVM模板 t templatesvm(KernelFunction, rbf, ... BoxConstraint, 1, ... KernelScale, 5, ... Standardize, false); % 训练多分类模型 mdl fitcecoc(XTrainStd, YTrain, ... Learners, t, ... Coding, onevsone, ... FitPosterior, false, ... Verbose, 1);参数说明KernelFunction,rbf选用高斯核不做解释前面章节已经说过理由。BoxConstraint,1初始C值。C1是个合理起点接近sklearn里SVM的默认值。轴承数据噪声大时我通常先把C设在0.5~5之间再微调。KernelScale,5高斯核宽度。这个值应该和标准化后的特征尺度对比看标准化后特征方差为1KernelScale在1~10之间通常比0.1或100合理。Standardize,false这里统一在外部手动标准化了把内部标准化关掉避免两套标准化互相叠加。Coding,onevsone强制使用一对一策略理由见第2.3节。训练完成后立即做一件关键的事保存模型和标准化参数。不然下次打开MATLAB又要重跑一遍现场工程师最怕这种“得重训才能用”的模型。save(bearing_svm_model.mat, mdl, mu, sg, featureNames);部署时加载模型对实时采集的信号先做同样的特征提取、再用mu/sg标准化最后调用predict函数输出标签和分类得分。整个流程四步缺一不可。4.4 网格搜索C和gamma交叉验证找最优参数直接拿默认参数训练往往不是最优结果。轴承诊断的最佳做法是做一轮网格搜索BoxConstraint取一组值、KernelScale取一组值两两组合在训练集内做交叉验证选平均准确率最高的组合。注意网格搜索只允许用训练集内交叉验证不能用测试集去选参数——否则测试集就不干净了。cList [0.1, 0.5, 1, 5, 10]; ksList [0.5, 1, 2, 5, 10]; results zeros(length(cList), length(ksList)); for i 1:length(cList) for j 1:length(ksList) t templatesvm(KernelFunction,rbf, ... BoxConstraint, cList(i), ... KernelScale, ksList(j)); mdl_cv fitcecoc(XTrainStd, YTrain, ... Learners, t, ... Coding, onevsone); cvAcc crossval(mcr, XTrainStd, YTrain, ... Predfun, (xtr,ytr,xte) predict(... fitcecoc(xtr,ytr,Learners, ... templatesvm(KernelFunction,rbf, ... BoxConstraint,cList(i), ... KernelScale,ksList(j)), ... Coding,onevsone), xte)); results(i,j) 1 - cvAcc; end end [bestRow, bestCol] find(results max(results(:))); fprintf(最优 C%.1f, KernelScale%.1f\n, cList(bestRow), ksList(bestCol));这段代码逻辑上是对的但实测时会发现一个问题内层每次交叉验证都重新训练模型当训练样本超过500条、C和gamma的网格点数达到25个以上时跑完要花不少时间。实际调参时我会缩小网格范围先用粗网格定位最优区再在最优区附近加密搜一次。交叉验证用的是crossval(mcr)返回的是误分率所以用1减去就是准确率。如果样本量不足100建议把交叉验证改成留一法Leave-One-Out虽然慢一些但评估结果更稳定。提示网格搜索找到的最优参数是“这个特征组合下的最优”换一组特征还要重新搜。不要试图找一组放之四海皆准的C和gamma。5. SVM轴承故障诊断的5个常见坑现象、原因与解决办法这一章的内容都是真实项目里反复出现的踩坑记录按“现象→原因→解决”的顺序写每一条都是血泪经验。5.1 测试集准确率虚高部署到现场就翻车现象训练时测试集准确率能到98%以上很有信心地部署到现场结果识别新数据准确率只有六成甚至完全乱分。原因标准化泄漏。最常见的是先对整个数据集做zscore再划分训练集和测试集或者测试集单独调用了zscore重新计算均值和方差。测试集的分布信息提前进入了训练环节模型看到的“测试集”和现场真实新数据根本不是一回事。解决把标准化的顺序固化下来先划分、再只在训练集上计算mu和sg测试集和未来新数据一律调用保存的mu/sg做变换。模型交付时把mu、sg连同mdl一起保存现场加载后直接使用不要再碰任何重新计算的按钮。5.2 三类以上故障直接用了fitcsvm报错后才想起来多分类现象代码写的是fitcsvm(XTrain, YTrain)运行时报错说“Class names should be a vector of unique values”或者不报错但准确率极低——因为把四分类标签当成了二分类处理。原因fitcsvm是严格二分类器当标签向量出现三类或四类时MATLAB会报错有些版本不报错但内部只取了前两类训练后面类别全被忽略模型平静地“学错了”。解决多分类一律走fitcecoc。这是MATLAB封装好的多分类框架内部按ECOC策略拆解成多个二分类子问题训练接口和predict接口都兼容。只要记住二分类用fitcsvm多分类用fitcecoc两者都通过templatesvm传SVM参数。5.3 样本不均衡故障类样本太少模型把少数类全部牺牲现象正常类有300组样本内圈轻微故障只有30组训练出来的模型对正常类识别几乎100%对内圈故障识别不到30%。原因SVM的软间隔优化目标是在所有训练样本上最小化总损失当某一类样本数远小于其他类时少数类的分类错误在总损失中占比太低优化器选择牺牲少数类来换取整体损失最小。解决三个办法可以组合用。第一在templatesvm里设置Prior或Cost参数给少数类更高的误分类代价第二对少数类做数据增强——把原始信号按随机起点剪裁成多段特征上做轻微扰动扩出更多样本第三报告指标不能只看准确率要看每类单独的召回率。诊断场景里“漏报”比“误报”危险得多宁可把正常样本误判为需检修也不能放过一个早期故障样本。5.4 峭度特征在高速工况下失效正常轴承也有高冲击现象用峭度做单特征判断故障低速工况下效果不错换到高速齿轮箱转速3000rpm以上后正常样本的峭度值也飘到4以上和故障样本混在一起分不开。原因高速旋转时齿轮啮合冲击、轴承滚珠与滚道间隙引发的随机冲击都会让波形被“改造”。峭度描述的是波形冲击性不区分冲击的来源是故障还是正常的机械运转。把峭度单独当判据本质上是默认“冲击只来自故障”这个前提在高速设备和变载荷工况下不成立。解决花期更稳的做法是把时域特征和包络谱特征组合使用——峭度负责报警“可能有冲击”BPFO/BPFI谱峰负责定位“冲击来自哪个部位”两者都不单独作为判断依据。此外还可以加峰值因子和裕度因子它们和峭度的相关性不是线性的组合后能让SVM多一个区分维度。5.5 matlab中文注释乱码GBK和UTF-8编码冲突现象从GitHub或文档包里下载的matlab脚本打开后中文注释全乱码代码本身能跑但没法阅读或者自己写了中文注释后保存重新打开就成乱码。原因MATLAB的脚本文件编码在不同版本间不一致较早版本默认用系统区域编码中文Windows即GBK较新版本倾向UTF-8当你用UTF-8保存的脚本放到GBK环境的机器上打开MATLAB按本地编码去解析UTF-8字节流自然乱码。解决如果只是自己看把脚本另存为时选择“UTF-8”编码即可——MATLAB 2023a及以上版本在编辑器的“保存”下拉菜单里有编码选项如果是旧版本R2020b以前用记事本打开脚本执行“另存为”编码选择“带BOM的UTF-8”覆盖保存后再重新打开就正常了。养成好习惯也很重要团队协作时约定全部脚本统一UTF-8保存不要混用编码运行脚本前先执行以下代码确认当前环境feature(DefaultCharacterSet, UTF-8);这句写在每个脚本开头能缓解一部分乱码问题但根本解决还是要统一文件编码。6. 进阶验证与交付混淆矩阵、误判样本回放与模型封装模型训练完不意味着可以做诊断结论了先做验证再看误判样本最后才谈封装部署。验证这一步最常见的做法是输出混淆矩阵而不是只盯着总准确率数总准确率会掩盖“某一类完全没识别出来”的问题。用MATLAB画混淆矩阵很简单predTest predict(mdl, XTestStd); cm confusionchart(YTest, predTest); cm.Title SVM诊断混淆矩阵;看混淆矩阵时我习惯沿对角线找行——某一行真实类别的样本被预测到哪几列比全局准确率更能暴露问题。如果发现某两类频繁互相混淆比如内圈故障和滚动体故障分不清那通常不是SVM参数的问题而是这两类在包络谱上的特征频率接近特征没有提供足够区分度。更进一步的验证是误判样本回放写一段脚本把被分错的那几个样本对应的原始振动信号、包络谱和特征值波形画成分段对比图。这样做过就会发现问题往往相当直观——可能是采样时转速波动导致转频漂移特征频率对不上也可能是该样本采集在某次设备启停阶段波形里叠加了瞬态冲击特征退化成噪声。这类问题在纯数值的混淆矩阵里根本看不见但一画图就清楚了。我的教训是在没画过一张误判样本的包络谱图之前不要宣称模型已经做完。最后是模型交付形态。一套完整的研究或产线方案至少要有一个封装好的训练函数和一个调用接口MATLAB里可以用function封装控制台一键调用function [mdl, mu, sg] train_bearing_svm(XTrain, YTrain, cVal, ksVal) [mu, sg] normalize_train(XTrain); XT (XTrain - mu) ./ sg; t templatesvm(KernelFunction,rbf,BoxConstraint,cVal,KernelScale,ksVal); mdl fitcecoc(XT, YTrain, Learners, t, Coding,onevsone); end部署到现场时接口只需要做三件事采集一段固定时长的振动信号调用特征提取函数得到特征行向量加载保存好的mdl、mu、sg执行predict输出标签。整个推断过程在普通工控机上耗时几毫秒完全满足实时监测的要求。我现在做这类项目的习惯是先把测试集锁进抽屉所有调参都在训练集上交叉验证完成最后开箱才用它做一次盲测——这个习惯帮我挡掉了至少三次“假完美模型”的尴尬。希望帮到你。本文还有配套的精品资源点击获取
返回列表