机器学习--LibSVM

传统机器学习的故障诊断方法,就是利用分类器对不同工况进行分类,大致流程包括:

在这里使用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

支持向量机(SVM)

支持向量机是一种监督学习算法,主要用于分类和回归分析。它通过在特征空间中构建一个最优超平面来进行分类,使得不同类别的样本之间的间隔最大化。支持向量机在处理高维数据和非线性问题上表现出色。

LibSVM是一个流行的支持向量机(Support Vector Machine,简称SVM)库。它提供了用于分类和回归的高效算法,并具有广泛的应用领域。

下载地址

LIBSVM -- A Library for Support Vector Machines (ntu.edu.tw)

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)

故障诊断效果如下:

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值