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

这篇具有很好参考价值的文章主要介绍了特征维度降维算法——平均影响值算法(MIV)免费MATLAB代码获取,西储大学数据为例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 原理概述    

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

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

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

2. 实验部分

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

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

    先上代码结果:

    MIV值计算结果:

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

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

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

接下来上正餐:

    首先是滑动窗口数据处理代码,一共是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

欢迎大家评论区留言哦!

代码获取方式,下方卡片回复关键词:特征降维

欢迎大家评论区留言,需要什么类型的代码,欢迎告诉博主!文章来源地址https://www.toymoban.com/news/detail-482713.html

到了这里,关于特征维度降维算法——平均影响值算法(MIV)免费MATLAB代码获取,西储大学数据为例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数学建模】matlab正态拟合直方图 | 获取一组数据的统计特征(平均值,方差等)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 首先给出一组数据样例: 1.1.1 平均值(期望) 获得结果: 1.1.2 中值 1.1.3 方差和标准差 A.方差 B.标准差(一般也是正态分布里面的西格玛) 1.1.4 排序 依然用之前的数据画图 从数据分布上来看大概就是个正

    2024年02月04日
    浏览(44)
  • 多维时序 | MATLAB实现BP、SVM、LSSVM多变量时间序列预测(考虑历史特征的影响,多指标、多图输出)

    预测效果 基本介绍 多维时序 | MATLAB实现BP、SVM、LSSVM多变量时间序列负荷预测(考虑历史特征的影响,多指标、多图输出)。 1.Matlab实现BP、SVM、LSSVM多变量时间序列预测; 2.运行环境为Matlab2018b; 3.输入多个特征,输出单个变量,考虑历史特征的影响,多变量时间序列预测;

    2024年02月02日
    浏览(39)
  • 机器学习基础之《特征工程(4)—特征降维》

    一、什么是特征降维 降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程 1、降维 降低维度 ndarry     维数:嵌套的层数     0维:标量,具体的数0 1 2 3...     1维:向量     2维:矩阵     3维:多个二维数组嵌套     n维:继续嵌套

    2024年02月13日
    浏览(30)
  • 【机器学习】特征降维 - 方差选择法VarianceThreshold

    「作者主页」: 士别三日wyx 「作者简介」: CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」: 对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 提取的特征当中,有一些相关(相似)的 「冗余特征」 ,这种特征是没有必

    2024年02月13日
    浏览(23)
  • 特征选择算法 | Matlab实现基于互信息特征选择算法的回归数据特征选择 MI

    效果一览 文章概述 特征选择算法 | Matlab实现基于互信息特征选择算法的回归数据特征选择 MI 部分源码

    2024年02月13日
    浏览(59)
  • 基于随机森林的特征选择-降维-回归预测——附代码

    目录 摘要: 1.随机森林: 2.随机森林的特征选取: 3.基于Matlab自带的随机森林函数进行特征选取具体步骤 (1)加载数据 (2)首先建立随机森林并使用全部特征进行车辆经济性预测 (3)使用随机森林进行特征选择 (4)评价各个特征之间的相关性 (5)使用筛选后的特征进

    2023年04月26日
    浏览(42)
  • 特征选择算法 | Matlab 基于最大互信息系数特征选择算法(MIC)的回归数据特征选择

    效果一览 文章概述 特征选择算法 | Matlab 基于最大互信息系数特征选择算法(MIC)的回归数据特征选择 部分源码

    2024年02月13日
    浏览(26)
  • 【特征选择】基于二进制粒子群算法的特征选择方法(KNN分类器)【Matlab代码#28】

    特征选择是机器学习和数据挖掘中的一个重要步骤,其目的是从给定的特征集合中选择出最具有代表性和相关性的特征,以提高模型的性能和泛化能力。 群智能算法是受到自然界中群体行为和集体智慧启发的一类优化算法,其中包括粒子群优化算法(Particle Swarm Optimization,

    2024年02月07日
    浏览(32)
  • 基于蝗虫优化的KNN分类特征选择算法的matlab仿真

    目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 KNN分类器基本原理 4.2 特征选择的重要性 4.3 蝗虫优化算法(GOA) 5.完整程序        基于蝗虫优化的KNN分类特征选择算法。使用蝗虫优化算法,选择最佳的特征,进行KNN分类,从而提高KNN分类

    2024年01月25日
    浏览(32)
  • 高基数类别特征预处理:平均数编码

    对于一个类别特征,如果这个特征的取值非常多,则称它为高基数(high-cardinality)类别特征。在深度学习场景中,对于类别特征我们一般采用Embedding的方式,通过预训练或直接训练的方式将类别特征值编码成向量。在经典机器学习场景中,对于有序类别特征,我们可以使用

    2024年02月11日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包