python实战故障诊断之CWRU数据集(四):线性回归模型的应用

1. 概述

  从本章节开始,我们正式开启机器学习在轴承故障诊断算法中的应用系列分析章节,首先我们介绍的是线性回归模型。
  本章节通过分析轴承振动数据得到了系列信号特征,将各特征与轴承故障尺寸进行相关分析,获取了相关性最好的一个特征,最后采用线性回归模型对该特征与故障尺寸之间的关系进行了分析,相关分析结果及过程可有效指导实际故障诊断及故障预测。

2. 线性回归模型相关原理

  线性回归模型是机器学习中最基本的模型,其原理及计算方法建议参照以下文章:

  我们需要重点关注一下,岭回归会得到很多参数接近0的值,而Lasso回归会尽可能使非零参数最少。

3. 代码实现过程

  第一步:在相同转速下,分析不同内圈故障尺寸下原始信号时域和频域特征,以及包络信号频域特征,特征的计算方法详见Pyhon在振动信号处理中的高级应用(一):振动信号特征(时域、频域)提取

from scipy.io import loadmat
import numpy as np
from scipy import signal, fftpack, stats
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from sklearn import pipeline, linear_model
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics import mean_squared_error

plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.size'] = '12'
plt.rcParams['font.sans-serif'] = ['SimHei']

# 从.mat文件中解析数据
def get_data(source):
    data_DE = []
    data_FE = []
    data_BA = []
    data_Speed = []
    
    
    for i, key in enumerate(source.keys()):
        if i == 3:
            data_DE = source[key].flatten()
        elif i == 4:
            data_FE = source[key].flatten()
        elif i == 5:
            if len(source.keys()) == 6:
                data_Speed = source[key].flatten()
            else:
                data_BA = source[key].flatten()
        elif i == 6:
            data_Speed = source[key].flatten()
                
    return data_DE, data_FE, data_BA, data_Speed

def envelope(sig, fs, low_pass):
    # 信号解包络
    sig_envelope = sig ** 2
    # 求取包络信号的FFT变换结果
    sig_fft = fftpack.fft(sig_envelope)
    # 求取包络信号的FFT变换频率
    sig_fre = fftpack.fftfreq(len(sig_fft), d=1/fs)
    # 低通滤波器
    sig_fft[abs(sig_fre)>low_pass] = 0
    # 转换为滤波后时域信号
    sig_filter = fftpack.ifft(sig_fft).real
    # 求取包络曲线的FFT结果
    fre_sig, mag_sig = signal.welch(sig_filter, fs=fs, nfft=len(sig_filter), 
                                    nperseg=len(sig_filter), scaling = 'spectrum')
    mag_sig = mag_sig[fre_sig<=low_pass]
    fre_sig = fre_sig[fre_sig<=low_pass]
    mag_sig = np.sqrt(2*mag_sig)
    return fre_sig, mag_sig

def cal_feature(source_path, source_list, types, speeds, fs, resample=False):
    feature_list = []
    type_list = []
    speed_list = []
    for _type, _speed, _list in zip(types, speeds, source_list):

        # 获取待处理数据
        source = loadmat(source_path + str(_list) + '.mat')
        # 解析数据
        data_DE, data_FE, data_BA, data_Speed = get_data(source)
        # 重采样
        if resample:
            data_DE = data_DE[::4]
        # 定义切片长度
        split_N = fs
        # 获取信号特征
        for i in range(len(data_DE)//split_N):
            # 切分数据
            data = data_DE[i*split_N:(i+1)*split_N]
            # 原始信号特征提取
            # 获取数据时域特征
            feature_time1 = get_time_features(data)
            # 获取数据频域特征
            fre_sig, mag_sig = signal.welch(data, fs=fs, nfft=split_N, 
                                            nperseg=split_N, scaling='spectrum')
            mag_sig = np.sqrt(2*mag_sig)
            feature_fre1 = get_frequence_features(fre_sig, mag_sig)
            # 获取包络谱频域特征
            fre_sig, mag_sig = envelope(data, fs, low_pass=200)
            feature_fre2 = get_frequence_features(fre_sig, mag_sig)
            # 特征组合
            feature = np.concatenate((feature_time1, feature_fre1, feature_fre2), axis=0)
            feature_list.append(list(feature))
            type_list.append(_type)
            speed_list.append(_speed)
    # 构建特征Dataframe
    columns = []
    for i in range(len(feature_time1)):
        columns.append('feature_time1-'+str(i+1))
    for i in range(len(feature_fre1)):
        columns.append('feature_fre1-'+str(i+12))
    for i in range(len(feature_fre2)):
        columns.append('feature_fre2-'+str(i+12))
    df = pd.DataFrame(feature_list, columns=columns)
    df['types'] = type_list
    df['speed'] = speed_list
    return df

# 获取正常数据特征
source_path = './/data/Normal Baseline Data/'
source_list = [97, 98, 99, 100]
types = [0, 0, 0, 0]
speeds = [1797, 1772, 1750, 1730]
fs = 12000

df_normal = cal_feature(source_path, source_list, types, speeds, fs, resample=True)

# 获取电机端内圈故障信号特征
source_path = './/data/12k Drive End Bearing Fault Data/'
source_list = [105, 106, 107, 108, 169, 170, 171, 172, 
               209, 210, 211, 212, 3001, 3002, 3003, 3004]
types = [0.18, 0.18, 0.18, 0.18, 0.36, 0.36, 0.36, 0.36,
         0.53, 0.53, 0.53, 0.53, 0.71, 0.71, 0.71, 0.71]
speeds = [1797, 1772, 1750, 1730, 1797, 1772, 1750, 1730,
          1797, 1772, 1750, 1730, 1797, 1772, 1750, 1730]
fs = 12000
resample = True

df_break = cal_feature(source_path, source_list, types, speeds, fs, resample=False)

# 整合数据结果
df = pd.concat([df_normal, df_break], ignore_index=True)

  第二步:将各特征与故障尺寸之间进行相关分析,并取相关系数最大的一组特征,进行回归分析。

# 获取排名前十的相关系数
cof_corr = df[df['speed']==1772].corr()['types'].sort_values()[-10:-2]
print(cof_corr)

# 提取不同转速下的数据进行线性回归分析
# 构建线性回归分析模型
pipe = pipeline.Pipeline(steps=[('poly', PolynomialFeatures(degree=1)),
                                ('reg', linear_model.LinearRegression(fit_intercept=False))])
for speed in speeds[:4]:
    # 提取该转速下的数据
    data = df[df['speed']==speed][[cof_corr.index[-1], 'types']]
    # 对线性回归模型进行训练
    pipe.fit(data.values[:, 1].reshape(-1, 1), data.values[:, 0].reshape(-1, 1))
    x = np.arange(0, 1, 0.01).reshape(-1, 1)
    y = pipe.predict(x)
    [coef1, coef2] = pipe.named_steps['reg'].coef_[0]
    print('the coefficient is %.4f,%.4f'%(coef1, coef2))
    # 画图展示
    plt.figure(figsize=(10, 3))
    plt.scatter(data['types'], data.iloc[:, 0], c='blue', marker='+')
    plt.plot(x, y, c='r', linewidth=2)
    plt.title(str(speed) + 'rpm-' + cof_corr.index[-1])
    plt.xlabel('Fault  width/mm')
    plt.ylabel(cof_corr.index[-1])
    plt.xlim(0, 1)
    plt.ylim(0, 0.15)
    plt.show()

在这里插入图片描述

图3.1 1730rpm-feature_fre2-21

在这里插入图片描述

图3.2 1750rpm-feature_fre2-21

在这里插入图片描述

图3.3 1772rpm-feature_fre2-21

在这里插入图片描述

图3.4 1797rpm-feature_fre2-21

4. Tips

  从结果中可以发现,在不同转速下,线性回归模型均表现了比较好的拟合特性,而岭回归和Lasso回归如何应用起来则需要大家根据自己的需求进行分析应用了。相信大家通过本章节内容可以得到一定的启发,咱们点到为止,防止各位小文章撞车,哈哈。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征频率计算凯斯西储轴承故障特征

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白银时代_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值