BP神经网络

【示例】基于MIV的变量重要性检测

作者 : 老饼 发表日期 : 2022-06-21 15:25:07 更新日期 : 2024-04-27 17:35:31
本站原创文章,转载请说明来自《老饼讲解-BP神经网络》www.bbbdata.com



MIV(mean impact value)平均影响值算法,主要用于检测输出受到哪些输入变量的影响

MIV法是一种用来筛选变量、评估变量重要性的方法,往往使用BP神经网络搭配MIV来筛选变量

本文讲解什么是MIV算法,和如何通过MIV来计算各个变量在BP神经网络中的影响程度




    01. MIV原理简述   



本节讲解MIV法的思路与原理



     初步了解MIV法    


什么是MIV法
MIV(mean impact value)平均影响值算法,主要用于检测输出受到哪些输入变量的影响
MIV往往搭配BP神经网络来筛选变量、评估变量重要性

 MIV法的思路
MIV法的具体思路与流程如下:

MIV先训练一个可用的模型,再对某个变量进行扰动(例如上下浮动10%),
然后计算变量的扰动对输出造成的影响,以所有样本的平均影响来评估变量的重要性
 备注:MIV的思想如上,但如何扰动变量、如何评估对输出的影响,在具体实现时会有不同的、具体的实现方案





    02. MIV应用于BP神经网络的案例   



本节通展示一个MIV法应用于BP神经网络评估变量重要性的具体案例



     MIV法的具体实现步骤    


事实上,如何对变量进行扰动和如何评估对y的影响对MIV起着关键的作用
这里借鉴《matlab神经网络43个案例分析》第25章的方案,讲解MIV法的具体操作的代码实现
借鉴《matlab神经网络43个案例分析》第25章的方案,MIV法的具体操作如下:

1.先训练好一个可用的模型                                                                    
  例如训练好一个BP神经网络                                      
2.对变量进行扰动                                                                                  
将某个输入变量减少10%和增加10%,得到两组数据                 
这里需要注意,其它输入变量是保持不变的哦                     

3.计算变量浮动前后对输出的影响                                                          
将上述两组数据投到模型中进行预测,                          
并计算变量浮动后对输出的平均影响                             

平均影响值MIV计算公式如下:                                                      
 
                                
 :第i个样本,变量提升10%后的预测值     
 :第i个样本,变量下降10%后的预测值      




       MIV法代码实现      


%用MIV法评估各个变量的影响值
%本代码旨用于教学,供大家学习理解用神经网络MIV算法检测输入与输出的相关性
%本代码来自《老饼讲解BP神经网络》www.bbbdata.com

% ==============生成数据========================
setdemorandstream(88);                                                              % 固定随机种子
x1 = [-3,-2.7,-2.4,-2.1,-1.8,-1.5,-1.2,-0.9,-0.6,-0.3,0,0.3,0.6,0.9,1.2,1.5,1.8];   % x1:x1 = -3:0.3:2;
x2 = rand(1,length(x1));
y  = [0.6589,0.2206,-0.1635,-0.4712,-0.6858,-0.7975,-0.8040,...
    -0.7113,-0.5326,-0.2875 ,0,0.3035,0.5966,0.8553,1.0600,1.1975,1.2618];          % y: y = sin(x1)+0.2*x2.*x2;
inputData  = [x1;x2;];                                                              % 将x1,x2作为输入数据
outputData = y;                                                                     % 将y作为输出数据

%使用用输入输出数据(inputData、outputData)建立网络
%===================使用BP训练网络==========================
net= newff(inputData,outputData,5,{'tansig','purelin'},'trainlm');
net.divideParam.trainRatio = 1;                                                     % 本例数据点较少,把数据全用于训练
net.divideParam.valRatio   = 0;
net.divideParam.testRatio  = 0;
[net,tr]= train(net,inputData,outputData);
disp(['网络的误差:',num2str(tr.best_perf)])                                         % !注意:这里必须确保网络的误差足够低,即保证网络已经是可用的


% ======用训练好的网络计算各个变量的MIV值=====================
varNum = size( inputData,1);    % 变量个数
MIV    = zeros(varNum,1);       % 初始化MIV
for i = 1 : varNum
    inputDataDown      = inputData;                   % 复制一份输入数据
    inputDataDown(i,:) = inputDataDown(i,:)*0.9;      % 对第i个输入减少10%
    inputDataUp        = inputData;                   % 复制一份输入数据
    inputDataUp(i,:)   = inputDataUp(i,:)*1.1;        % 对第i个输入增加10%
    
    y_down = sim(net, inputDataDown);                 % 计算变量下降10%后的y值
	y_up   = sim(net, inputDataUp);                   % 计算变量提升10%后的y值
    MIV(i) = mean(y_up - y_down);                     % 求输入的落差引起网络输出的落差
    disp(['变量',num2str(i),'的影响值 : ',num2str(MIV(i))])
end
运行结果与分析
运行后结果如下:
 
首先,我们要确保用于计算MIV的网络是可用的,它是MIV的基本前提
这里的网络误差已经极小,所以是可用的,
然后从结果中可以看到,变量2的影响值,非常小,所以变量2实际可以剔除
事实上这是符合我们的猜想的,因为y事实上只与x1有关







   参考文献   


《matlab神经网络43个案例分析》第25章
《Prediction of Rib Fracture Injury Outcome by an Artificial Neural Network》
《brainmaker professional user's guide and reference manual》








 End 





联系老饼