最终版:
每个工况下4组不同故障类型的数据,每组1048576个
提取特征时按照1310个为一组提取时域、频域、时频域特征,1048576/1310取整为800组
1、首先对第一种故障类型的数据进行分组,为后续提取特征做准备
x.real=0; %定义结构体,感觉这样比较方便
i=0;
for n=1:800
x(n).real=data1(i+1:1310+i,1); %data为数据
i=i+1310;
end
2、提取特征(时域、频域、时频域)
for ii=1:800
timestruct1(ii)= timeDomainFeatures(x(ii).real );%时域特征
end
for ii=1:800
frequencystruct1 (ii)= frequencyDomainFeatures( x(ii).real,40960);%频域特征(信号采样频率是40960Hz)
end
for ii=1:800
waveletstruct1(ii) = waveletFeatures(x(ii).real ); %时频域特征
end
然后把 timestruct1、frequencystruct1 、waveletstruct1拼接在一起
3、特征选择
这里我采用relieff算法
官方实例:https://ww2.mathworks.cn/help/stats/relieff.html
load fisheriris
[idx,weights] = relieff(meas,species,10)
数据格式自己运行 load fisheriris 就可以看到了
其中species为元胞数组,里面分为三类
故构建元胞数组:
for i=1:600
species_2{i}='a';
end
>> for i =601:1200
species_2{i}='b';
end
for i =1201:1800
species_2{i}='c';
end
for i =1801:2400
species_2{i}='d';
end
进行特征选择:
[idx,weights] = relieff(instance,species_2,10)
运行结果:
idx =
1 至 15 列
10 23 1 6 7 19 9 25 24 8 17 26 2 4 18
16 至 26 列
5 20 13 22 21 3 12 16 15 14 11
weights =
1 至 9 列
0.6057 0.3795 0.1760 0.3795 0.3514 0.6041 0.5961 0.4766 0.5447
10 至 18 列
0.6178 0.0416 0.1150 0.3267 0.0588 0.0739 0.0866 0.4539 0.3721
19 至 26 列
0.5856 0.3397 0.2437 0.3110 0.6125 0.5262 0.5311 0.4056
权重从高到低画图:
bar(weights(idx))
xlabel('Predictor rank')
ylabel('Predictor importance weight')
图像:
选用了前12个特征参数(觉得12很好听 所以选了12个)
分别是10:RMS 1: averageAmplitude 6:mean 7:rootAmplitude 19:mean(平均频率)
23:E6 、 9:std 、 25:E8 、 17:clearanceFactor 、 24:E7 、2: min 4:Var
 #### 4、交叉验证 这里我只使用了训练集数据,因为之前好像看过:如果交叉验证时使用全部数据,那么对测试集的预测准确率会偏高(虚高)
准备测试数据集:
x1.real=0; %定义结构体,感觉这样比较方便
i=737280;
for n=1:20
x1(n).real=a1(i+1:12288+i,1); %data为数据
i=i+12288;
end
x2.real=0; %定义结构体,感觉这样比较方便
i=737280;
for n=1:20
x2(n).real=a2(i+1:12288+i,1); %data为数据
i=i+12288;
end
x3.real=0; %定义结构体,感觉这样比较方便
i=737280;
for n=1:20
x3(n).real=a3(i+1:12288+i,1); %data为数据
i=i+12288;
end
x4.real=0; %定义结构体,感觉这样比较方便
i=737280;
for n=1:20
x4(n).real=a4(i+1:12288+i,1); %data为数据
i=i+12288;
end
工况二
idx =
1 至 15 列
10 23 1 6 7 19 9 24 25 2 4 8 17 18 5
16 至 26 列
20 26 22 13 21 3 11 16 15 12 14
weights =
1 至 9 列
0.6009 0.4929 0.1755 0.4929 0.3958 0.5999 0.5951 0.4915 0.5533
10 至 18 列
0.6093 0.1286 0.0909 0.3094 0.0749 0.0991 0.1169 0.4819 0.4096
19 至 26 列
0.5921 0.3853 0.2585 0.3347 0.6057 0.5150 0.4961 0.3840
[label_test,instance_test]=libsvmread('test_12features.scaled');
[predictlabel]=svmpredict(label_test, instance_test,model);
plotResult(label_test,predictlabel)
Accuracy = 96.25% (77/80) (classification)
工况三
idx =
1 至 15 列
24 7 1 23 25 6 10 9 19 20 21 18 26 8 17
16 至 26 列
5 3 2 4 22 13 14 15 16 11 12
weights =
1 至 9 列
0.4565 0.2622 0.2706 0.2618 0.2892 0.4424 0.4611 0.3835 0.4226
10 至 18 列
0.4411 0.0563 0.0509 0.1194 0.0852 0.0807 0.0794 0.3244 0.4011
19 至 26 列
0.4079 0.4073 0.4019 0.1933 0.4519 0.4693 0.4470 0.3995
```
[label_test, instance_test] = libsvmread('test_12features.scaled');
>> [predictlabel]=svmpredict(label_test, instance_test,model);
```
Accuracy = 100% (80/80) (classification)
>> plotResult(predictlabel,label_test)
工况四
idx =
1 至 15 列
23 24 25 7 21 1 6 20 26 10 18 19 9 17 8
16 至 26 列
3 5 4 2 22 13 14 15 16 11 12
weights =
1 至 9 列
0.4199 0.1844 0.1971 0.1844 0.1939 0.4128 0.4223 0.3076 0.3639
10 至 18 列
0.3996 0.0406 0.0241 0.1587 0.0709 0.0660 0.0648 0.3261 0.3947
19 至 26 列
0.3872 0.4107 0.4204 0.1765 0.4685 0.4596 0.4319 0.4075