1.文件夹介绍(使用的是CWRU数据集)
0HP-3HP四个文件夹装载不同工况下的内圈故障、外圈故障、滚动体故障和正常轴承数据。
这里以打开0HP文件为例进行展示,creat_data.py是处理原始数据的脚本,负责将原始数据切不重叠割成1024的固定长度的样本,切割完,生成的每类故障下有100个样本,一共400个样本。(样本被保存在data_0HP.npy文件里,对应的标签保存在label.npy文件)
code_SVM.py是SVM诊断的脚本,首先利用时域分析和频域分析的方法,获取11种时域特征,12种频域特征
# 计算时域特征
def calculate_time_domain_features(signal):
features = []
# 均值
features.append(np.mean(signal))
# 标准差
features.append(np.std(signal))
# 方根幅值
features.append(np.sqrt(np.mean(np.square(signal))))
# 均方根值
features.append(np.sqrt(np.mean(np.square(signal))))
# 峰值
features.append(np.max(signal))
# 波形指标
features.append(np.mean(np.abs(signal)) / np.sqrt(np.mean(np.square(signal))))
# 峰值指标
features.append(np.max(np.abs(signal)) / np.mean(np.abs(signal)))
# 脉冲指标
features.append(np.max(np.abs(signal)))
# 裕度指标
features.append(np.max(np.abs(signal)) / np.sqrt(np.mean(np.square(signal))))
# 偏斜度
features.append(skew(signal))
# 峭度
features.append(kurtosis(signal))
return features
12种频域特征
# 计算频域特征
def calculate_frequency_domain_features(signal, sample_rate):
features = []
# 快速傅里叶变换
spectrum = fft(signal)
spectrum = np.abs(spectrum)[:len(spectrum)//2] # 取一半频谱
#频域指标1
features.append(np.mean(spectrum))
# 频域指标2
features.append(np.var(spectrum))
# 频域指标3
features.append(np.sqrt(np.mean(np.square(spectrum))))
# 频域指标4
features.append(np.max(spectrum) / np.sqrt(np.mean(np.square(spectrum))))
# 频域指标5
features.append(kurtosis(spectrum))
# 频域指标6
features.append(skew(spectrum))
# 频域指标7
features.append(np.max(spectrum))
# 频域指标8
features.append(np.min(spectrum))
# 频域指标9
features.append(np.max(spectrum) - np.min(spectrum))
# 频域指标10
features.append(np.max(np.abs(spectrum)) / np.mean(np.abs(spectrum)))
# 频域指标11
features.append(np.max(np.abs(spectrum)) / np.sqrt(np.mean(np.square(spectrum))))
# 频域指标12
peak_index = np.argmax(spectrum)
peak_frequency = peak_index * sample_rate / len(spectrum)
features.append(peak_frequency)
return features
.构建评价指标,从时域和频域一共23个指标中选出对故障特征最敏感的前4个特征,这里用的是方差评价指标,也可以选用其它的评价指标
# 数据
samples = data # 轴承振动信号样本数据列表
sample_rate = 12000 # 采样率
# 构建特征集
feature_set = build_feature_set(samples, sample_rate)
# 选择前4个敏感特征
import numpy as np
from sklearn.model_selection import train_test_split
# 将特征集转换为NumPy数组
feature_set = np.array(feature_set)
# 计算评价指标(这里以方差为例)
scores = np.var(feature_set, axis=0)
# 选出最敏感的4个特征
selected_indices = np.argsort(scores)[-4:]
selected_features = feature_set[:, selected_indices]
2.分类器
获取前4种敏感特征后,输给SVM或KNN等传统分类器,以看效果
基于时域特征和频域特征组合的敏感特征集,再利用SVM或KNN传统分类器进行轴承故障诊断(python编程,代码有详细注释)_哔哩哔哩_bilibili
测试集准确率:
模型 | 0HP | 1HP | 2HP | 3HP |
SVM | 100% | 100% | 96.25% | 100% |
KNN | 100% | 100% | 97.50% | 100% |
从测试集结果可以看出挑选出来的特征可以很好表征故障。
代码及数据放在压缩包里,解压缩可以直接运行
import numpy as np
from scipy.fft import fft
from scipy.stats import kurtosis, skew
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import MinMaxScaler
# -*- coding: utf-8 -*-
import numpy as np
from scipy.fft import fft
from scipy.stats import kurtosis, skew
import numpy as np
from keras.utils import np_utils
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei' # 设置字体为黑体
import numpy as np
from scipy.fft import fft
from scipy.stats import kurtosis, skew
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
#可以关注:https://mbd.pub/o/bread/ZJuZm5Zr