特征维度降维算法——平均影响值算法(MIV)免费MATLAB代码获取,西储大学数据为例

news2024/11/28 16:33:27

1. 原理概述    

        众所周知,常用的特征维度降维方法有主成分分析,因子分析法,平均值影响法。而平均影响值算法(MIV)是神经网络对输入变量进行降维的最好方法之一。

        在神经网络模型实际应用中,由于没有明确的理论来确定输入变量,即网络输入神经元难以确定。假如在神经网络的输入变量中掺杂一些不重要的自变量,不仅会增加模型的训练时间,也会降低模型准确性。因此筛选出影响程度大的网络输入变量对神经网络的改进具有重要意义。

        平均影响值(MIV)是评估输入自变量对输出变量影响程度的一个指标,MIV的正负表示该自变量对输出变量的影响方向,其绝对值大小表示影响程度。MIV通过对自变量特征指标值进行加减10%,构建两个新的训练样本,计算其对输出的影响变化值(IV),然后将影响变化值(IV)平均得到该自变量的MIV值,最后将每个自变量都重复上述步骤得到每个自变量的MIV值,并按绝对值大小对各自变量的影响程度进行排序。

2. 实验部分

        以西储大学轴承数据为例,计算轴承数据的均值,方差,峰值,峭度,有效值,峰值因子,脉冲因子,波形因子,裕度因子共九个指标作为神经网络的输入神经元。通过MIV值计算,筛选出特征重要度重要的几个指标,达到特征降维,提升诊断精度的目的。

        代码实现的功能有很多,包含原生数据的滑动窗口处理,特征值计算,神经网络数据准备,MIV值计算,以及特征筛选后的诊断结果。大家按需所取,如果感觉代码臃肿的后台可以留言,我可以将代码分开再发几篇文章供大家参考。

    先上代码结果:

    MIV值计算结果:

e2c73a46b6efe1bedcfcdb52dabdccb3.png

         筛选后的前四个重要的特征作为神经网络的神经元输入,带入神经网络后的结果如下:

ac519abe211f03b8b3782d1401fff09b.png

 

接下来上正餐:

    首先是滑动窗口数据处理代码,一共是10个状态,每个状态有120组样本,每个样本的数据量大小为:1×2048,共选取了电机转速为1797下的10种故障数据来来进行实验。将数据集合在一个data变量中。

clear
clc
addpath(genpath(pwd));
%DE是驱动端数据 FE是风扇端数据 BA是加速度数据 选择其中一个就行
load 97.mat  %正常
load 105.mat  %直径0.007英寸,转速为1797时的  内圈故障
load 118.mat   %直径0.007,转速为1797时的  滚动体故障
load 130.mat  %直径0.007,转速为1797时的  外圈故障
load 169.mat   %直径0.014英寸,转速为1797时的  内圈故障
load 185.mat    %直径0.014英寸,转速为1797时的  滚动体故障
load 197.mat    %直径0.014英寸,转速为1797时的  外圈故障
load 209.mat   %直径0.021英寸,转速为1797时的  内圈故障
load 222.mat  %直径0.021英寸,转速为1797时的  滚动体故障
load 234.mat  %直径0.021英寸,转速为1797时的 外圈故障
% 一共是10个状态,每个状态有120组样本,每个样本的数据量大小为:1×2048
w=1000;                  % w是滑动窗口的大小1000
s=2048;                  % 每个故障表示有2048个故障点
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变量的每一条数据求均值,方差,峰值,峭度,有效值,峰值因子,脉冲因子,波形因子,裕度因子共九个指标,并存放在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

  接下来是数据送入神经网络之前的整理,具体就是给每类数据打上标签和归一化。

%% 导入数据
bv = 120;    %每种状态数据有60组
% 加标签值
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
% 输入数据
input=new_data(:,1:end-1);    %第1列至倒数第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
%% 特征重要度神经网络
nntwarn off;
p=yy_temp;
p=p';
% bp网络建立
net=newff(minmax(p),[8,1],{'tansig','purelin'},'traingdm');
% 初始化网络
net=init(net);
% 网络训练参数设置
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;
% 网络训练
net=train(net,p,t);
%% 变量重要度计算
% 转置后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被认为是在神经网络中评价变量相关的最好指标之一
%  其符号代表相关的方向,绝对值大小代表影响的相对重要性。
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');

  数据可视化分析,画图:

%% 数据可视化分析
%-------------------------------------------------------------------------------------
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');    
% 条形标注
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值带入神经网络里边,求出诊断结果的代码。


function [outputt,predict_label]  = BP(iranked)
addpath(genpath(pwd));
%DE是驱动端数据 FE是风扇端数据 BA是加速度数据 选择其中一个就行
load 97.mat  %正常
load 105.mat  %直径0.007英寸,转速为1797时的  内圈故障
load 118.mat   %直径0.007,转速为1797时的  滚动体故障
load 130.mat  %直径0.007,转速为1797时的  外圈故障
load 169.mat   %直径0.014英寸,转速为1797时的  内圈故障
load 185.mat    %直径0.014英寸,转速为1797时的  滚动体故障
load 197.mat    %直径0.014英寸,转速为1797时的  外圈故障
load 209.mat   %直径0.021英寸,转速为1797时的  内圈故障
load 222.mat  %直径0.021英寸,转速为1797时的  滚动体故障
load 234.mat  %直径0.021英寸,转速为1797时的 外圈故障
% 一共是10个状态,每个状态有120组样本,每个样本的数据量大小为:1×2048
w=1000;                  % w是滑动窗口的大小1000
s=2048;                  % 每个故障表示有2048个故障点
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

%这里进行一个简单的判断
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个特征作为神经网络的输入
    new_data = new_data1(:,ir);
end

rng('default')
%% 导入数据
bv = 120;    %每种状态数据有60组
% 加标签值
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)),:);    %此行代码用于打乱原始样本,使训练集测试集随机被抽取,有助于更新预测结果。
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);    %训练的样本数目
input_train=input(1:m,:)';
output_train=output(1:m,:)';
input_test=input(m+1:end,:)';
output_test=output(m+1:end,:)';
%% 数据归一化
[inputn,inputps]=mapminmax(input_train,0,1);
% [outputn,outputps]=mapminmax(output_train);
inputn_test=mapminmax('apply',input_test,inputps);
 
hiddennum_best = 30;
%% 构建最佳隐含层节点的BP神经网络
disp(' ')
disp('标准的BP神经网络:')
net0=newff(inputn,output_train,hiddennum_best,{'tansig','purelin'},'trainlm');% 建立模型
%网络参数配置
net0.trainParam.epochs=1000;            % 训练次数,这里设置为1000次
net0.trainParam.lr=0.01;                % 学习速率,这里设置为0.01
net0.trainParam.goal=0.000001;           % 训练目标最小误差,这里设置为0.0001
net0.trainParam.show=25;                % 显示频率,这里设置为每训练25次显示一次
% net0.trainParam.mc=0.01;                % 动量因子
net0.trainParam.min_grad=1e-6;          % 最小性能梯度
net0.trainParam.max_fail=6;             % 最高失败次数
 
%开始训练
net0=train(net0,inputn,output_train);
%预测
an0=sim(net0,inputn_test); %用训练好的模型进行仿真
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是真实值标签
figure;
set(gcf,'unit','centimeters','position',[15 5 13 9])
plotConfMat(confMat.');  
xlabel('Predicted label')
ylabel('Real label')
hold off
end

欢迎大家评论区留言哦!

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/646577.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高压功率放大器的作用和用途是什么

高压功率放大器是一种用于产生高电压和高功率信号的电子设备,通常采用功率放大器电路来实现。它主要起到以下作用: 提供高电压信号 在一些应用中需要产生高电压信号,如高压变频器、医疗设备等。高压功率放大器可以提供稳定的高电压信号&#…

c4d云渲染几款好用的云渲染平台

C4D是指Maxon公司所开发的3D建模、动画和渲染软件Cinema 4D。它是一款非常流行的三维图形软件,被广泛用于电影、电视、游戏等领域中的动画制作、视觉效果、建筑可视化、工业设计、广告设计、虚拟现实等方面。其用户界面简单易用,功能丰富,可以…

之江实验室: 如何基于 JuiceFS 为超异构算力集群构建存储层 ?

今天,高性能计算结合人工智能技术正在推动科研创新。例如通过破解水稻基因密码推动作物育种从“试验选优”向“计算选优”发展,在医药领域快速分析分子与蛋白之间的相互作用,发现潜在的能够有效干预疾病发生的药物分子。 之江实验室就是上述科…

Apikit 自学日记: Apikit 如何发起测试

进入 API 文档详情页,点击上方 测试 标签,进入 API 测试页,系统会根据API文档自动生成测试界面并且填充测试数据。 填写请求参数 首先填写好请求参数。 请求头部 您可以输入或导入请求头部。批量导入的数据格式为 key : value ,…

Linux之多线程(上)——Linux下的线程概念

文章目录 前言一、地址空间和页表1.二级页表2.例子 二、线程1.概念重新理解前面讲的进程:在内核的视角,进程是承担分配系统资源的基本实体。站在CPU角度,能否去识别当前调度的task_struct是进程还是线程?Linux下并不存在真正的线程…

漫谈程序员创业

很多程序员选择辞职创业,成为了自己公司的创始人或者合伙人。他们选择离开原有的公司,是因为想要实现自己的梦想,追求更高的创业成就。辞职创业是一项具有挑战性的决定,需要勇气、决心和毅力。一些成功的创业者通过坚持不懈和不断…

知乎视频发布软件使用方法视频

知乎视频发布软件使用方法视频,知乎批量发布软件效果怎么样 #小红书视频上传#抖音seo软件#网络推广#视频营销 软件有月卡、季卡、半年卡、年卡 【其中推荐:百家号 哔哩哔哩B站,微博等软件发帖】 服务时间:(8&#xf…

Win10 IE11浏览器,您正在查看的页使用 Java,Microsoft 网站提供有关 Java 支持的更多信息 解决

最近工作需要支持下IE11浏览器,使用java applet控件。 以前IE10及以下版本都比较正常,但是IE11会出现一些比较奇怪的现象。 记录下解决的方法和过程,便于有需要的同学自取。 1.首先是报错,如下图所示;这个网上搜索了…

B站热点预测,提前解码流量关口

“追热点”是创作者的必修课。互联网信息更迭迅速,热点千变万化,今天是这个明天可能就不热了,或者敏锐度不够的创作者甚至会错过最佳进场时期,反倒蹭了热点但只抹到一点奶油。 与此同时,还很考验创作者对热点的发散性…

Layui禁止表格部分复选框,layui禁止表格自带第一列复选框,layui禁止表格部分复选框,layui获取表格复选框选中数据

前言 禁止某些行可以勾选操作&#xff0c;及选中后的操作和行操作 效果 实现 执行一个table示例 <table id"data_table" class"layui-hide" lay-filter"data_table"></table>cols 的第一列就是需要重写的复选框 table.render({…

为什么针对API的Bot自动化攻击越来越多?

API是连接现代应用程序的基石&#xff0c;越来越多的企业意识到API的重要性&#xff0c;其数量迎来爆发式增长&#xff0c;但API面临的安全威胁却比API调用增长更加迅猛。Salt Security于今年2月发布的报告显示&#xff0c;2022年有91%的公司存在与API相关的安全问题&#xff0…

门禁巨头遭勒索攻击,北约、阿里集团等多个实体受到影响

Cyber News 网站披露&#xff0c;疑似与俄罗斯有关的勒索软件团伙 ALPV/BlackCat 袭击了安全门禁制造商Automatic Systems&#xff0c;北约、阿里巴巴、泰雷兹等多个实体组织可能受到影响。 攻击事件发生后&#xff0c;ALPV/BlackCat 在暗网泄露网站上发布了安全门禁制造商 Aut…

基于Citespace、vosviewer文献计量学发表的论文-让您增加一条轻松搞定SCI论文途径

Citespace和vosviewer是使用最广泛的文献信息可视化软件工具&#xff0c;在理工、经管、法学、教育、农学、文史、医学、艺术等学科中普遍应用&#xff0c;发文量逐年显著上升。理论与实践相结合&#xff0c;通过文献计量学讲解、高效选题、数据库检索数据下载、软件使用等八个…

实战项目!ModbusRTU协议电磁泵驱动器温控器通讯讲解

大家好&#xff0c;我是华山自控编程的朱老师。 在之前的网课中&#xff0c;我们已经讲解了以下内容 1.C#与PLC的串口通讯 2.C#与变频器的通讯 3.C#的服务器和客户端的网络通讯 今天&#xff0c;我要视频和大家分享的是关于C#与我们的电磁泵驱动器以及C#与温控器的Modbus通…

微服务: 01-rabbitmq的应用场景及安装(docker)

目录 1. rabbitmq前言简介: 1.1 RabbitMQ的几个重要作用&#xff1a; -> 1.1.1 解耦&#xff1a; -> 1.1.2 异步通信&#xff1a; -> 1.1.3 流量削峰&#xff1a; -> 1.1.4 消息传递的可靠性和持久性&#xff1a; 2. rabbitmq的安装(docker版) -> 2.1 …

主动数据安全方法及最佳实践

数据安全管理不能只是为了限制组织中数据的使用&#xff0c;也不能仅仅是提供组织内数据出现泄露甚至是组织因数据安全受到监管惩罚后的解决方案。数据安全管理需要更有效地促进组织内数据资产的流通&#xff0c;并最大限度地避免数据安全事故。 一、为什么需要数据安全管理&a…

声音克隆,精致细腻,人工智能AI打造国师“一镜到底”鬼畜视频,基于PaddleSpeech(Python3.10)

电影《满江红》上映之后&#xff0c;国师的一段采访视频火了&#xff0c;被无数段子手恶搞做成鬼畜视频&#xff0c;诚然&#xff0c;国师的这段采访文本相当经典&#xff0c;他生动地描述了一个牛逼吹完&#xff0c;大家都信了&#xff0c;结果发现自己没办法完成最后放弃&…

【涨粉秘籍】如何快速涨粉并转化为铁粉。

如何快速涨粉并转化为铁粉。 前言在这一百天里&#xff0c;我在csdn获得了什么如何100天涨粉一万参加新星计划发布优质文章 什么是铁粉如何快速转化粉丝为铁粉多与读者互动鼓励读者也创作高质量的内容 后记 &#x1f3d8;️&#x1f3d8;️个人简介&#xff1a;以山河作礼。 &a…

工作读研两不误?同等学力申硕值不值得读?

根据教育部公布的最新数据&#xff1a; 今年全国考研报考人数达到474万人&#xff0c;相较去年增加17万人。 据中国青年报称据媒体报道&#xff0c; 2023年考研报名人数达到 474万人&#xff0c;而录取率不超过 20%&#xff0c;超过 300万考研学子注定落榜&#xff01; 一名女…

这所广东的211,录取平均分360+,复录比高达2.24!

一、学校及专业介绍 广东工业大学&#xff08;Guangdong University of Technology&#xff09;简称“广工”&#xff0c;位于广东省广州市&#xff0c;是广东省重点建设的省属重点大学、广东省“211工程”、首批广东省高水平大学、广东省高水平理工科大学、国家“111计划”“2…