传统机器学习的故障诊断方法,就是利用分类器对不同工况进行分类,大致流程包括:
在这里使用Matlab调用LibSVM库,跑一个简单的故障诊断模型,数据集选用凯斯西储大学轴承数据集(CWRU),对轴承内圈、外圈、滚珠等共10种工况进行故障诊断。
滚动轴承
轴承故障诊断的信号采取可以从多个信息源头出发,包括声波、振动、电流、电压和转速等
此处采用振动信号进行分析:
CWRU数据集
CWRU (Case Western Reserve University) 数据集是一个用于轴承故障诊断的公开数据集
DE (drive end) 驱动端 FE (fan end) 风扇端
采样频率
:12KHz/48KHz
电机负载:0/1/2/3马力 电机转速:1730/1750/1797rpm
故障位置:Ball (滚动体) OuterRace(外圈) InnerRace(内圈)
故障直径:0.007/0.014/0.021
英寸
外圈故障位置:3/6/12
点钟位置
下载地址
http://csegroups.case.edu/bearingdatacenter/home
>http://csegroups.case.edu/bearingdatacenter/home
支持向量机(SVM)
支持向量机是一种监督学习算法,主要用于分类和回归分析。它通过在特征空间中构建一个最优超平面来进行分类,使得不同类别的样本之间的间隔最大化。支持向量机在处理高维数据和非线性问题上表现出色。
LibSVM是一个流行的支持向量机(Support Vector Machine,简称SVM)库。它提供了用于分类和回归的高效算法,并具有广泛的应用领域。
下载地址
LIBSVM -- A Library for Support Vector Machines (ntu.edu.tw)
>https://www.csie.ntu.edu.tw/~cjlin/libsvm/index.html
1.数据收集和准备
clc;clear all;close all;
drive_100 = load('D:\NewCWRU\NormalBaseline\1730\Normal.mat');
drive_108 = load('D:\NewCWRU\12DriveEndFault\1730\0.007-InnerRace.mat');
drive_121 = load('D:\NewCWRU\12DriveEndFault\1730\0.007-Ball.mat');
drive_133 = load('D:\NewCWRU\12DriveEndFault\1730\0.007-OuterRace6.mat');
drive_172 = load('D:\NewCWRU\12DriveEndFault\1730\0.014-InnerRace.mat');
drive_188 = load('D:\NewCWRU\12DriveEndFault\1730\0.014-Ball.mat');
drive_200 = load('D:\NewCWRU\12DriveEndFault\1730\0.014-OuterRace6.mat');
drive_212 = load('D:\NewCWRU\12DriveEndFault\1730\0.021-InnerRace.mat');
drive_225 = load('D:\NewCWRU\12DriveEndFault\1730\0.021-Ball.mat');
drive_237 = load('D:\NewCWRU\12DriveEndFault\1730\0.021-OuterRace6.mat');
2.数据分隔和预处理
de_100 = drive_100.X100_DE_time(1:4:480000);
de_108 = drive_108.X108_DE_time(1:120000);
de_121 = drive_121.X121_DE_time(1:120000);
de_133 = drive_133.X133_DE_time(1:120000);
de_172 = drive_172.X172_DE_time(1:120000);
de_188 = drive_188.X188_DE_time(1:120000);
de_200 = drive_200.X200_DE_time(1:120000);
de_212 = drive_212.X212_DE_time(1:120000);
de_225 = drive_225.X225_DE_time(1:120000);
de_237 = drive_237.X237_DE_time(1:120000);
3.特征提取
features = table;
%% 依次循环着对数据提取时域特征
for i = 1:1000
v = x(i,:);
N = length(v);%长度 2621
features.Mean(i) = mean(v);%平均值
features.Std(i) = std(v);%标准差
features.Skewness(i) = skewness(v);%偏度
features.Kurtosis(i) = kurtosis(v);%峭度
features.max(i) = max(v);%最大值
features.min(i) = min(v);%最小值
features.Peak2Peak(i) = peak2peak(v);%峰峰值
features.RMS(i) = rms(v);%均方根
features.CrestFactor(i) = max(v)/rms(v); %振幅因数
features.ShapeFactor(i) = rms(v)/mean(abs(v)); %波形因数
features.ImpulseFactor(i) = max(v)/mean(abs(v)); %冲击因数
features.MarginFactor(i) = max(v)/mean(abs(v))^2;%裕度因数
features.Energy(i) = sum(v.^2);%能量
end
%% 对信号进行傅里叶变化,并求取频域特征
for i = 1:1000
v = x(i,:);
N = length(v); %长度
v_fftz =abs((fft(v))/(N/2));
% v_fftz = v_fftz(1:N/2); %频域值
features.Mean_fftz(i) = mean(v_fftz);%平均值
features.Std_fftz(i) = std(v_fftz);%标准差
features.Skewness_fftz(i) = skewness(v_fftz);%偏度
features.Kurtosis_fftz(i) = kurtosis(v_fftz);%峭度
features.max_fftz(i) = max(v_fftz);%最大值
features.min_fftz(i) = min(v_fftz);%最小值
features.Peak2Peak_fftz(i) = peak2peak(v_fftz);%峰峰值
features.RMS_fftz(i) = rms(v_fftz);%均方根
features.CrestFactor_fftz(i) = max(v_fftz)/rms(v_fftz);%振幅因数
features.ShapeFactor_fftz(i) = rms(v_fftz)/mean(abs(v_fftz));%波形因数
features.ImpulseFactor_fftz(i) = max(v_fftz)/mean(abs(v_fftz));%冲击因数
features.MarginFactor_fftz(i) = max(v_fftz)/mean(abs(v_fftz))^2;%裕度因数
features.Energy_fftz(i) = sum(v_fftz.^2);%能量
end
4.SVM训练预测
%训练集
Train_matrix,PS]=mapminmax(train_matrix');
Train_matrix=Train_matrix';
%测试集
Test_matrix=mapminmax('apply',test_matrix',PS);
Test_matrix=Test_matrix';
%创建/训练SVM
model=libsvmtrain(train_label,train_matrix,'-t 0');
%SVM仿真测试
[predict_label_1,accuracy_1,~]=svmpredict(train_label,train_matrix,model);
[predict_label_2,accuracy_2,~]=svmpredict(test_label,test_matrix,model);
result_1=[train_label predict_label_1]
result_2=[test_label predict_label_2]
5.绘制图像
figure
plot(1:length(train_label),train_label,'r-*',1:length(train_label),predict_label_1,'b:o')
grid on
legend('真实类别','预测类别')
xlabel('训练集样本编号')
ylabel('训练集样本类别')
string_1={'训练集SVM预测结果对比',sprintf('accuracy_1=%.2f%%',accuracy_1(1,1))};
title(string_1);
figure
plot(1:length(test_label),test_label,'r- *')
hold on
plot(1:length(test_label),predict_label_2,'b:o')
grid on
legend('真实类别','预测类别')
xlabel('测试集样本编号')
ylabel('测试集样本类别')
string={'测试集SVM预测结果对比(RBF核函数)';sprintf('accuracy_2=%.2f%%',accuracy_2(1,1))};
title(string)
故障诊断效果如下: