現(xiàn)與調(diào)參避坑指南)
簡介這份資源是一份基于支持向量機(jī)SVM的齒輪箱軸承故障診斷技術(shù)文檔面向機(jī)械故障診斷、設(shè)備狀態(tài)監(jiān)測領(lǐng)域的工程技術(shù)人員及機(jī)器學(xué)習(xí)方向的研究生與高年級(jí)本科生。文檔以實(shí)驗(yàn)室齒輪箱滑動(dòng)軸承實(shí)測數(shù)據(jù)為背景系統(tǒng)梳理了磨粒磨損、刮傷、咬合、疲勞剝蝕、腐蝕五類典型失效形式的振動(dòng)特征并結(jié)合SVM的分類原理給出從數(shù)據(jù)采集、預(yù)處理、特征提取到模型訓(xùn)練與故障診斷的完整流程文中還附帶了可直接運(yùn)行的Matlab程序便于讀者對(duì)照復(fù)現(xiàn)實(shí)驗(yàn)。資源包共1個(gè)docx文檔約196KB篇幅精煉重點(diǎn)突出適合需要快速掌握SVM在軸承故障識(shí)別中應(yīng)用方法的讀者入門與實(shí)踐參考。目前已有1945人學(xué)習(xí)下載內(nèi)容實(shí)用性強(qiáng)。1. 從啟動(dòng)到故障軸承一個(gè)分類器就把事辦了做齒輪箱軸承故障診斷很多一線工程師的第一反應(yīng)是上深度學(xué)習(xí)數(shù)據(jù)多、效果好、發(fā)文章好看。但真到現(xiàn)場你會(huì)發(fā)現(xiàn)軸承故障樣本往往就那么幾十組深度學(xué)習(xí)連訓(xùn)練集都湊不齊。基于SVM的齒輪箱軸承故障診斷恰恰是在這種小樣本、強(qiáng)噪聲、現(xiàn)場工況復(fù)雜的場景里站穩(wěn)腳跟的方案。配上 MATLAB 程序從振動(dòng)信號(hào)里提特征、訓(xùn)練分類器、到輸出診斷結(jié)論整條鏈路都能在本地跑通。這篇筆記把原理、程序骨架、參數(shù)調(diào)法和踩坑點(diǎn)一次講透新手能照著復(fù)現(xiàn)熟手能直接拿去改自己的數(shù)據(jù)。2. 先把齒輪箱軸承振動(dòng)數(shù)據(jù)加工成喂得進(jìn)SVM的特征2.1 為什么SVM能扛住小樣本診斷結(jié)構(gòu)風(fēng)險(xiǎn)最小化SVM 的核心思想是找一個(gè)超平面把不同類別的樣本分開而且這個(gè)超平面離兩邊樣本的距離要最大。這個(gè)“最大間隔”原則帶來的直接好處是它不需要海量樣本才能收斂幾十個(gè)樣本也能學(xué)到穩(wěn)定的決策邊界。相比之下神經(jīng)網(wǎng)絡(luò)在小樣本下很容易把噪聲也學(xué)進(jìn)去訓(xùn)練集準(zhǔn)確率很高測試集一塌糊涂。齒輪箱軸承診斷的場景正好匹配這個(gè)特性。一組振動(dòng)信號(hào)經(jīng)過特征提取后通常只能得到 1030 維特征樣本量大概是每類故障 3080 組。這種“低維小樣本”問題SVM 幾乎是最穩(wěn)的選擇之一。另外SVM 的決策函數(shù)只依賴支持向量模型體積小部署到現(xiàn)場工控機(jī)上也毫無壓力。結(jié)構(gòu)風(fēng)險(xiǎn)最小化是 SVM 區(qū)別于傳統(tǒng)經(jīng)驗(yàn)風(fēng)險(xiǎn)最小化方法的關(guān)鍵。經(jīng)驗(yàn)風(fēng)險(xiǎn)只關(guān)心訓(xùn)練集誤差結(jié)構(gòu)風(fēng)險(xiǎn)同時(shí)考慮了模型復(fù)雜度所以 SVM 更不容易過擬合。這一點(diǎn)在軸承故障診斷里尤其重要因?yàn)楝F(xiàn)場采集的信號(hào)往往混著齒輪嚙合頻率、轉(zhuǎn)頻諧波和環(huán)境噪聲分類器一旦過擬合換個(gè)工況就失效。2.2 特征集怎么搭時(shí)域、頻域、小波包一個(gè)都不能少SVM 不會(huì)自己看波形需要你把原始振動(dòng)信號(hào)加工成特征向量。常見做法是提取三組特征時(shí)域統(tǒng)計(jì)特征、頻域特征和小波包頻帶能量特征。時(shí)域特征里最常用的是均值、均方根值、峭度、峰值因子、波形因子。其中峭度對(duì)軸承早期故障非常敏感正常軸承的振動(dòng)近似正態(tài)分布峭度接近 3出現(xiàn)沖擊故障后峭度會(huì)明顯升高。均方根值反映振動(dòng)能量大小適合判斷整體劣化程度。頻域特征主要以傅里葉變換后的頻譜為輸入提取重心頻率、均方頻率、頻率方差以及各頻段的能量占比。軸承外圈、內(nèi)圈、滾動(dòng)體故障的特征頻率不同頻域能量分布會(huì)有明顯差異這幾維特征能把故障類型區(qū)分開。小波包分解能把信號(hào)按頻帶細(xì)分比如三層小波包得到 8 個(gè)頻帶分別計(jì)算每個(gè)頻帶的能量和能量占比作為特征向量的一部分。軸承故障信號(hào)往往是瞬態(tài)沖擊小波包對(duì)這類非平穩(wěn)信號(hào)的分辨能力比單純傅里葉變換好。2.3 從docx里最快的落地路徑先跑通數(shù)據(jù)腳本這類帶 MATLAB 程序的文檔核心腳本一般分三段讀取數(shù)據(jù)、特征提取、訓(xùn)練診斷。先別急著改參數(shù)把原始腳本原樣跑通確認(rèn)你的 MATLAB 能調(diào)用 SVM 工具箱再逐步替換成自己的數(shù)據(jù)。第一次跑通的目標(biāo)是看到命令行里輸出準(zhǔn)確率數(shù)字哪怕用的還是示例數(shù)據(jù)至少說明環(huán)境沒問題。MATLAB 里讀取振動(dòng)數(shù)據(jù)最常見的是load命令數(shù)據(jù)文件可能是.mat也可能是.csv。示例如下% 加載振動(dòng)信號(hào)數(shù)據(jù)data為信號(hào)列向量fs為采樣率 load bearing_data.mat; fs 12000; % 采樣率單位Hz signal bearing_data; % 原始振動(dòng)信號(hào) % 按固定長度分段每段作為一個(gè)樣本 seg_len 2048; n_seg floor(length(signal) / seg_len); for i 1:n_seg seg signal((i-1)*seg_len1 : i*seg_len); % 提取該段的特征向量存入 features 矩陣 features(i, :) extract_features(seg, fs); end % 標(biāo)簽向量1正常2外圈故障3內(nèi)圈故障4滾動(dòng)體故障 labels [ones(50,1); 2*ones(50,1); 3*ones(50,1); 4*ones(50,1)];這里的extract_features是自定義函數(shù)內(nèi)部實(shí)現(xiàn)時(shí)域、頻域和小波包特征提取。分段長度 2048 是常見配置對(duì)應(yīng)采樣率 12000Hz 下約 0.17 秒的信號(hào)能覆蓋多個(gè)旋轉(zhuǎn)周期。如果你的齒輪箱轉(zhuǎn)速低建議加大到 4096 或 8192保證一個(gè)分段里至少包含一個(gè)完整的軸旋轉(zhuǎn)周期。標(biāo)簽向量的行數(shù)必須和特征矩陣行數(shù)一致否則訓(xùn)練時(shí)會(huì)報(bào)維度不匹配。3. 在MATLAB里把SVM跑通程序骨架與關(guān)鍵配置3.1 用fitcecoc訓(xùn)練一個(gè)多分類SVM軸承故障診斷至少是四分類問題正常、外圈故障、內(nèi)圈故障、滾動(dòng)體故障。MATLAB 的fitcsvm只能做二分類多分類任務(wù)要借助fitcecoc它內(nèi)部把多分類拆成多個(gè)二分類任務(wù)再投票得到最終類別。這是文檔里最常見的主程序結(jié)構(gòu)% 訓(xùn)練集與測試集劃分保證隨機(jī)且可復(fù)現(xiàn) rng(42); cv cvpartition(labels, Holdout, 0.3); train_idx training(cv); test_idx test(cv); % 訓(xùn)練多分類SVM模型 svm_model fitcecoc(features(train_idx, :), labels(train_idx), ... Learners, templateSVM(KernelFunction, rbf, ... KernelScale, auto, BoxConstraint, 1), ... Coding, onevsone); % 測試集預(yù)測 pred_labels predict(svm_model, features(test_idx, :)); % 準(zhǔn)確率評(píng)估 acc sum(pred_labels labels(test_idx)) / sum(test_idx); fprintf(測試集準(zhǔn)確率: %.2f%%\n, acc * 100);Holdout0.3 表示留出 30% 數(shù)據(jù)做測試集剩下的 70% 訓(xùn)練。rng(42)固定隨機(jī)種子保證每次跑出來的劃分一致這對(duì)調(diào)試很重要不然你調(diào)參數(shù)時(shí)根本分不清準(zhǔn)確率變化是參數(shù)引起的還是隨機(jī)劃分引起的。模板里KernelFunction指定為rbf這是處理非線性故障特征的首選核函數(shù)。3.2 核函數(shù)參數(shù)怎么設(shè)從RBF高斯核說起RBF 核是軸承故障診斷里最常用的核函數(shù)。它只有一個(gè)核心參數(shù)KernelScale對(duì)應(yīng)高斯核的帶寬。這個(gè)參數(shù)控制著決策邊界的復(fù)雜度KernelScale太小每個(gè)樣本都自成一體模型過擬合太大決策邊界過于平滑欠擬合。auto模式由工具箱自動(dòng)估計(jì)但自動(dòng)估計(jì)不見得適合你的數(shù)據(jù)分布手動(dòng)調(diào)優(yōu)通常更穩(wěn)。BoxConstraint是另一個(gè)關(guān)鍵參數(shù)等價(jià)于軟間隔里的懲罰系數(shù) C。它控制著對(duì)誤分類樣本的容忍度。C 越大模型越傾向于把所有訓(xùn)練樣本都分對(duì)但泛化能力可能下降C 越小模型允許更多誤分類但邊界更平滑?,F(xiàn)場數(shù)據(jù)有噪聲C 不宜過大常用區(qū)間在 0.110 之間。參數(shù)調(diào)優(yōu)不建議手動(dòng)反復(fù)試。直接讓 MATLAB 跑貝葉斯優(yōu)化或者自己寫一個(gè)網(wǎng)格搜索循環(huán)% 網(wǎng)格搜索RBF核的兩個(gè)核心參數(shù) kernel_scales [0.5, 1, 2, 4, 8]; box_constraints [0.1, 1, 10]; best_acc 0; for ks kernel_scales for bc box_constraints svm_model fitcecoc(features(train_idx, :), labels(train_idx), ... Learners, templateSVM(KernelFunction, rbf, ... KernelScale, ks, BoxConstraint, bc)); pred predict(svm_model, features(test_idx, :)); acc sum(pred labels(test_idx)) / sum(test_idx); if acc best_acc best_acc acc; best_ks ks; best_bc bc; end end end fprintf(最優(yōu)參數(shù): KernelScale%.1f, BoxConstraint%.1f, 準(zhǔn)確率%.2f%%\n, ... best_ks, best_bc, best_acc * 100);這種窮舉式搜索在特征維度不超過 30、樣本量幾百的情況下計(jì)算量完全可接受。要注意的是網(wǎng)格搜索必須只用訓(xùn)練集評(píng)估參數(shù)。如果你用測試集來選參數(shù)那測試集就變成了訓(xùn)練的一部分最后的準(zhǔn)確率會(huì)虛高是一個(gè)很隱蔽的高風(fēng)險(xiǎn)錯(cuò)誤。3.3 程序流程圖和數(shù)據(jù)接口說明整個(gè)診斷程序的數(shù)據(jù)流是原始振動(dòng)信號(hào) → 滑窗分段 → 特征提取 → 歸一化 → 訓(xùn)練集/測試集劃分 → SVM 訓(xùn)練 → 預(yù)測評(píng)估。特征提取是最耗時(shí)的一步尤其是小波包分解建議把提取好的特征矩陣保存成.mat文件下次直接加載避免每次調(diào)試都重新算一遍。% 保存特征和標(biāo)簽避免重復(fù)計(jì)算 save(features.mat, features, labels); % 下次直接從文件加載 load(features.mat);這里一個(gè)常見做法是把原始信號(hào)按故障類型分別存放文件名里帶標(biāo)簽信息比如normal_1.mat、outer_3.mat。讀取時(shí)遍歷所有文件解析文件名得到標(biāo)簽代碼更簡潔也方便后續(xù)新增故障類型。接口約定好之后換數(shù)據(jù)集只需要改文件讀取部分特征提取和訓(xùn)練代碼可以完全不動(dòng)。數(shù)據(jù)接口的標(biāo)準(zhǔn)化是這個(gè)方案能否復(fù)用的分水嶺。我的習(xí)慣是統(tǒng)一成結(jié)構(gòu)體數(shù)組每個(gè)元素包含signal、fs、label、fault_type四個(gè)字段。這樣不僅 MATLAB 程序內(nèi)部清晰后面要導(dǎo)給其他語言處理也方便。4. 診斷效果驗(yàn)證混淆矩陣、準(zhǔn)確率、誤判樣本怎么看4.1 交叉驗(yàn)證和訓(xùn)練集/測試集劃分要分開做軸承故障診斷的樣本量少一次Holdout劃分的結(jié)果可能運(yùn)氣成分很大。更可靠的做法是交叉驗(yàn)證把數(shù)據(jù)分成 K 份每次拿 K-1 份訓(xùn)練、1 份測試輪轉(zhuǎn) K 次最后取平均準(zhǔn)確率。K 一般取 5 或 10樣本量特別少的時(shí)候可以取 3。% 五折交叉驗(yàn)證評(píng)估模型穩(wěn)定性 rng(42); cv cvpartition(labels, KFold, 5); fold_acc zeros(5, 1); for i 1:5 train_idx training(cv, i); test_idx test(cv, i); svm_model fitcecoc(features(train_idx, :), labels(train_idx), ... Learners, templateSVM(KernelFunction, rbf, ... KernelScale, best_ks, BoxConstraint, best_bc)); pred predict(svm_model, features(test_idx, :)); fold_acc(i) sum(pred labels(test_idx)) / sum(test_idx); end fprintf(五折交叉驗(yàn)證平均準(zhǔn)確率: %.2f%%\n, mean(fold_acc) * 100); fprintf(標(biāo)準(zhǔn)差: %.2f%%\n, std(fold_acc) * 100);交叉驗(yàn)證的準(zhǔn)確率均值代表模型在這個(gè)數(shù)據(jù)集上的期望表現(xiàn)標(biāo)準(zhǔn)差則反映穩(wěn)定性。如果五折的準(zhǔn)確率分別是 100%、85%、90%、92%、88%說明還有樣本被系統(tǒng)性地誤判不能只看平均值。交叉驗(yàn)證里的每一折特征歸一化參數(shù)都必須在訓(xùn)練折內(nèi)計(jì)算再應(yīng)用到測試折上這個(gè)細(xì)節(jié)下章細(xì)說。4.2 混淆矩陣和baseline對(duì)比準(zhǔn)確率只是一個(gè)數(shù)字你還需要知道誤判發(fā)生在哪兩類之間。軸承故障診斷中內(nèi)圈故障和外圈故障的特征頻率接近是最常見的混淆對(duì)。用混淆矩陣能一眼看出模型把哪類樣本錯(cuò)分成了哪類% 繪制混淆矩陣 figure; cm confusionchart(labels(test_idx), pred); cm.Title SVM軸承故障診斷混淆矩陣; cm.RowSummary row-normalized; cm.ColumnSummary column-normalized;混淆矩陣的行是真實(shí)標(biāo)簽列是預(yù)測標(biāo)簽。對(duì)角線上的數(shù)字越大越好??捶菍?duì)角線元素如果某一行的錯(cuò)誤集中在一列說明這兩類特征區(qū)分度不夠需要補(bǔ)充特征維度或者調(diào)整核函數(shù)參數(shù)。另一個(gè)經(jīng)驗(yàn)是如果正常樣本被誤判為故障優(yōu)先級(jí)高于故障之間互判——漏報(bào)故障會(huì)帶來設(shè)備損壞誤報(bào)正常頂多多停機(jī)檢查一次。baseline 對(duì)比也很重要。最弱的 baseline 是多數(shù)類投票永遠(yuǎn)預(yù)測樣本量最多的那一類準(zhǔn)確率等于最大類占比。你的 SVM 準(zhǔn)確率必須明顯高于這個(gè)值才有實(shí)際意義。更強(qiáng)的 baseline 是 KNN 或決策樹用同一份特征跑一遍如果 SVM 沒有明顯優(yōu)勢可能是特征本身區(qū)分度不夠而不是分類器的問題。4.3 轉(zhuǎn)頻受限和變轉(zhuǎn)速工況的驗(yàn)證邊界實(shí)驗(yàn)室數(shù)據(jù)里齒輪箱轉(zhuǎn)速恒定特征頻率穩(wěn)定SVM 準(zhǔn)確率很容易做到 95% 以上。但現(xiàn)場設(shè)備轉(zhuǎn)速會(huì)波動(dòng)尤其是啟停階段和負(fù)載變化時(shí)特征頻率跟著漂移訓(xùn)練時(shí)沒見過這種分布模型很可能失效。驗(yàn)證時(shí)要專門留出一組不同轉(zhuǎn)速或不同負(fù)載下的數(shù)據(jù)做測試而不是混在訓(xùn)練集里隨機(jī)劃分。這叫做跨工況驗(yàn)證它的準(zhǔn)確率才是模型在現(xiàn)場的預(yù)期表現(xiàn)。如果跨工況準(zhǔn)確率掉得厲害有幾個(gè)補(bǔ)救方向一是特征里不要直接用絕對(duì)頻率值改用特征頻率與轉(zhuǎn)頻的比值消除轉(zhuǎn)速影響二是訓(xùn)練時(shí)把多個(gè)轉(zhuǎn)速下的數(shù)據(jù)都放進(jìn)去擴(kuò)大特征分布覆蓋范圍三是加一個(gè)轉(zhuǎn)速估計(jì)環(huán)節(jié)先粗估轉(zhuǎn)頻再做頻率歸一化。% 轉(zhuǎn)頻歸一化特征頻率除以當(dāng)前轉(zhuǎn)頻 freq_ratio bearing_freq / rotation_freq;這一步小小的預(yù)處理往往能把跨工況準(zhǔn)確率拉回十幾個(gè)百分點(diǎn)。文檔里的程序大概率沒做這個(gè)處理你在復(fù)現(xiàn)后自己加上即可。診斷系統(tǒng)的價(jià)值不在實(shí)驗(yàn)室而在現(xiàn)場復(fù)雜工況下仍給出穩(wěn)定判斷。5. 避坑指南數(shù)據(jù)泄漏、核參數(shù)、特征冗余5個(gè)高頻翻車點(diǎn)5.1 歸一化寫錯(cuò)順序準(zhǔn)確率虛高現(xiàn)象訓(xùn)練集準(zhǔn)確率 100%測試集準(zhǔn)確率也很高但一換新數(shù)據(jù)就崩。原因歸一化用了全部數(shù)據(jù)的均值和標(biāo)準(zhǔn)差包括測試集。zscore函數(shù)如果直接作用于整個(gè)特征矩陣測試集的分布信息在訓(xùn)練前就已經(jīng)泄漏給模型等于是閉卷考試變成了開卷考試。解決先劃分訓(xùn)練集和測試集再單獨(dú)計(jì)算訓(xùn)練集的均值和標(biāo)準(zhǔn)差用同一組參數(shù)去歸一化測試集。% 錯(cuò)誤的做法對(duì)整個(gè)矩陣歸一化再劃分 % features_norm zscore(features); % [train_features, test_features] split(features_norm); % 正確的做法先劃分再歸一化 [train_features, test_features] deal(features(train_idx, :), features(test_idx, :)); mu mean(train_features); sigma std(train_features); train_features_norm (train_features - mu) ./ sigma; test_features_norm (test_features - mu) ./ sigma;判斷有沒有踩坑可以在訓(xùn)練完后檢查測試集里有沒有出現(xiàn)訓(xùn)練時(shí)不該見到的分布特征。凡是準(zhǔn)確率高得不正常先檢查歸一化順序。這是文檔復(fù)現(xiàn)里最常見的坑沒有之一。我在給某公司做數(shù)據(jù)復(fù)盤時(shí)就排查過這類情況初步看來分類效果達(dá)標(biāo)但發(fā)現(xiàn)代碼中的歸一化操作放在了數(shù)據(jù)分割之前導(dǎo)致處理流程無效。修正順序后實(shí)際準(zhǔn)確率從虛高的 100% 降到了真實(shí)的 89%。5.2 RBF核參數(shù)不當(dāng)模型陷入死循環(huán)現(xiàn)象KernelScale設(shè)得很小比如 0.001訓(xùn)練時(shí)準(zhǔn)確率 100%預(yù)測時(shí)幾乎全是第一類把KernelScale設(shè)得很大比如 1000模型把所有樣本當(dāng)同一類訓(xùn)練集準(zhǔn)確率只有 25%。原因RBF 核的決策能力取決于數(shù)據(jù)點(diǎn)之間的核距離。帶寬遠(yuǎn)小于樣本間距時(shí)每個(gè)訓(xùn)練樣本都成了孤立的中心測試樣本離哪個(gè)中心最近就歸哪類模型完全失去泛化能力。帶寬遠(yuǎn)大于樣本間距時(shí)所有核函數(shù)值都趨于相同SVM 退化成線性分類器非線性數(shù)據(jù)分不開。解決用網(wǎng)格搜索或貝葉斯優(yōu)化搜參范圍放在 0.110 之間。樣本量大的時(shí)候可以放寬到 0.01100。另一個(gè)實(shí)用技巧是觀察交叉驗(yàn)證曲線KernelScale從小到大準(zhǔn)確率應(yīng)該先升后降如果沒有明顯峰值說明特征本身不適合 RBF考慮換線性核或多項(xiàng)式核。5.3 樣本不均衡導(dǎo)致偏向重負(fù)樣本現(xiàn)象正常樣本 200 組滾動(dòng)體故障樣本只有 20 組訓(xùn)練后正常類準(zhǔn)確率 98%滾動(dòng)體故障準(zhǔn)確率只有 40%。原因SVM 的軟間隔優(yōu)化目標(biāo)是最小化總體誤差少數(shù)類樣本總誤差貢獻(xiàn)小分類邊界會(huì)偏向多數(shù)類一側(cè)把少數(shù)類樣本擠到錯(cuò)誤區(qū)域。解決給少數(shù)類設(shè)置更大的誤分類懲罰權(quán)重強(qiáng)制分類器優(yōu)先分對(duì)少數(shù)類。% 為每個(gè)類別設(shè)置不同權(quán)重 class_weights ones(4, 1); class_weights(4) 5; % 滾動(dòng)體故障樣本少權(quán)重放大 svm_model fitcecoc(features(train_idx, :), labels(train_idx), ... Learners, templateSVM(KernelFunction, rbf, ... KernelScale, best_ks, BoxConstraint, best_bc, ... ClassNames, [1 2 3 4], ... Prior, empirical), ... FitPosterior, false);更直接的做法是改Prior讓前面提到的各類樣本占比趨向均衡。這里要小心FitPosterior配上 SVM 的概率輸出在很多舊版 MATLAB 里不可用不要依賴它做閾值判斷直接用決策值更好。5.4 特征冗余與維數(shù)災(zāi)難的權(quán)衡現(xiàn)象特征從 15 維逐步加到 40 維交叉驗(yàn)證準(zhǔn)確率不升反降訓(xùn)練時(shí)間還翻了倍。原因特征之間高度相關(guān)比如均值、峰值因子、波形因子本身同源冗余信息讓 SVM 在求解二次規(guī)劃時(shí)數(shù)值不穩(wěn)定核矩陣的條件數(shù)變差。特征維度越高需要的樣本量指數(shù)增長樣本只有 200 組時(shí)30 維以上就開始吃力。解決先看特征相關(guān)性矩陣把相關(guān)系數(shù)超過 0.95 的特征只保留一個(gè)。再做 PCA 降維到 1015 維保留 95% 以上方差。這兩個(gè)步驟必須在交叉驗(yàn)證的每一折內(nèi)單獨(dú)進(jìn)行否則同樣犯數(shù)據(jù)泄漏的問題。% PCA降維保留95%方差 [coeff, score, latent] pca(train_features_norm); cum_energy cumsum(latent) / sum(latent); n_components find(cum_energy 0.95, 1); train_features_pca score(:, 1:n_components); test_features_pca (test_features_norm - mean(train_features_norm)) * coeff(:, 1:n_components);實(shí)測里PCA 之后準(zhǔn)確率可能微降但穩(wěn)定性明顯提升。如果你追求的是現(xiàn)場可靠而不是論文好看PCA 是值得做的一步。文檔里的程序如果不含降維你可以自己加進(jìn)去不影響主流程。5.5 標(biāo)簽錯(cuò)位訓(xùn)練精度100%但現(xiàn)場完全沒用現(xiàn)象訓(xùn)練集準(zhǔn)確率極高交叉驗(yàn)證也漂亮但你用新的實(shí)測信號(hào)去預(yù)測結(jié)果完全隨機(jī)。原因特征矩陣的行順序和標(biāo)簽向量的行順序?qū)Σ簧?。比如讀取數(shù)據(jù)時(shí)按文件名排序但標(biāo)簽是按手動(dòng)錄入順序?qū)懙那皫捉M還碰巧對(duì)齊后半截全錯(cuò)位。SVM 學(xué)到了一個(gè)錯(cuò)誤映射訓(xùn)練時(shí)靠記憶硬背下來新數(shù)據(jù)一來立刻現(xiàn)形。解決每次劃分?jǐn)?shù)據(jù)后用cvpartition的下標(biāo)同時(shí)索引特征和標(biāo)簽保證一一對(duì)應(yīng)。更穩(wěn)妥的做法是檢查標(biāo)簽分布的合理性比如每組故障類型在訓(xùn)練集和測試集里的占比應(yīng)該大致相同。另外一個(gè)血淚習(xí)慣是在訓(xùn)練前隨機(jī)抽 10 個(gè)樣本打印幾維特征值和對(duì)應(yīng)標(biāo)簽人工確認(rèn)確信值是正常還是故障再開始訓(xùn)練。6. 部署前必須做的魯棒性實(shí)驗(yàn)和兩個(gè)實(shí)用技巧模型在測試集上達(dá)到 95% 準(zhǔn)確率距離現(xiàn)場部署還差幾步。第一加噪實(shí)驗(yàn)對(duì)測試信號(hào)疊加不同信噪比的噪聲看準(zhǔn)確率怎么衰減。如果信噪比降到 20dB 時(shí)準(zhǔn)確率跌破 85%說明特征提取對(duì)噪聲太敏感要先做帶通濾波把頻帶限制在軸承故障特征頻率的主要分布區(qū)間。第二樣本平移實(shí)驗(yàn)把訓(xùn)練信號(hào)的窗口偏移幾個(gè)周期重新提取特征看預(yù)測結(jié)果是否穩(wěn)定。如果窗口偏移一點(diǎn)結(jié)果就變說明特征提取過度依賴信號(hào)相位需要改用包絡(luò)譜特征。第三極限工況測試把測試集換成最高轉(zhuǎn)速、最大負(fù)載下的數(shù)據(jù)如果 SVM 還在正常工作區(qū)間內(nèi)模型才算真正具備部署條件。最后一個(gè)實(shí)用技巧是模型瘦身。fitcecoc訓(xùn)練出來的模型對(duì)象往往幾十兆但真正決定決策的只有支持向量。通過discardSupportVectors函數(shù)可以把模型壓縮到原來的十分之一以下對(duì)部署到嵌入式設(shè)備或老舊工控機(jī)很有幫助。% 壓縮SVM模型減少存貯空間 compact_model compact(svm_model); compact_model discardSupportVectors(compact_model); save(bearing_svm_model.mat, compact_model);壓縮后的模型精度基本不受影響因?yàn)楸粊G棄的非支持向量對(duì)決策沒有貢獻(xiàn)。保存模型后現(xiàn)場部署只需要加載模型文件和新采集的信號(hào)做相同的特征提取調(diào)用predict就能輸出診斷結(jié)果。整個(gè)流程從訓(xùn)練到部署關(guān)掉 MATLAB 也可以獨(dú)立運(yùn)行只依賴.mat文件和預(yù)測腳本。我的個(gè)人經(jīng)驗(yàn)是每次調(diào)完參數(shù)把特征提取腳本和 SVM 訓(xùn)練腳本的版本號(hào)記錄下來模型文件命名帶日期和準(zhǔn)確率比如model_20250115_93.5.mat。經(jīng)歷過一次“今天測的最好模型第二天怎么找不到了”的教訓(xùn)后這個(gè)習(xí)慣再也沒丟過。診斷系統(tǒng)維護(hù)和模型迭代是長期活版本管理做不好前面所有工作都會(huì)變成一鍋粥。特征選擇、參數(shù)調(diào)優(yōu)、模型保存這三個(gè)環(huán)節(jié)跑順之后你手里就有一套完整的基于 SVM 的齒輪箱軸承故障診斷方案了。它的投入產(chǎn)出比在這個(gè)領(lǐng)域是肉眼可見的高希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取