您的位置:首页 > 编程语言 > MATLAB

机器学习-最小最大模块化学习非线性问题

2014-04-03 19:19 218 查看
  经过前一篇的delta法则的应用,我们知道如何学习一个线性可分问题,但delta法则并不能学习非线性问题,我们可以利用最小最大模块化学习的方法,先将非线性问题分解成线性可分的几个子问题,利用delta法则分别对子问题进行学习,假设分成n个子问题,则我们可以得到n个决策面,将n个决策面两两取最小值,聚合成n/2个决策面,再两两取最大值,得到最终决策面。

  以一个简单的问题为例,分别用perception和LMS两种方法学习:

原问题:  输入值从左到右为1,2,3,4  黑色方块的输出值为1,白色原型的输出值为0,求出这个问题的决策面



1、Perceptron学习规则实现最小最大化:
(1)  先将问题分解为以下四个子问题:
 


(2)  对于每个子问题进行学习:
w=[0.5,0.5,0.5,0.5,0.5];    %
每个子问题的权值都初始化为0.5,b初始化为-0.5
b=[-0.5,-0.5,-0.5,-0.5];
P=[1,2;1,4;2,3;3,4];  % 4个子问题的输入信号
T=[1,0;1,0;0,1;1,0];  % 4个子问题的教师信号
i=1;  % 循环次数
while i<100
    for k=1:1:4 %
对每个子问题分别进行训练
    j=mod(i,2)+1;
    a=P(k,j)*w(:,k)+b(:,k);   %
计算估算值
    if (a<=0) %
以Perceptron规则判定a的值
        a=0;
    else
        a=1;
    end
    e=T(k,j)-a; %计算误差
    w(:,k)=w(:,k)+e*P(k,j);  %调整w和b值
    b(:,k)=b(:,k)+e;
    end
    i=i+1;
end
display(w);
display(b);
x=linspace(0,5);
y1=x*w(:,1)+b(:,1);  %构造函数
y2=x*w(:,2)+b(:,2);
y3=x*w(:,3)+b(:,3);
y4=x*w(:,4)+b(:,4);
plot(x,y1,'r',x,y2,'b',x,y3,'g',x,y4,'k'); 
%描点作图
axis([0,5,0,5]);
得到的权值和b为:
w = -1.5000   -0.5000   1.5000   -1.5000    0.5000
b = 2.5000    1.5000  -3.5000    5.5000
作出决策面为:(红色为子问题1,蓝色为子问题2,绿色为子问题3,黑色为子问题4)



(3)   将各模块进行最小化:
min_1=y1.*(y1<y2)+y2.*(y1>=y2);  
% 构造取两个函数最小值的分段函数
min_2=y3.*(y3<y4)+y4.*(y3>=y4);
 plot(x,min_1,'r',x,min_2,'m');
axis([0,5,0,5]);
作出决策面为:



(4)       将最小模块进行最大化
max_total=min_1.*(min_1>=min_2)+min_2.*(min_1<min_2);%构造取最大值的分段函数
plot(x,max_total);
axis([0,5,0,5]);
最后的决策面为:



2、LMS算法实现最小最大化:
(1)  对各个子问题的学习大致与perceptron一样,计算a值和误差时略有不同:
n=0.05;   % 设置步长
while i<500
    for k=1:1:4
    j=mod(i,2)+1;
    a=P(k,j)*w(:,k)+b(:,k);  %直接计算a
    e=T(k,j)-a;
    w(:,k)=w(:,k)+2*n*e*P(k,j); 
%w的变化与步长有关
    b(:,k)=b(:,k)+2*n*e;
    end
    i=i+1;
end
  最终得到的w和b值为:
w = -0.9792  -0.3333    0.9591   -0.9263   0.5000
b = 1.9633   1.3333   -1.8772    3.6193
作图得:



(2)  子问题最小模块化,过程与之前一致,得到决策面为:



(3)  将最小化得到的模块最大化,得到最终决策面:



    从结果中可以看到,无论是perception还是LMS方法,都能较准确地学习出问题的决策面。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息