1. 程式人生 > 實用技巧 >用簡單的線性迴歸模型擬合軸承壽命

用簡單的線性迴歸模型擬合軸承壽命

研究方向是資料驅動的產品剩餘壽命預測,看了不少論文,搞了幾個月也沒做出成果。打算從最簡單的線性迴歸擬合開始。話不多說,直接開始。

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擬合軸承壽命的工作就告一段落,希望對大家有所幫助。

紀念自己第一次寫部落格吧,以後會堅持記錄自己學習過程中踩過的坑,有好的資源也會分享。奧裡給!!!