冰冰点灯,照亮我家门前~
欢迎进入nnetinfo
用户名:
密码:
深圳学习数据分析,数据挖掘,请联系yahushuxue@163.com~
nnetinfo : 本网发布神经网络相关的学习与研讨内容。
当前位置:教学区
基于MIV的相关变量检测
作者:梁小h   日期:2015-11-24 10:53:01.0

        MIV(mean impact value)平均影响值算法,主要用于检测哪些输入变量与输出相关(本文所说的相关不是统计学中定义的“相关”,仅是字面意思,相关,有关系的意思)。

       算法很简单,先训练好网络。再将某个输入减少10%和增加10%(其它输入保持不变),将两组数据都输入到网络中,查看该输入的落差会引起网络输出多少的落差。若果引起的落差很少,则说明该输入对输出影响很小,否则,则认为对输出影响较大。

       因为简单,直接就上代码,一看代码即明:

一.代码实现

程序设定了两个输入,1个输出。其中,输出只与输入1有关:y = sin(x1)+0.2*x1.*x1; 而x2是随机生成的数。程序希望通过MIV,检测出y只与x1有关,而与x2无关。

%MIV code
%本代码来自www.nnetinfo.com
%代码主旨用于教学,供大家学习理解用神经网络MIV算法检测输入与输出的相关性

rs = RandStream('mcg16807','Seed',pi);  %固定随机种子
RandStream.setGlobalStream(rs);

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*x1.*x1;

inputData  = [x1;x2;]; %将x1,x2作为输入数据

outputData = y;       %将y作为输出数据

%使用用输入输出数据(inputData、outputData)建立网络,
net = newrb(inputData, outputData,0.01, 2);    %以X,Y建立径向基网络,目标误差为0.01,径向基的spread=2
%===================使用BP训练网络==========================
% net= newff(inputData,outputData,4,{'tansig','purelin'},'trainlm');
% net.divideParam.trainRatio =1;  %本例数据点较少,把数据全用于训练
% net.divideParam.valRatio =0;
% net.divideParam.testRatio =0;
% net= train(net,inputData,outputData);
%===================使用BP训练网络==========================

simout = sim(net,inputData); %调用matlab神经网络工具箱自带的sim函数得到网络的预测值

figure;  %新建画图窗口窗口
t=1:length(simout);
plot(t,outputData,t,simout,'r')%画图,对比原来的y和网络预测的y

inputLen = size( inputData,1); %
delta    = zeros(1,inputLen);

for i = 1 : inputLen
    inputData1 = inputData;
    inputData1(i,:) = inputData1(i,:)*0.9; %对第i个输入减少10%
    
    inputData2 = inputData;
    inputData2(i,:) = inputData2(i,:)*1.1; %对第i个输入增加10%
    
    %求输入的落差引起网络输出的落差
    dd{i} = ( sim(net, inputData2) - sim(net, inputData1));
    delta(i) = mean(( sim(net, inputData2) - sim(net, inputData1)));
    disp(['变量',num2str(i),'的影响值 : ',num2str(delta(i))])
end

%===以下代码供研究使用,与MIV算法无关。=====================================
%===下面的代码用于绘画网络在x1,x2上的拟合效果。
%==可以看到在x1上是波动的,而在x2上是平缓的,所以在X1上的波动会引起网络输出的落差
% w1 = linspace(min(x1),max(x1),50);
% w2 = linspace(min(x2),max(x2),50);
%
% [X1,X2]=meshgrid(w1,w2);
% [m,n] = size(X1);
% v = zeros(m,n);
% for  i = 1 : m
%     for j = 1 : n
%         v (i,j)=   sim(net,[X1(i,j);X2(i,j)]);
%     end
% end
% figure(2)
% surf(X1,X2,v)
%===============================================================

   

二.结果分析

使用上面的程序,输出结果如下:

 

                                         

 

                                                                  图1   newrb径向基神经网络(spread = 2)

变量1的影响值 : 0.17105

变量2的影响值 : 0.0095324

从网络结果的输出,已经非常清晰看到,变量2的MIV值远远比变量1的小,说明MIV法在该例子中是有效的。

通过绘制 y = net(x1,x2)(图1),可以看出,网络在 x1 维上拟合了原始输出数据,x2维与输出无关,就非常平缓。

我们知道,径向基神经网络的spread会影响网络平滑性,若果将spread改为0.5,那么训练结果如下:

                                        

                                                                     图2  newrb径向基神经网络(spread = 0.5)

变量1的影响值 : 0.097323

变量2的影响值 : 0.00025007

可以看到,此时网络起伏不平。

由于MIV法,正是利用了网络的泛化功能,因此,需要尽可能的使网络平滑,扩展系数spread可以略为设大一些。

 

三.关于网络的选择:

(1)使用BP神经网络

        也可以使用BP神经网络训练,但是,不像径向基,BP有可能会失败,所以,一定要确定网络训练成功了,才可以继续MIV值的计算。

另外,隐节点较多可能会使BP网络比较跌宕,削弱泛化能力,因此,尽可能选更少的隐节点。

                                         

                                                                        图3    BP神经网络(8个隐节点)

                                           

                                                                         图4   BP神经网络(4个隐节点)

(2)newrbe(精确径向基)

          精确径向基也是不错的,而且不需要训练,算法时间会更快。不过考虑到newrb隐层神经元更少,会更平滑,所以牺牲一点训练时间,使用newrb。

 

四.关于MIV值的正负:

         MIV检测包括了抛物线这类既有正相关又有负相关的情况,因此,MIV值的正负,不严格代表正相关或负相关,只能说明整体上,更偏向于负相关或更偏向于正相关,当然这种说法也是不严格的,关于正负号,建议使用者根据自己实际情况进行分析。

 

想了解MIV的,还可以阅读《matlab神经网络43个案例分析》的第25章---《基于MIV的神经网络变量筛选---基于BP的神经网络变量筛选》

===========<原创文章,转载请说明来自神经网络之家www.nnetinfo.com>     =============