本站原创文章,转载请说明来自《老饼讲解-BP神经网络》www.bbbdata.com
MIV(mean impact value)平均影响值算法,主要用于检测输出受到哪些输入变量的影响
MIV法是一种用来筛选变量、评估变量重要性的方法,往往使用BP神经网络搭配MIV来筛选变量
本文讲解什么是MIV算法,和如何通过MIV来计算各个变量在BP神经网络中的影响程度
本节讲解MIV法的思路与原理
初步了解MIV法
什么是MIV法
MIV(mean impact value)平均影响值算法,主要用于检测输出受到哪些输入变量的影响
MIV往往搭配BP神经网络来筛选变量、评估变量重要性
MIV法的思路
MIV法的具体思路与流程如下:
MIV先训练一个可用的模型,再对某个变量进行扰动(例如上下浮动10%),
然后计算变量的扰动对输出造成的影响,以所有样本的平均影响来评估变量的重要性
备注:MIV的思想如上,但如何扰动变量、如何评估对输出的影响,在具体实现时会有不同的、具体的实现方案
本节通展示一个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