研究方向是數據驅動的產品剩余壽命預測,看了不少論文,搞了幾個月也沒做出成果。打算從最簡單的線性回歸擬合開始。話不多說,直接開始。
1.數據
用的西交軸承庫數據35Hz12kN工況的bearing1-1,網上能找到數據庫。采樣頻率是25.6KHZ,一分鍾內只采集1.28秒也就是一分鍾內采集32768個數據點。其中記錄了軸承從開始工作到完全失效的全周期振動信號。試驗中使用相對法確定軸承的失效閾值,即當軸承水平或豎直方向振動信號的最大幅值超過 10×Ah時認為軸承已經完全失效,其中 Ah為軸承在正常運行階段的最大幅值。有關數據庫的說明可以參考說明書或者’XJTU-SY 滾動軸承加速壽命試驗數據集解讀‘這篇文獻。
bearing1-1軸承水平方向振動信號時域圖如下
2.特征
這個項目只是為了簡單進行預測,特征只是粗糙地提取水平振動信號的RMS,RMS能穩定地反應軸承退化趨勢,在故障診斷中是一種非常常見的特征,將RMS歸一化到0-1區間,如圖
3.python代碼,就只用了簡單的numpy庫,參考了網上的一些資料,自己調試。
from numpy import *
import matplotlib.pyplot as plt
import scipy.io as scio
import numpy as np
#讀取數據
#導入訓練集數據,mat格式
dataFile ='你的地址/normal_rms_1-1.mat'
data = scio.loadmat(dataFile) # 讀入數據
feature=data['D'] # 讀取mat里面的RMS數據
print(feature)
print(len(feature))
print(feature.shape)
labels=[]
#設置訓練集標簽
for i in range(0,len(feature)):
if i<12740:
labels.append(0)
else:
labels.append(0+(i-12740)/(len(feature)-12700))
print(labels)
labelscopy=labels.copy()#復制labels,
labelscopy=np.array(labelscopy)
print(labelscopy.shape)
fig1=plt.figure(1)
plt.plot(labels)
plt.xlabel('sample_number')
plt.ylabel('HI')
plt.show()
fig1.savefig('naive_LR_HI_label')
#標准線性回歸函數
def standRegres(xArr, yArr):
xMat = mat(xArr)
yMat = mat(yArr).T
xTx = xMat.T * xMat
#判斷行列式為零,則無法求逆
if linalg.det(xTx) == 0:
print('the matrix is singular, cannot do inverse')
return
ws = (xTx).I * (xMat.T*yMat)
return ws
#擬合數據
ws = standRegres(xArr=feature, yArr=labels)
xMat = mat(feature)
yMat = mat(labels)
yHat = xMat*ws
# fig = plt.figure()
# ax = fig.add_subplot(111)
# ax.scatter(xMat[:,0].flatten().A[0], yMat.T[:,0].flatten().A[0])
#對數組數據進行排序,並取最小的值。因為不排序的數據有波動
xCopy = xMat.copy()
xCopy.sort(0)
yHat = xCopy*ws
labelscopy.sort(0)
# ax.plot(xMat[:,0], yHat)
fig2=plt.figure(2)
plt.plot(list(range(len(xMat))), xMat, color='b')#畫圖
plt.plot(list(range(len(yHat))), yHat, color='r')
plt.xlabel('samples_number')
plt.ylabel('amplitude')
plt.show()
fig2.savefig('naive_LR_feature_pre-life')
fig3=plt.figure(3)
plt.plot(list(range(len(labelscopy))),labelscopy, color='r')
plt.plot(list(range(len(yHat))), yHat, color='g')
plt.title('predict-----green,real-----red', fontsize=10)
plt.xlabel('sample_number')
plt.ylabel('life')
plt.show()
fig3.savefig('naive_LR_pre-life_real-life')
#用相關系數評估預測效果
yHat = xMat*ws
print(corrcoef(yHat.T, yMat))
其實軸承壽命標簽還有其他設法,一般都是這種梯形式,感興趣的兄弟可以查閱相關論文。
我們認為life為0表示軸承正常工作,並未出現退化。life為1表示軸承完全失效,不能工作。從某一失效閾值開始軸承開始退化,根據擬合的效果發現,綠色的線在18000點左右其life值達到了1.0,而實際軸承在采樣點20000才失效,life值達到1.用預測值和真實值的相關系數矩陣表示預測精度,效果如下圖。可以看到模型在訓練集表現良好,下一步考慮用同等工況的Bearing1-2作為測試集預測軸承壽命。
至此完結撒花,naive的LR擬合軸承壽命的工作就告一段落,希望對大家有所幫助。
紀念自己第一次寫博客吧,以后會堅持記錄自己學習過程中踩過的坑,有好的資源也會分享。奧里給!!!