1. 原理概述????
????????眾所周知,常用的特征維度降維方法有主成分分析,因子分析法,平均值影響法。而平均影響值算法(MIV)是神經(jīng)網(wǎng)絡(luò)對輸入變量進(jìn)行降維的最好方法之一。
????????在神經(jīng)網(wǎng)絡(luò)模型實(shí)際應(yīng)用中,由于沒有明確的理論來確定輸入變量,即網(wǎng)絡(luò)輸入神經(jīng)元難以確定。假如在神經(jīng)網(wǎng)絡(luò)的輸入變量中摻雜一些不重要的自變量,不僅會增加模型的訓(xùn)練時間,也會降低模型準(zhǔn)確性。因此篩選出影響程度大的網(wǎng)絡(luò)輸入變量對神經(jīng)網(wǎng)絡(luò)的改進(jìn)具有重要意義。
????????平均影響值(MIV)是評估輸入自變量對輸出變量影響程度的一個指標(biāo),MIV的正負(fù)表示該自變量對輸出變量的影響方向,其絕對值大小表示影響程度。MIV通過對自變量特征指標(biāo)值進(jìn)行加減10%,構(gòu)建兩個新的訓(xùn)練樣本,計算其對輸出的影響變化值(IV),然后將影響變化值(IV)平均得到該自變量的MIV值,最后將每個自變量都重復(fù)上述步驟得到每個自變量的MIV值,并按絕對值大小對各自變量的影響程度進(jìn)行排序。
2. 實(shí)驗部分
????????以西儲大學(xué)軸承數(shù)據(jù)為例,計算軸承數(shù)據(jù)的均值,方差,峰值,峭度,有效值,峰值因子,脈沖因子,波形因子,裕度因子共九個指標(biāo)作為神經(jīng)網(wǎng)絡(luò)的輸入神經(jīng)元。通過MIV值計算,篩選出特征重要度重要的幾個指標(biāo),達(dá)到特征降維,提升診斷精度的目的。
????????代碼實(shí)現(xiàn)的功能有很多,包含原生數(shù)據(jù)的滑動窗口處理,特征值計算,神經(jīng)網(wǎng)絡(luò)數(shù)據(jù)準(zhǔn)備,MIV值計算,以及特征篩選后的診斷結(jié)果。大家按需所取,如果感覺代碼臃腫的后臺可以留言,我可以將代碼分開再發(fā)幾篇文章供大家參考。
????先上代碼結(jié)果:
????MIV值計算結(jié)果:
?????????篩選后的前四個重要的特征作為神經(jīng)網(wǎng)絡(luò)的神經(jīng)元輸入,帶入神經(jīng)網(wǎng)絡(luò)后的結(jié)果如下:
接下來上正餐:
????首先是滑動窗口數(shù)據(jù)處理代碼,一共是10個狀態(tài),每個狀態(tài)有120組樣本,每個樣本的數(shù)據(jù)量大小為:1×2048,共選取了電機(jī)轉(zhuǎn)速為1797下的10種故障數(shù)據(jù)來來進(jìn)行實(shí)驗。將數(shù)據(jù)集合在一個data變量中。
clear
clc
addpath(genpath(pwd));
%DE是驅(qū)動端數(shù)據(jù) FE是風(fēng)扇端數(shù)據(jù) BA是加速度數(shù)據(jù) 選擇其中一個就行
load 97.mat %正常
load 105.mat %直徑0.007英寸,轉(zhuǎn)速為1797時的 內(nèi)圈故障
load 118.mat %直徑0.007,轉(zhuǎn)速為1797時的 滾動體故障
load 130.mat %直徑0.007,轉(zhuǎn)速為1797時的 外圈故障
load 169.mat %直徑0.014英寸,轉(zhuǎn)速為1797時的 內(nèi)圈故障
load 185.mat %直徑0.014英寸,轉(zhuǎn)速為1797時的 滾動體故障
load 197.mat %直徑0.014英寸,轉(zhuǎn)速為1797時的 外圈故障
load 209.mat %直徑0.021英寸,轉(zhuǎn)速為1797時的 內(nèi)圈故障
load 222.mat %直徑0.021英寸,轉(zhuǎn)速為1797時的 滾動體故障
load 234.mat %直徑0.021英寸,轉(zhuǎn)速為1797時的 外圈故障
% 一共是10個狀態(tài),每個狀態(tài)有120組樣本,每個樣本的數(shù)據(jù)量大小為:1×2048
w=1000; % w是滑動窗口的大小1000
s=2048; % 每個故障表示有2048個故障點(diǎn)
m = 120; %每種故障有120個樣本
D0=[];
for i =1:m
D0 = [D0,X097_DE_time(1+w*(i-1):w*(i-1)+s)];
end
D0 = D0';
D1=[];
for i =1:m
D1 = [D1,X105_DE_time(1+w*(i-1):w*(i-1)+s)];
end
D1 = D1';
D2=[];
for i =1:m
D2 = [D2,X118_DE_time(1+w*(i-1):w*(i-1)+s)];
end
D2 = D2';
D3=[];
for i =1:m
D3 = [D3,X130_DE_time(1+w*(i-1):w*(i-1)+s)];
end
D3 = D3';
D4=[];
for i =1:m
D4 = [D4,X169_DE_time(1+w*(i-1):w*(i-1)+s)];
end
D4 = D4';
D5=[];
for i =1:m
D5 = [D5,X185_DE_time(1+w*(i-1):w*(i-1)+s)];
end
D5 = D5';
D6=[];
for i =1:m
D6 = [D6,X197_DE_time(1+w*(i-1):w*(i-1)+s)];
end
D6 = D6';
D7=[];
for i =1:m
D7 = [D7,X209_DE_time(1+w*(i-1):w*(i-1)+s)];
end
D7 = D7';
D8=[];
for i =1:m
D8 = [D8,X222_DE_time(1+w*(i-1):w*(i-1)+s)];
end
D8 = D8';
D9=[];
for i =1:m
D9 = [D9,X234_DE_time(1+w*(i-1):w*(i-1)+s)];
end
D9 = D9';
data = [D0;D1;D2;D3;D4;D5;D6;D7;D8;D9];
然后將data變量的每一條數(shù)據(jù)求均值,方差,峰值,峭度,有效值,峰值因子,脈沖因子,波形因子,裕度因子共九個指標(biāo),并存放在new_data變量中。
for i = 1:size(data,1)
xdata = data(i,:);
junzhi=mean(xdata); %均值
fangcha=mean((xdata-junzhi).^2); %方差
p=max(xdata)-min(xdata); %峰值
k=kurtosis(xdata); %峭度
r=rms(xdata); %有效值
c=p/r; %峰值因子
v=p/mean(abs(xdata)); %脈沖因子
s=r/mean(abs(xdata)); %波形因子
ma=p/mean(sqrt(abs(xdata)))^2; %裕度因子
new_data(i,:) = [junzhi,fangcha,p,k,r,c,v,s,ma];
end
??接下來是數(shù)據(jù)送入神經(jīng)網(wǎng)絡(luò)之前的整理,具體就是給每類數(shù)據(jù)打上標(biāo)簽和歸一化。
%% 導(dǎo)入數(shù)據(jù)
bv = 120; %每種狀態(tài)數(shù)據(jù)有60組
% 加標(biāo)簽值
hhh = size(new_data,2);
for i=1:size(new_data,1)/bv
new_data(1+bv*(i-1):bv*i,hhh+1)=i;
end
% 輸入數(shù)據(jù)
input=new_data(:,1:end-1); %第1列至倒數(shù)第2列為輸入
output=data(:,end); %最后1列為輸出
[inputn,inputps]=mapminmax(input',0,1);
[outputn,outputps]=mapminmax(output');
?求取MIV值的具體代碼:
p=inputn;
t=outputn;
p=p';
[m,n]=size(p);
yy_temp=p;
% p_increase為增加10%的矩陣 p_decrease為減少10%的矩陣
for i=1:n
p=yy_temp;
pX=p(:,i);
pa=pX*1.1;
p(:,i)=pa;
aa=['p_increase' int2str(i) '=p;'];
eval(aa);
end
for i=1:n
p=yy_temp;
pX=p(:,i);
pa=pX*0.9;
p(:,i)=pa;
aa=['p_decrease' int2str(i) '=p;'];
eval(aa);
end
%% 特征重要度神經(jīng)網(wǎng)絡(luò)
nntwarn off;
p=yy_temp;
p=p';
% bp網(wǎng)絡(luò)建立
net=newff(minmax(p),[8,1],{'tansig','purelin'},'traingdm');
% 初始化網(wǎng)絡(luò)
net=init(net);
% 網(wǎng)絡(luò)訓(xùn)練參數(shù)設(shè)置
net.trainParam.show=50;
net.trainParam.lr=0.05;
net.trainParam.mc=0.7;
net.trainParam.epochs=2000;
net.trainParam.showWindow = false;
net.trainParam.showCommandLine = false;
% 網(wǎng)絡(luò)訓(xùn)練
net=train(net,p,t);
%% 變量重要度計算
% 轉(zhuǎn)置后sim
for i=1:n
eval(['p_increase',num2str(i),'=transpose(p_increase',num2str(i),');'])
end
for i=1:n
eval(['p_decrease',num2str(i),'=transpose(p_decrease',num2str(i),');'])
end
% result_in為增加10%后的輸出 result_de為減少10%后的輸出
for i=1:n
eval(['result_in',num2str(i),'=sim(net,','p_increase',num2str(i),');'])
end
for i=1:n
eval(['result_de',num2str(i),'=sim(net,','p_decrease',num2str(i),');'])
end
for i=1:n
eval(['result_in',num2str(i),'=transpose(result_in',num2str(i),');'])
end
for i=1:n
eval(['result_de',num2str(i),'=transpose(result_de',num2str(i),');'])
end
% MIV的值
% MIV被認(rèn)為是在神經(jīng)網(wǎng)絡(luò)中評價變量相關(guān)的最好指標(biāo)之一
% 其符號代表相關(guān)的方向,絕對值大小代表影響的相對重要性。
for i=1:n
IV= ['result_in',num2str(i), '-result_de',num2str(i)];
eval(['MIV_',num2str(i) ,'=mean(',IV,')*(1e7)',';']) ;
eval(['MIVX=', 'MIV_',num2str(i),';']);
MIV(i,:)=MIVX;
end
[MB,iranked] = sort(MIV,'descend');
??數(shù)據(jù)可視化分析,畫圖:
%% 數(shù)據(jù)可視化分析
%-------------------------------------------------------------------------------------
figure()
barh(MIV(iranked),'g');
xlabel('Variable Importance','FontSize',12,'Interpreter','latex');
ylabel('Variable Rank','FontSize',12,'Interpreter','latex');
title('特征變量重要度','fontsize',12,'FontName','華文宋體')
hold on
barh(MIV(iranked(1:5)),'y');
hold on
barh(MIV(iranked(1:3)),'r');
grid on
xt = get(gca,'XTick');
xt_spacing=unique(diff(xt));
xt_spacing=xt_spacing(1);
yt = get(gca,'YTick');
% 條形標(biāo)注
for ii=1:length(MIV)
text(...
max([0 MIV(iranked(ii))+0.02*max(MIV)]),ii,...
['P ' num2str(iranked(ii))],'Interpreter','latex','FontSize',12);
end
set(gca,'FontSize',12)
set(gca,'YTick',yt);
set(gca,'TickDir','out');
set(gca, 'ydir', 'reverse' )
set(gca,'LineWidth',2);
drawno
接下來是將求得的iranked值帶入神經(jīng)網(wǎng)絡(luò)里邊,求出診斷結(jié)果的代碼。
function [outputt,predict_label] = BP(iranked)
addpath(genpath(pwd));
%DE是驅(qū)動端數(shù)據(jù) FE是風(fēng)扇端數(shù)據(jù) BA是加速度數(shù)據(jù) 選擇其中一個就行
load 97.mat %正常
load 105.mat %直徑0.007英寸,轉(zhuǎn)速為1797時的 內(nèi)圈故障
load 118.mat %直徑0.007,轉(zhuǎn)速為1797時的 滾動體故障
load 130.mat %直徑0.007,轉(zhuǎn)速為1797時的 外圈故障
load 169.mat %直徑0.014英寸,轉(zhuǎn)速為1797時的 內(nèi)圈故障
load 185.mat %直徑0.014英寸,轉(zhuǎn)速為1797時的 滾動體故障
load 197.mat %直徑0.014英寸,轉(zhuǎn)速為1797時的 外圈故障
load 209.mat %直徑0.021英寸,轉(zhuǎn)速為1797時的 內(nèi)圈故障
load 222.mat %直徑0.021英寸,轉(zhuǎn)速為1797時的 滾動體故障
load 234.mat %直徑0.021英寸,轉(zhuǎn)速為1797時的 外圈故障
% 一共是10個狀態(tài),每個狀態(tài)有120組樣本,每個樣本的數(shù)據(jù)量大小為:1×2048
w=1000; % w是滑動窗口的大小1000
s=2048; % 每個故障表示有2048個故障點(diǎn)
m = 120; %每種故障有120個樣本
D0=[];
for i =1:m
D0 = [D0,X097_DE_time(1+w*(i-1):w*(i-1)+s)];
end
D0 = D0';
D1=[];
for i =1:m
D1 = [D1,X105_DE_time(1+w*(i-1):w*(i-1)+s)];
end
D1 = D1';
D2=[];
for i =1:m
D2 = [D2,X118_DE_time(1+w*(i-1):w*(i-1)+s)];
end
D2 = D2';
D3=[];
for i =1:m
D3 = [D3,X130_DE_time(1+w*(i-1):w*(i-1)+s)];
end
D3 = D3';
D4=[];
for i =1:m
D4 = [D4,X169_DE_time(1+w*(i-1):w*(i-1)+s)];
end
D4 = D4';
D5=[];
for i =1:m
D5 = [D5,X185_DE_time(1+w*(i-1):w*(i-1)+s)];
end
D5 = D5';
D6=[];
for i =1:m
D6 = [D6,X197_DE_time(1+w*(i-1):w*(i-1)+s)];
end
D6 = D6';
D7=[];
for i =1:m
D7 = [D7,X209_DE_time(1+w*(i-1):w*(i-1)+s)];
end
D7 = D7';
D8=[];
for i =1:m
D8 = [D8,X222_DE_time(1+w*(i-1):w*(i-1)+s)];
end
D8 = D8';
D9=[];
for i =1:m
D9 = [D9,X234_DE_time(1+w*(i-1):w*(i-1)+s)];
end
D9 = D9';
data = [D0;D1;D2;D3;D4;D5;D6;D7;D8;D9];
for i = 1:size(data,1)
xdata = data(i,:);
junzhi=mean(xdata);
fangcha=mean((xdata-junzhi).^2);
p=max(xdata)-min(xdata);
k=kurtosis(xdata);
r=rms(xdata);
c=p/r;
v=p/mean(abs(xdata));
s=r/mean(abs(xdata));
ma=p/mean(sqrt(abs(xdata)))^2;
new_data1(i,:) = [junzhi,fangcha,p,k,r,c,v,s,ma];
end
%這里進(jìn)行一個簡單的判斷
iranked = iranked';
if sum(length(iranked)==[1,2,3,4,5,6,7,8,9])==9
new_data = new_data1;
else
ir = iranked(1:4); %取重要度較高的前4個特征作為神經(jīng)網(wǎng)絡(luò)的輸入
new_data = new_data1(:,ir);
end
rng('default')
%% 導(dǎo)入數(shù)據(jù)
bv = 120; %每種狀態(tài)數(shù)據(jù)有60組
% 加標(biāo)簽值
hhh = size(new_data,2);
for i=1:size(new_data,1)/bv
new_data(1+bv*(i-1):bv*i,hhh+1)=i;
end
new_data=new_data(randperm(size(new_data,1)),:); %此行代碼用于打亂原始樣本,使訓(xùn)練集測試集隨機(jī)被抽取,有助于更新預(yù)測結(jié)果。
input=new_data(:,1:end-1);
output1 =new_data(:,end);
for i=1:size(new_data,1)
switch output1(i)
case 1
output(i,1)=1;
case 2
output(i,2)=1;
case 3
output(i,3)=1;
case 4
output(i,4)=1;
case 5
output(i,5)=1;
case 6
output(i,6)=1;
case 7
output(i,7)=1;
case 8
output(i,8)=1;
case 9
output(i,9)=1;
case 10
output(i,10)=1;
end
end
m=fix(size(new_data,1)*0.7); %訓(xùn)練的樣本數(shù)目
input_train=input(1:m,:)';
output_train=output(1:m,:)';
input_test=input(m+1:end,:)';
output_test=output(m+1:end,:)';
%% 數(shù)據(jù)歸一化
[inputn,inputps]=mapminmax(input_train,0,1);
% [outputn,outputps]=mapminmax(output_train);
inputn_test=mapminmax('apply',input_test,inputps);
hiddennum_best = 30;
%% 構(gòu)建最佳隱含層節(jié)點(diǎn)的BP神經(jīng)網(wǎng)絡(luò)
disp(' ')
disp('標(biāo)準(zhǔn)的BP神經(jīng)網(wǎng)絡(luò):')
net0=newff(inputn,output_train,hiddennum_best,{'tansig','purelin'},'trainlm');% 建立模型
%網(wǎng)絡(luò)參數(shù)配置
net0.trainParam.epochs=1000; % 訓(xùn)練次數(shù),這里設(shè)置為1000次
net0.trainParam.lr=0.01; % 學(xué)習(xí)速率,這里設(shè)置為0.01
net0.trainParam.goal=0.000001; % 訓(xùn)練目標(biāo)最小誤差,這里設(shè)置為0.0001
net0.trainParam.show=25; % 顯示頻率,這里設(shè)置為每訓(xùn)練25次顯示一次
% net0.trainParam.mc=0.01; % 動量因子
net0.trainParam.min_grad=1e-6; % 最小性能梯度
net0.trainParam.max_fail=6; % 最高失敗次數(shù)
%開始訓(xùn)練
net0=train(net0,inputn,output_train);
%預(yù)測
an0=sim(net0,inputn_test); %用訓(xùn)練好的模型進(jìn)行仿真
predict_label=zeros(1,size(an0,2));
for i=1:size(an0,2)
predict_label(i)=find(an0(:,i)==max(an0(:,i)));
end
outputt=zeros(1,size(output_test,2));
for i=1:size(output_test,2)
outputt(i)=find(output_test(:,i)==max(output_test(:,i)));
end
%% 畫方框圖
confMat = confusionmat(outputt,predict_label); %output_test是真實(shí)值標(biāo)簽
figure;
set(gcf,'unit','centimeters','position',[15 5 13 9])
plotConfMat(confMat.');
xlabel('Predicted label')
ylabel('Real label')
hold off
end
歡迎大家評論區(qū)留言哦!
代碼獲取方式,下方卡片回復(fù)關(guān)鍵詞:特征降維文章來源:http://www.zghlxwxcb.cn/news/detail-482713.html
歡迎大家評論區(qū)留言,需要什么類型的代碼,歡迎告訴博主!文章來源地址http://www.zghlxwxcb.cn/news/detail-482713.html
到了這里,關(guān)于特征維度降維算法——平均影響值算法(MIV)免費(fèi)MATLAB代碼獲取,西儲大學(xué)數(shù)據(jù)為例的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!