一种轴承健康状态评估预测算法设计
胡宇刚
常州纺织服装职业技术学院
引言
首先从CSV文件加载轴承运行数据,对关键特征进行多种移动平均处理(简单移动平均、累积移动平均和指数移动平均)以平滑数据并提取趋势信息。然后使用主成分分析PCA从多个特征中提取健康指标,通过指数拟合方法预测剩余使用寿命RUL。系统还包含时间序列分析模块,使用ADF、PP和KPSS检验评估序列平稳性,并应用ARIMA模型进行时间序列预测。最后系统实现了多种深度学习模型(包括简单神经网络、RNN、LSTM和GRU)进行轴承退化预测,并通过可视化手段展示预测结果与实际值的对比。整个系统能够有效监测轴承健康状态,预测剩余寿命,并提供多种分析方法的比较。
1.数据准备
从CSV文件加载轴承运行数据,对数据进行初步处理和清洗,重命名时间列以便后续分析。主要完成进行数据加载与预处理读取CSV文件、重命名时间列、创建数据副本。
2.趋势分析
应用多种移动平均方法(简单移动平均、累积移动平均和指数移动平均)对关键特征进行平滑处理,提取数据趋势信息。
3.健康指标构建
使用主成分分析从多个特征中提取最能代表轴承健康状态的第一主成分作为健康指标,并进行归一化处理,使用PCA从多特征提取健康指标。
# 定义健康指标构建函数
def health_indicator(bearing_data, use_filter=False):
data = bearing_data.copy()
# 可选:应用指数移动平均滤波
if use_filter:
for ft in data.columns:
data[ft]= data[ft].ewm(span=40, adjust=False).mean()
# 应用主成分分析(PCA) (略)
# 创建主成分名称
component_names = [f"PC{i+1}" for i in range(X_pca.shape[1])]
X_pca = pd.DataFrame(X_pca, columns=component_names)
# 打印第一主成分解释的方差比例(略)
# 提取第一主成分作为健康指标(略)
# 创建退化数据框
degredation = pd.DataFrame(health_indicator, columns=['PC1'])
degredation['cycle']= degredation.index
# 将健康指标归一化(减去最小值)
degredation['PC1']= degredation['PC1']- degredation['PC1'].min(axis=0)
return degredation
4.剩余寿命预测
基于健康指标使用指数拟合方法预测轴承的剩余使用寿命,记录预测结果并与实际失效周期进行比较。主要完成指数拟合方法预测结果评估。
# 定义指数拟合函数
def fit_exp(df, base=500, print_parameters=False):
x = np.array(df.cycle)
# 使用最后base个数据点进行拟合
x = x[-base:].copy()
y = np.array(degredation.PC1)
y = y[-base:].copy()
# 定义指数函数形式
def exp_fit(x, a, b):
y = a * np.exp(abs(b) * x)
return y
# 执行曲线拟合,设置初始参数和最大函数评估次数
fit = curve_fit(exp_fit, x, y, p0=[0.01, 0.001], maxfev=10000)
if print_parameters:
print(fit)
return fit
# 定义预测函数
def predict(X_df, p):
x = np.array(X_df.cycle)
a, b = p[0]
# 应用指数拟合公式进行预测
fit_eq = a * np.exp(abs(b) * x)
return fit_eq
5.时间序列分析
对健康指标时间序列进行平稳性检验,包括ADF检验、PP检验和KPSS检验,确定序列的平稳特性。
# 定义ADF检验函数
def test_ADF(serie):
resultat = adfuller(serie)
print("\n Test de Dickey-Fuller Augmenté (ADF)")
print(f"- ADF statistic :{resultat[0]}")
print(f"- P-value :{resultat[1]}")
print(f"- Valeurs critiques :{resultat[4]}")
if resultat[1]> 0.05:
print("❌ La série est non stationnaire : possible marche aléatoire.")
else:
print("✅ La série est stationnaire : pas une marche aléatoire.")
# 定义PP检验函数(略)
# 定义KPSS检验函数(略)
# 对健康指标进行ADF检验(略)
# 对健康指标进行PP检验(略)
# 对健康指标进行KPSS检验(略)
# 对健康指标进行一阶差分(略)
# 绘制差分后的序列(略)
# 对差分后的序列进行ADF检验(略)
# 对差分后的序列进行PP检验(略)
# 对差分后的序列进行KPSS检验(略)
6.自相关分析
计算健康指标序列的自相关函数和偏自相关函数,为ARIMA模型参数选择提供依据。
# 定义自相关和偏自相关函数绘图函数
def acf(serie, lags=30):
plt.figure(figsize=(15, 8))
# 绘制自相关函数图
plot_acf(serie, lags=lags)
plt.title('Autocorrelatin Function (ACF)')
plt.show()
def pacf(serie, lags=30):
plt.figure(figsize=(15, 8))
# 绘制偏自相关函数图
plot_pacf(serie, lags=lags)
plt.title('Partiel Autocorrelatin Function (PACF)')
plt.show()
# 绘制原始健康指标的自相关和偏自相关函数(略)
# 绘制差分后序列的自相关和偏自相关函数(略)
# 划分训练集和测试集(略)
7.ARIMA建模
根据自相关分析结果选择合适的ARIMA模型参数,建立时间序列预测模型,并进行模型拟合和预测。
# 设置ARIMA模型参数
p = 2 # 自回归阶数
d = 0 # 差分阶数
q = 2 # 移动平均阶数
# 创建并拟合ARIMA模型
model = ARIMA(degredation_1_train, order=(p, d, q))
model_fit = model.fit()
# 打印模型摘要(略)
# 提取模型残差(略)
# 绘制残差图(略)
# 绘制残差的自相关函数(略)
# 更新statsmodels库(略)
# 导入Ljung-Box检验(略)
# 执行Ljung-Box检验(略)
# 在测试集上进行预测
prediction_diff = model_fit.predict(start=len(degredation_1_train), end=len(degredation_1) - 1)
# 导入评估指标(略)
# 评估模型性能
mse = mean_squared_error(degredation_1_test, prediction_diff)
print(f'Mean Squared Error sur l\'ensemble de test : {mse:.4f}')
# 可视化预测结果(略)
# 准备原始尺度数据(略)
# 初始化预测数组(略)
# 将差分预测转换回原始尺度(略)
# 第一个预测值
prediction_original[0]= last_original_value + prediction_diff.iloc[0]
# 后续预测值
for i in range(1, len(prediction_diff)):
prediction_original[i]= prediction_original[i - 1]+ prediction_diff.iloc[i]
# 计算评估指标
mse = mean_squared_error(degredation_0_test, prediction_original)
rmse = np.sqrt(mse)
mae = mean_absolute_error(degredation_0_test, prediction_original)
r2 = r2_score(degredation_0_test, prediction_original)
# 打印评估结果(略)
# 可视化原始尺度预测结果(略)
# 可视化完整数据集和预测结果(略)
# 可视化完整时间序列(略)
# 绘制训练数据(略)
# 绘制测试数据(略)
# 绘制预测数据(略)
# 添加训练/测试分界线(略)
8.深度学习建模
将健康指标数据转换为滑动窗口格式,构建并训练多种深度学习模型(简单神经网络、RNN、LSTM和GRU)进行预测。
# 定义滑动窗口函数(略)
# 设置窗口大小(略)
# 创建滑动窗口数据集(略)
# 调整目标变量形状(略)
# 划分训练集和测试集(略)
# 构建简单的神经网络模型
model = Sequential([
layers.Dense(10, activation='relu', input_shape=(X.shape[1],)), # 隐藏层
layers.Dense(5, activation='relu'),
layers.Dense(1) # 输出层
])
# 编译模型(略)
# 训练模型
model.fit(X_train, Y_train, epochs=100, batch_size=8, verbose=1)
# 在测试集上进行预测
Y_pred = model.predict(X_test)
# 可视化神经网络预测结果(略)
# 可视化完整预测结果(略)
9.结果评估
使用多种评估指标(均方误差、平均绝对误差、决定系数)评估各模型的预测性能。
# 导入RNN相关层(略)
# 构建SimpleRNN模型
model_rnn = Sequential([
SimpleRNN(64, input_shape=(None, 1)), # 64个RNN单元
Dense(1) # 输出层
])
# 构建LSTM模型
model_lstm = Sequential([
LSTM(64, input_shape=(None, 1)), # 64个LSTM单元
Dense(1) # 输出层
])
# 构建GRU模型
model_gru = Sequential([
GRU(64, input_shape=(None, 1)), # 64个GRU单元
Dense(1) # 输出层
])
# 编译和训练模型(略)
# 训练LSTM模型
model_lstm.fit(X_train, Y_train, epochs=100, batch_size=32)
# 训练RNN模型
model_rnn.fit(X_train, Y_train, epochs=100, batch_size=32)
# 训练GRU模型
model_gru.fit(X_train, Y_train, epochs=100, batch_size=32)
# 在测试集上进行预测
Prd = []
Prd.append(model_lstm.predict(X_test))
Prd.append(model_rnn.predict(X_test))
Prd.append(model_gru.predict(X_test))
10.可视化展示
通过多种图表展示移动平均效果、健康指标趋势、预测结果对比和模型性能,提供直观的分析结果。
# 可视化三种RNN变体的预测结果(略)
参考文献
[1]李广福,马萍,张宏立等.一种Informer模型的滚动轴承剩余寿命预测方法[J].机械科学与技术,2024,43(12):2016-2023.
[2]高萌,鲁玉军.基于Bi-TCN-LSTM的滚动轴承剩余使用寿命预测方法[J].轻工机械,2024,42(3):66-73,79.
[3]史竞成,吴占涛,程军圣等.改进自注意力机制的滚动轴承寿命预测方法[J].噪声与振动控制,2025,45(2):90-96,104.