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