速變載荷下滾動軸承退化指標(biāo)構(gòu)建:RBFNN與KPCA組合方法)
簡介這份資源面向具備機(jī)械工程或數(shù)據(jù)分析背景、熟悉Python與機(jī)器學(xué)習(xí)基礎(chǔ)的研究生及設(shè)備狀態(tài)監(jiān)測研發(fā)人員聚焦變轉(zhuǎn)速變載荷工況下滾動軸承振動信號受干擾、可靠性評估困難的問題。內(nèi)容以徑向基函數(shù)神經(jīng)網(wǎng)絡(luò)建立系統(tǒng)狀態(tài)特征映射結(jié)合核主成分分析對有效參數(shù)降維并將第一主成分作為軸承性能退化指標(biāo)同時(shí)涉及CNN、BiGRU等模型在故障診斷與壽命預(yù)測中的集成應(yīng)用。資源包為1個(gè)PDF文件約992KB內(nèi)含完整可運(yùn)行代碼及逐段解釋覆蓋時(shí)域與頻域特征提取、RBF映射、KPCA降維到可靠性計(jì)算的銜接邏輯。已有52人學(xué)習(xí)適合用于構(gòu)建退化指標(biāo)、早期故障預(yù)警與剩余壽命預(yù)測的技術(shù)參考也可通過更換不同工況數(shù)據(jù)驗(yàn)證模型魯棒性。1. 變轉(zhuǎn)速變載荷下滾動軸承退化指標(biāo)為什么不能直接套 RMS設(shè)備維護(hù)工程師最怕的場景之一一臺關(guān)鍵機(jī)組轉(zhuǎn)速隨工藝需求頻繁調(diào)整負(fù)載也跟著工況波動你在實(shí)驗(yàn)室用恒定工況標(biāo)定好的 RMS 報(bào)警閾值一上線就瘋狂誤報(bào)。振動烈度隨轉(zhuǎn)速平方增長載荷變化又直接改變接觸應(yīng)力分布同一套閾值在變轉(zhuǎn)速變載荷下幾乎必然失效。這就是 RBFNN-KPCA 組合方法要解決的問題——它不追求單一特征的最優(yōu)而是先用 KPCA 把高維特征空間里的非線性主成分提取出來再用 RBFNN 擬合健康狀態(tài)與退化程度之間的映射最終構(gòu)建一個(gè)對工況變化不敏感、單調(diào)性好的退化指標(biāo)。適合做旋轉(zhuǎn)機(jī)械狀態(tài)監(jiān)測、壽命預(yù)測的從業(yè)者尤其是手頭有變工況數(shù)據(jù)但苦于指標(biāo)不收斂的人。2. RBFNN 與 KPCA 為什么適合做退化指標(biāo)從線性到非線性的必然選擇2.1 退化指標(biāo)的本質(zhì)要求與線性方法的局限退化指標(biāo)不是隨便一個(gè)統(tǒng)計(jì)量。它需要滿足三個(gè)硬條件單調(diào)性即隨時(shí)間推移整體趨勢不可逆魯棒性即對噪聲和短時(shí)工況擾動不敏感一致性即同類軸承不同個(gè)體的指標(biāo)曲線形態(tài)相似。傳統(tǒng)時(shí)域指標(biāo)里RMS 單調(diào)性尚可但工況敏感峭度對早期沖擊敏感但后期反而下降裕度指標(biāo)波動大。頻域指標(biāo)如重心頻率在轉(zhuǎn)速變化時(shí)直接漂移根本沒法用。線性降維方法如 PCA 假設(shè)特征間是線性關(guān)系但軸承退化過程中磨損、點(diǎn)蝕、剝落引起的振動響應(yīng)是非線性耦合的。舉個(gè)直觀例子早期微弱故障在時(shí)域上表現(xiàn)為沖擊間隔的微小變化在頻域上表現(xiàn)為邊頻帶的緩慢展寬這兩者之間的關(guān)系不是線性可加的。PCA 強(qiáng)行用線性超平面去擬合會把非線性相關(guān)的信息當(dāng)作噪聲丟掉導(dǎo)致退化指標(biāo)在中期出現(xiàn)平臺期看起來像設(shè)備“卡”在某個(gè)健康狀態(tài)不動了。KPCA 通過核函數(shù)把原始特征映射到高維再生核希爾伯特空間在那個(gè)空間里做線性 PCA等價(jià)于在原始空間做非線性主成分分析。核函數(shù)的選擇決定了映射能力常用高斯核因?yàn)樗馨讶我鈹?shù)據(jù)映射到無窮維只要帶寬參數(shù)選得合理幾乎可以逼近任意連續(xù)函數(shù)。這一步解決的是“特征空間非線性結(jié)構(gòu)提取”的問題。2.2 RBFNN 在退化映射中的角色不是分類器是回歸器很多人看到 RBFNN 第一反應(yīng)是分類但在退化指標(biāo)構(gòu)建里它做的是回歸。輸入是 KPCA 降維后的主成分得分輸出是一個(gè)標(biāo)量健康度通常歸一化到 0 到 1 之間1 表示全新0 表示失效。RBFNN 的結(jié)構(gòu)分三層輸入層接收 KPCA 得分隱含層做徑向基函數(shù)非線性變換輸出層線性加權(quán)求和。隱含層每個(gè)神經(jīng)元的激活函數(shù)是高斯函數(shù)中心向量和寬度參數(shù)決定了它對輸入空間中哪個(gè)區(qū)域敏感。輸出層權(quán)重通過最小二乘或梯度下降求解。為什么不用 BP 神經(jīng)網(wǎng)絡(luò)因?yàn)?RBFNN 在樣本量不大時(shí)收斂更快且局部響應(yīng)特性讓它對訓(xùn)練數(shù)據(jù)中的局部退化模式更敏感。BP 網(wǎng)絡(luò)全局逼近能力強(qiáng)但容易過擬合尤其在變工況數(shù)據(jù)里工況切換點(diǎn)附近的樣本少BP 網(wǎng)絡(luò)容易把工況變化誤學(xué)成退化。RBFNN 的局部性反而成了優(yōu)勢——它不會因?yàn)槟硞€(gè)工況下樣本少就強(qiáng)行外推。2.3 從原始振動到退化指標(biāo)完整信號處理鏈路整個(gè)鏈路分四步。第一步原始振動信號按固定長度切片通常取 1024 或 2048 點(diǎn)重疊率 50%。第二步對每個(gè)切片提取時(shí)域和頻域特征時(shí)域包括 RMS、峭度、峰值因子、裕度因子、波形因子頻域包括重心頻率、頻率方差、均方頻率再加上小波包分解后各頻帶能量比。第三步所有特征組成高維向量做歸一化通常用 z-score 或最大最小歸一化。第四步KPCA 降維取累計(jì)貢獻(xiàn)率超過 85% 的主成分再送入 RBFNN 回歸。這里有個(gè)容易翻車的地方歸一化必須在訓(xùn)練集上計(jì)算均值和標(biāo)準(zhǔn)差然后應(yīng)用到測試集。如果對整個(gè)數(shù)據(jù)集一起歸一化測試集信息泄露到訓(xùn)練過程指標(biāo)曲線會異常平滑實(shí)際部署時(shí)完全不是那么回事。import numpy as np from sklearn.preprocessing import StandardScaler from sklearn.decomposition import KernelPCA from scipy.stats import kurtosis, skew def extract_features(signal, fs): 從單段振動信號提取時(shí)域和頻域特征 features {} # 時(shí)域特征 features[rms] np.sqrt(np.mean(signal**2)) features[kurtosis] kurtosis(signal) features[skewness] skew(signal) features[peak] np.max(np.abs(signal)) features[crest] features[peak] / features[rms] features[clearance] features[peak] / (np.mean(np.sqrt(np.abs(signal)))**2) features[shape] features[rms] / np.mean(np.abs(signal)) # 頻域特征 spectrum np.abs(np.fft.rfft(signal)) freq np.fft.rfftfreq(len(signal), 1/fs) power spectrum**2 features[centroid] np.sum(freq * power) / np.sum(power) features[variance] np.sum((freq - features[centroid])**2 * power) / np.sum(power) features[msf] np.sum(freq**2 * power) / np.sum(power) return features def build_feature_matrix(signals, fs): 構(gòu)建特征矩陣每行一個(gè)樣本 feat_list [extract_features(s, fs) for s in signals] keys feat_list[0].keys() return np.array([[f[k] for k in keys] for f in feat_list]), list(keys)這段代碼里extract_features對每段信號計(jì)算 10 個(gè)特征build_feature_matrix把它們堆成矩陣。注意clearance和shape的計(jì)算方式分母用了絕對值再開方或均值避免負(fù)值導(dǎo)致復(fù)數(shù)。頻域特征里centroid是重心頻率variance是頻率方差msf是均方頻率這三個(gè)對轉(zhuǎn)速變化敏感但在 KPCA 里會被非線性組合最終退化指標(biāo)反而能抵消一部分轉(zhuǎn)速影響。參數(shù)方面fs是采樣頻率必須和實(shí)際采集系統(tǒng)一致否則頻域特征全錯。切片長度建議 1024 點(diǎn)起步如果轉(zhuǎn)速很低比如低于 300 轉(zhuǎn)每分鐘要加長到 2048 甚至 4096保證一個(gè)切片里至少包含 3 到 5 個(gè)完整旋轉(zhuǎn)周期。3. KPCA 降維實(shí)操核函數(shù)選擇、參數(shù)調(diào)優(yōu)與主成分個(gè)數(shù)確定3.1 高斯核帶寬參數(shù)的網(wǎng)格搜索與經(jīng)驗(yàn)公式KPCA 最關(guān)鍵的參數(shù)是高斯核的帶寬 gamma。gamma 太大核矩陣接近單位矩陣每個(gè)樣本都變成獨(dú)立主成分降維失去意義gamma 太小核矩陣所有元素接近 1主成分全部塌縮到第一維。常見做法是在對數(shù)尺度上網(wǎng)格搜索候選值從 0.001 到 10步長按 10 的冪次走。經(jīng)驗(yàn)公式有兩個(gè)。一個(gè)是中位數(shù)啟發(fā)式gamma 取 1 除以特征維度與特征方差中位數(shù)的乘積。另一個(gè)是 Silverman 規(guī)則gamma 等于樣本數(shù)的負(fù) 2/(維度4) 次方。這兩個(gè)公式給的是量級參考實(shí)際還要微調(diào)。from sklearn.decomposition import KernelPCA from sklearn.model_selection import GridSearchCV from sklearn.neural_network import MLPRegressor from sklearn.pipeline import Pipeline def optimize_kpca_gamma(X, y): 網(wǎng)格搜索 KPCA 帶寬以 RBFNN 回歸的驗(yàn)證集 MSE 為準(zhǔn)則 gammas [0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1.0, 5.0] best_gamma None best_score np.inf for g in gammas: kpca KernelPCA(n_components5, kernelrbf, gammag) X_kpca kpca.fit_transform(X) # 用簡單 RBF 網(wǎng)絡(luò)做快速評估 from scipy.interpolate import Rbf try: rbf Rbf(X_kpca[:,0], X_kpca[:,1], y, functiongaussian) pred rbf(X_kpca[:,0], X_kpca[:,1]) mse np.mean((pred - y)**2) if mse best_score: best_score mse best_gamma g except: continue return best_gamma, best_score這段代碼用KernelPCA做降維然后拿前兩個(gè)主成分用Rbf插值快速評估回歸效果。注意這里只是粗篩真正訓(xùn)練 RBFNN 時(shí)要用全部主成分。n_components5是初始設(shè)定后面還要根據(jù)累計(jì)貢獻(xiàn)率調(diào)整。Rbf的functiongaussian和 KPCA 的高斯核不是一回事這里只是借它做快速非線性回歸評估別混淆。網(wǎng)格搜索的代價(jià)是計(jì)算量大如果樣本超過 5000建議先用隨機(jī)子集搜確定量級后再全量微調(diào)。另外gamma 的最優(yōu)值對數(shù)據(jù)尺度敏感所以特征歸一化必須在 KPCA 之前做而且要用訓(xùn)練集的統(tǒng)計(jì)量。3.2 主成分個(gè)數(shù)累計(jì)貢獻(xiàn)率與重構(gòu)誤差的雙重校驗(yàn)KPCA 沒有像 PCA 那樣的“解釋方差比”直接輸出因?yàn)楹丝臻g里的方差不是原始空間的方差。確定主成分個(gè)數(shù)有兩個(gè)實(shí)用方法。方法一計(jì)算核矩陣的特征值按降序排列看累計(jì)和占總和的比例。通常取 85% 到 95%。但核矩陣特征值衰減快慢和 gamma 有關(guān)gamma 大時(shí)衰減快取前幾個(gè)就夠gamma 小時(shí)衰減慢可能要取十幾個(gè)。方法二重構(gòu)誤差。把降維后的主成分反變換回原始特征空間計(jì)算重構(gòu)誤差看誤差隨主成分個(gè)數(shù)增加的下降曲線拐點(diǎn)處就是合適個(gè)數(shù)。def select_n_components(X, gamma, threshold0.9): 基于核矩陣特征值累計(jì)貢獻(xiàn)率選擇主成分個(gè)數(shù) from sklearn.metrics.pairwise import rbf_kernel K rbf_kernel(X, gammagamma) # 中心化核矩陣 N K.shape[0] one_n np.ones((N, N)) / N K_centered K - one_n K - K one_n one_n K one_n eigvals np.linalg.eigvalsh(K_centered) eigvals eigvals[::-1] # 降序 eigvals np.maximum(eigvals, 0) # 數(shù)值誤差可能產(chǎn)生負(fù)值 cumsum np.cumsum(eigvals) / np.sum(eigvals) n np.searchsorted(cumsum, threshold) 1 return n, cumsumrbf_kernel直接算核矩陣然后手動中心化。中心化公式是 K - 1_N K - K 1_N 1_N K 1_N其中 1_N 是全 1 矩陣除以 N。eigvalsh用于對稱矩陣返回升序特征值反轉(zhuǎn)后降序。np.maximum把負(fù)特征值截?cái)嗟?0這是數(shù)值計(jì)算常見的后悔藥。searchsorted找到累計(jì)貢獻(xiàn)率首次超過閾值的位置。實(shí)際項(xiàng)目中我一般會同時(shí)看累計(jì)貢獻(xiàn)率和重構(gòu)誤差取兩者建議的較大值。因?yàn)橥嘶笜?biāo)對信息完整性要求高寧可多保留一個(gè)主成分也不要因?yàn)榻稻S過度丟掉早期微弱故障信息。3.3 變工況下的特征歸一化策略按工況分組還是全局變轉(zhuǎn)速變載荷數(shù)據(jù)有個(gè)棘手問題不同工況下特征分布差異大。如果全局歸一化高轉(zhuǎn)速工況的特征值大會主導(dǎo)歸一化尺度低轉(zhuǎn)速工況的特征被壓縮到很小范圍KPCA 提取的主成分主要反映工況差異而不是退化差異。兩種策略。策略一按工況分組歸一化。先根據(jù)轉(zhuǎn)速和載荷把數(shù)據(jù)分成若干工況組每組單獨(dú)計(jì)算均值和標(biāo)準(zhǔn)差組內(nèi)歸一化。這樣消除工況影響但要求工況標(biāo)簽已知且每個(gè)工況組樣本量足夠。策略二全局歸一化但加入工況特征。把轉(zhuǎn)速和載荷也作為特征輸入 KPCA讓非線性降維自己去解耦。這種方法不需要工況標(biāo)簽但要求 KPCA 的核函數(shù)足夠強(qiáng)能捕捉工況與退化之間的交互。我一般先用策略二因?yàn)楣こ态F(xiàn)場往往拿不到精確的工況標(biāo)簽轉(zhuǎn)速和載荷是從控制系統(tǒng)讀的有延遲和噪聲。如果策略二效果不好再退回策略一用聚類方法自動劃分工況組。def normalize_by_condition(X, speeds, loads, n_groups4): 按轉(zhuǎn)速和載荷聚類分組后歸一化 from sklearn.cluster import KMeans condition_features np.column_stack([speeds, loads]) kmeans KMeans(n_clustersn_groups, random_state42) labels kmeans.fit_predict(condition_features) X_norm np.zeros_like(X) for g in range(n_groups): mask labels g if np.sum(mask) 10: continue scaler StandardScaler() X_norm[mask] scaler.fit_transform(X[mask]) return X_norm, labelsKMeans對轉(zhuǎn)速和載荷聚類n_groups4是經(jīng)驗(yàn)值工況復(fù)雜時(shí)可以增加到 6 或 8。每個(gè)簇內(nèi)單獨(dú)StandardScaler。注意如果某個(gè)簇樣本少于 10跳過歸一化保留原始值否則均值和標(biāo)準(zhǔn)差估計(jì)不可靠。返回的labels可以后續(xù)用來分析退化指標(biāo)在不同工況下的一致性。4. RBFNN 回歸建模從 KPCA 得分到健康度的映射與訓(xùn)練細(xì)節(jié)4.1 RBFNN 結(jié)構(gòu)設(shè)計(jì)與隱含層神經(jīng)元個(gè)數(shù)確定RBFNN 的輸入維度等于 KPCA 保留的主成分個(gè)數(shù)通常 3 到 8 維。輸出維度 1即健康度。隱含層神經(jīng)元個(gè)數(shù)是關(guān)鍵超參數(shù)太少欠擬合太多過擬合。確定方法有三種。第一種經(jīng)驗(yàn)公式神經(jīng)元個(gè)數(shù)等于輸入維度的 2 到 3 倍。第二種遞增法從 5 個(gè)開始每次加 5 個(gè)看驗(yàn)證集誤差誤差不再下降就停止。第三種正交最小二乘從大量候選中心里逐個(gè)選擇對輸出貢獻(xiàn)最大的自動確定個(gè)數(shù)。工程上常用第二種簡單可控。隱含層中心向量的初始化用 KMeans 聚類聚類數(shù)等于神經(jīng)元個(gè)數(shù)聚類中心作為初始中心。寬度參數(shù)有兩種設(shè)法統(tǒng)一寬度取所有中心間平均距離的某個(gè)比例或者每個(gè)神經(jīng)元單獨(dú)設(shè)寬度取它到最近鄰中心距離。統(tǒng)一寬度簡單但數(shù)據(jù)分布不均勻時(shí)局部逼近能力差。我一般用每個(gè)神經(jīng)元單獨(dú)設(shè)寬度計(jì)算量稍大但效果更穩(wěn)。class RBFNN: def __init__(self, n_input, n_hidden, n_output1): self.n_input n_input self.n_hidden n_hidden self.n_output n_output self.centers None self.widths None self.weights None def _rbf_activation(self, X, center, width): 高斯徑向基函數(shù) dist np.sum((X - center)**2, axis1) return np.exp(-dist / (2 * width**2)) def fit(self, X, y): from sklearn.cluster import KMeans # 用 KMeans 初始化中心 kmeans KMeans(n_clustersself.n_hidden, random_state42, n_init10) kmeans.fit(X) self.centers kmeans.cluster_centers_ # 計(jì)算每個(gè)中心的寬度到最近鄰中心距離 from scipy.spatial.distance import cdist dists cdist(self.centers, self.centers) np.fill_diagonal(dists, np.inf) self.widths np.min(dists, axis1) # 構(gòu)建隱含層輸出矩陣 H np.zeros((X.shape[0], self.n_hidden)) for i in range(self.n_hidden): H[:, i] self._rbf_activation(X, self.centers[i], self.widths[i]) # 最小二乘求輸出權(quán)重加正則項(xiàng)防止病態(tài) lam 1e-3 self.weights np.linalg.solve(H.T H lam * np.eye(self.n_hidden), H.T y) return self def predict(self, X): H np.zeros((X.shape[0], self.n_hidden)) for i in range(self.n_hidden): H[:, i] self._rbf_activation(X, self.centers[i], self.widths[i]) return H self.weightsfit方法里KMeans初始化中心cdist算中心間距離np.fill_diagonal把對角線設(shè)為無窮大然后取每行最小值作為寬度。隱含層輸出矩陣 H 的每一列是一個(gè)神經(jīng)元的激活值。輸出權(quán)重用帶正則的最小二乘求解lam1e-3是正則系數(shù)防止 H^T H 奇異。predict方法重復(fù)計(jì)算 H 然后加權(quán)求和。參數(shù)說明n_hidden建議從 10 開始試如果驗(yàn)證集誤差大就加到 20、30。lam在 1e-4 到 1e-2 之間調(diào)數(shù)據(jù)噪聲大時(shí)取大一點(diǎn)。寬度計(jì)算用最近鄰距離如果中心分布很不均勻可以改用全局平均距離乘以 0.5 到 1.0 的系數(shù)。4.2 訓(xùn)練集構(gòu)建健康度標(biāo)簽怎么定才不引入主觀偏差RBFNN 是監(jiān)督學(xué)習(xí)需要健康度標(biāo)簽。但實(shí)際數(shù)據(jù)里健康度真值往往不知道只能根據(jù)維護(hù)記錄近似。常見做法有三種。第一種線性衰減假設(shè)從全新到失效健康度從 1 線性降到 0。簡單但不符合實(shí)際軸承退化通常前期慢、中期快、后期又慢呈 S 形。第二種基于失效閾值的分段線性根據(jù)振動烈度超過某個(gè)閾值的時(shí)刻作為失效點(diǎn)之前按時(shí)間比例線性插值。比第一種好但閾值選擇主觀。第三種無監(jiān)督標(biāo)簽生成用 KPCA 第一主成分的某種變換作為偽標(biāo)簽再訓(xùn)練 RBFNN 去擬合。這種方法避免了人工標(biāo)注但偽標(biāo)簽的質(zhì)量依賴 KPCA 效果。我一般用第二種和第三種結(jié)合先用 KPCA 第一主成分看趨勢確定大致失效點(diǎn)再用分段線性生成標(biāo)簽最后用 RBFNN 擬合。這樣既利用了數(shù)據(jù)本身的結(jié)構(gòu)又保留了工程判斷。def generate_health_labels(rul, failure_threshold0.7): 基于剩余壽命生成健康度標(biāo)簽S 形映射 rul_norm rul / np.max(rul) # S 形函數(shù)前期慢中期快后期慢 health 1 / (1 np.exp(-10 * (rul_norm - 0.5))) # 歸一化到 0-1 health (health - health.min()) / (health.max() - health.min()) return healthrul是剩余壽命可以用時(shí)間或循環(huán)次數(shù)表示。failure_threshold這里沒直接用實(shí)際可以結(jié)合閾值做截?cái)?。S 形函數(shù)用exp實(shí)現(xiàn)系數(shù) 10 控制陡峭程度越大越接近階躍。歸一化保證輸出在 0 到 1 之間。這個(gè)標(biāo)簽生成方式比線性更符合軸承退化規(guī)律但系數(shù)需要根據(jù)具體數(shù)據(jù)調(diào)整。4.3 訓(xùn)練過程監(jiān)控早停、學(xué)習(xí)率與過擬合判斷RBFNN 的輸出權(quán)重用最小二乘直接求解沒有迭代所以不存在學(xué)習(xí)率。但如果用梯度下降訓(xùn)練中心、寬度和權(quán)重就需要學(xué)習(xí)率和早停。早停策略把訓(xùn)練集按 8:2 分訓(xùn)練和驗(yàn)證每輪迭代后算驗(yàn)證集 MSE如果連續(xù) 10 輪不下降就停止取驗(yàn)證集誤差最小時(shí)的參數(shù)。學(xué)習(xí)率初始設(shè) 0.01如果誤差震蕩就減半如果下降太慢就加倍。過擬合判斷訓(xùn)練集 MSE 遠(yuǎn)小于驗(yàn)證集 MSE比如差一個(gè)數(shù)量級就是過擬合。解決方法是減少隱含層神經(jīng)元個(gè)數(shù)、增大正則系數(shù)、增加訓(xùn)練樣本。欠擬合則相反兩個(gè)誤差都大且接近需要增加神經(jīng)元或降低正則。def train_with_early_stopping(model, X_train, y_train, X_val, y_val, epochs500, lr0.01, patience10): 梯度下降訓(xùn)練 RBFNN帶早停 best_val_loss np.inf best_params None wait 0 for epoch in range(epochs): # 前向傳播 H np.zeros((X_train.shape[0], model.n_hidden)) for i in range(model.n_hidden): H[:, i] model._rbf_activation(X_train, model.centers[i], model.widths[i]) pred H model.weights # 反向傳播更新權(quán)重簡化版只更新輸出權(quán)重 error pred - y_train grad H.T error / X_train.shape[0] model.weights - lr * grad # 驗(yàn)證 H_val np.zeros((X_val.shape[0], model.n_hidden)) for i in range(model.n_hidden): H_val[:, i] model._rbf_activation(X_val, model.centers[i], model.widths[i]) val_pred H_val model.weights val_loss np.mean((val_pred - y_val)**2) if val_loss best_val_loss: best_val_loss val_loss best_params model.weights.copy() wait 0 else: wait 1 if wait patience: break model.weights best_params return model, best_val_loss這段代碼只更新輸出權(quán)重中心固定為 KMeans 結(jié)果。lr0.01是初始學(xué)習(xí)率patience10是早停耐心值。每次驗(yàn)證后如果損失下降就保存權(quán)重否則等待計(jì)數(shù)加一超過耐心值就停止。最后恢復(fù)最佳權(quán)重。注意這里沒有更新中心和寬度因?yàn)?KMeans 初始化已經(jīng)給了不錯的中心微調(diào)它們?nèi)菀走^擬合。如果數(shù)據(jù)量很大可以加中心微調(diào)但學(xué)習(xí)率要更小。5. 避坑與排查變工況退化指標(biāo)構(gòu)建中的五個(gè)血淚教訓(xùn)5.1 現(xiàn)象退化指標(biāo)曲線在工況切換點(diǎn)出現(xiàn)尖峰原因特征未做工況解耦解決加入工況特征或分組歸一化工況切換時(shí)轉(zhuǎn)速和載荷突變振動信號的非平穩(wěn)性急劇增加。如果特征提取窗口跨越切換點(diǎn)時(shí)域和頻域特征都會出現(xiàn)異常值。KPCA 雖然能非線性降維但如果訓(xùn)練數(shù)據(jù)里切換點(diǎn)樣本少它學(xué)不到這種模式RBFNN 會把異常值映射成健康度突變。解決方法是要么在特征提取時(shí)避開切換點(diǎn)用切換后穩(wěn)定運(yùn)行的數(shù)據(jù)要么把轉(zhuǎn)速和載荷作為特征輸入 KPCA讓降維過程自己解耦要么按工況分組歸一化。我一般先試第二種不行再退回第三種。5.2 現(xiàn)象早期故障階段退化指標(biāo)平坦原因KPCA 主成分被工況方差主導(dǎo)解決按工況分層做 KPCA 或加權(quán)核矩陣早期故障的特征變化很微弱如果工況方差遠(yuǎn)大于退化方差KPCA 的前幾個(gè)主成分主要反映工況差異退化信息被壓到后面的主成分里。而 RBFNN 通常只用前幾個(gè)主成分導(dǎo)致早期故障被忽略。解決方法是分層做 KPCA先按工況分組每組單獨(dú)做 KPCA提取組內(nèi)主成分再合并。或者給核矩陣加權(quán)降低工況差異大的樣本對的權(quán)重。加權(quán)核矩陣的實(shí)現(xiàn)復(fù)雜一些但效果更平滑。5.3 現(xiàn)象RBFNN 訓(xùn)練誤差很小但測試集退化指標(biāo)震蕩原因隱含層神經(jīng)元過多導(dǎo)致過擬合解決減少神經(jīng)元并增大正則訓(xùn)練誤差小說明 RBFNN 擬合能力強(qiáng)但測試集震蕩說明它把訓(xùn)練數(shù)據(jù)里的噪聲也學(xué)進(jìn)去了。變工況數(shù)據(jù)里工況切換和傳感器噪聲都會產(chǎn)生異常樣本RBFNN 的局部響應(yīng)特性讓它對這些異常特別敏感。解決方法是減少隱含層神經(jīng)元個(gè)數(shù)從 30 降到 15 甚至 10同時(shí)增大正則系數(shù)lam從 1e-3 加到 1e-2。另外訓(xùn)練集里要剔除明顯的異常樣本比如振動幅值超過正常范圍 5 倍以上的切片。5.4 現(xiàn)象不同軸承的退化指標(biāo)曲線形態(tài)差異大原因健康度標(biāo)簽生成方式不一致解決統(tǒng)一標(biāo)簽生成規(guī)則并做曲線對齊同一批軸承即使型號相同個(gè)體差異也會導(dǎo)致退化速率不同。如果健康度標(biāo)簽按各自的時(shí)間比例生成曲線形態(tài)會被人為拉齊但實(shí)際退化模式差異被掩蓋。如果按絕對時(shí)間生成曲線形態(tài)又差異太大沒法比較。解決方法是統(tǒng)一標(biāo)簽生成規(guī)則比如都用 S 形函數(shù)但參數(shù)根據(jù)各自失效時(shí)間調(diào)整。然后做曲線對齊用動態(tài)時(shí)間規(guī)整或簡單的線性縮放把不同軸承的指標(biāo)曲線映射到同一時(shí)間尺度上。這樣既保留了個(gè)體差異又便于橫向比較。5.5 現(xiàn)象在線部署時(shí)指標(biāo)計(jì)算延遲大原因KPCA 和 RBFNN 每次都要重新計(jì)算核矩陣解決預(yù)計(jì)算訓(xùn)練集核矩陣并緩存模型參數(shù)在線部署時(shí)每來一個(gè)新樣本KPCA 需要計(jì)算它和所有訓(xùn)練樣本的核函數(shù)值如果訓(xùn)練集有幾千個(gè)樣本計(jì)算量不小。RBFNN 還要算隱含層激活雖然比 KPCA 快但累積起來也有延遲。解決方法是預(yù)計(jì)算訓(xùn)練集的核矩陣和特征向量在線時(shí)只需要算新樣本和訓(xùn)練樣本的核函數(shù)值然后投影到已訓(xùn)練好的主成分空間。RBFNN 的中心、寬度和權(quán)重都緩存好在線只做前向傳播。這樣單次計(jì)算延遲可以降到毫秒級。6. 進(jìn)階技巧用單調(diào)性約束和集成策略提升退化指標(biāo)可靠性6.1 在 RBFNN 損失函數(shù)里加單調(diào)性懲罰項(xiàng)退化指標(biāo)理論上應(yīng)該單調(diào)但實(shí)際數(shù)據(jù)里總有波動。可以在 RBFNN 的損失函數(shù)里加一項(xiàng)懲罰指標(biāo)隨時(shí)間的非單調(diào)變化。具體做法是對訓(xùn)練集里時(shí)間相鄰的樣本對如果后一個(gè)樣本的健康度大于前一個(gè)就加懲罰。def monotonicity_loss(y_pred, time_stamps, lambda_mono0.1): 單調(diào)性懲罰時(shí)間靠后的健康度不應(yīng)大于時(shí)間靠前的 sorted_idx np.argsort(time_stamps) y_sorted y_pred[sorted_idx] diff y_sorted[1:] - y_sorted[:-1] # 只懲罰正差值健康度上升 penalty np.sum(np.maximum(diff, 0)**2) return lambda_mono * penaltytime_stamps是每個(gè)樣本的時(shí)間標(biāo)簽sorted_idx按時(shí)間排序diff是相鄰健康度差值。np.maximum(diff, 0)只保留正值即健康度上升的部分平方后求和。lambda_mono控制懲罰強(qiáng)度太大會導(dǎo)致指標(biāo)過于平滑丟失早期故障信息一般取 0.05 到 0.2。6.2 多模型集成不同核參數(shù)和不同神經(jīng)元個(gè)數(shù)的投票單個(gè) RBFNN 的退化指標(biāo)可能受初始化和超參數(shù)影響。用集成策略可以提升魯棒性。具體做法訓(xùn)練多個(gè) RBFNN每個(gè)用不同的 KPCA 帶寬和不同的隱含層神經(jīng)元個(gè)數(shù)然后對它們的輸出做加權(quán)平均。權(quán)重可以用驗(yàn)證集誤差的倒數(shù)。def ensemble_predict(models, X, weightsNone): 多模型集成預(yù)測 preds np.array([m.predict(X) for m in models]) if weights is None: weights np.ones(len(models)) / len(models) return np.average(preds, axis0, weightsweights)models是訓(xùn)練好的 RBFNN 列表weights是權(quán)重向量。np.average按權(quán)重平均。權(quán)重可以按驗(yàn)證集 MSE 的倒數(shù)歸一化得到。集成通常能把測試集指標(biāo)的方差降低 20% 到 30%代價(jià)是訓(xùn)練和推理時(shí)間成倍增加。6.3 驗(yàn)證退化指標(biāo)好壞的三個(gè)定量指標(biāo)不能只看曲線好不好看要用定量指標(biāo)。第一個(gè)單調(diào)性指標(biāo)計(jì)算指標(biāo)序列的 Spearman 相關(guān)系數(shù)越接近 1 越好。第二個(gè)魯棒性指標(biāo)計(jì)算指標(biāo)序列的平滑度用一階差分的標(biāo)準(zhǔn)差除以均值越小越好。第三個(gè)一致性指標(biāo)不同軸承的指標(biāo)曲線做動態(tài)時(shí)間規(guī)整后的平均距離越小越好。from scipy.stats import spearmanr def evaluate_degradation_index(health, time_stamps): 評估退化指標(biāo)質(zhì)量 # 單調(diào)性 mono, _ spearmanr(time_stamps, health) # 魯棒性 diff np.diff(health) robustness np.std(diff) / (np.mean(np.abs(diff)) 1e-8) return {monotonicity: mono, robustness: robustness}spearmanr算秩相關(guān)系數(shù)mono越接近 1 單調(diào)性越好。robustness用差分標(biāo)準(zhǔn)差除以差分均值絕對值越小說明指標(biāo)越平滑。這兩個(gè)指標(biāo)結(jié)合起來看單調(diào)性高于 0.9 且魯棒性低于 0.5 就算不錯。我自己的習(xí)慣是每次調(diào)完參數(shù)先把這三個(gè)指標(biāo)算一遍再畫曲線看。有時(shí)候曲線看著漂亮但單調(diào)性只有 0.7說明波動還是大上線后可能誤報(bào)。寧可單調(diào)性 0.95 但曲線不那么光滑也不要 0.7 的漂亮曲線。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取