andrew 发表于 2007-5-5 15:11

[求助]matlab梯度下降法编程

梯度下降法数据预测matlab程序

这是我编的的matlab梯度下降法程序,根据王立新写的《模糊系统与模糊控制教程》中的梯度下降法的实现算法编的,用于作数据预测,
应该说用该方法作数据预测精度会很高的,可是我这个程序运行起来非常慢,精度也不是很高,不知道怎么回事。
请哪位达人帮看看!!先谢了!
如果谁有现成的梯度下降法matlab程序,请发一个给小妹,不胜感激!
电子邮箱:tju2002@126.com
%梯度下降算法
clear;
clc;
y11=[ 953   626   623   597   887   748   675   602   471   413   363   350   288   305   295   274   297   637   353   386   410 453   515   545   571   586   620   617   635   611   609   572   523   483   440   398   378   337   299   634   274   306   280   305   336   385414   448   495   517   569   603   962   604   611   609   890   796   694   596   481   411   392   335   317   303   279   301   309   653   363368   423   464   527   547   575   612   616   594   628   613   587   551   535   502   442   411   364   342   296   647   280   280   279   301 331   362   422   460   493   510   566   586   960   633   635   619   864   761   680   586   443   432   387   342   303   285   308   272   318659   330   408   424   470   514   513   560   582   633   646   633   618   616   575   553   467   456   418   374   326   340   633   275   290295   307   346   386   412   429   505   538   569   603   929   619   610   607   872   770   671   600   454   438   378   325   339   293   316296   313   665   336   372   408   463   492   518   552   603   603   593   629   613   584   553   530   482   466   408   374   347   297   645 302   277   283   299   343   383   413   457   518   536   566   587];
y111=y11';
nu=52;
x1=zeros(nu,1);
x2=zeros(nu,1);
y=zeros(nu,1);
for m=1:nu
    x1(m,:)=y111(m,:);                %输入第一年需求数据,作为输入数据
    x2(m,:)=y111(m+52,:);             %输入第二年需求数据,作为输入数据
end
    for j=105:156
      y(j-104,:)=y111(j,:);         %输入第三年数据,作为输出数据
    end
rule=100;                            %定义模糊规则数
uA=zeros(rule,2);
uA1=uA(:,1);
uA2=uA(:,2);
c=zeros(rule,2);
c1=c(:,1);
c2=c(:,2);
number=0;
for i=1:1:rule
    c1(i,1)=50;c2(i,1)=50;                      %定义初始输入隶属函数宽度
    a1(i,1)=100+10*ceil(i/5);                  %定义初始输入隶属函数中心
    a2(i,1)=100+10*ceil(i/5);                     %定义初始输入隶属函数中心
end
n=10;                        %定义学习速率
ww=zeros(rule,1);mkik=zeros(rule,1);b=zeros(rule,1);
xspan1=;               %定义输入空间模糊分割
xspan2=;               %定义输入空间模糊分割
for s=1:nu
    x11=x1(s,:);
    x22=x2(s,:);
    yy=y(s,:);
    k=0;
    for i1=1:10
      for i2=1:10
            k=k+1;
            if(x11>=xspan1(i1)&x11<=xspan1(i1+1)&x22>=xspan2(i2)&x22<=xspan2(i2+1))
                ww(k,1)=ww(k,1)+1;
                mkik(k,1)=yy;
                b(k,:)=b(k,:)+mkik(k,1);
            end
      end
    end
end
for i=1:rule
    if(ww(i,1)==0)
      b(i,:)=100;
    else
      b(i,:)=b(i,:)/ww(i,1);   %定义初始输出隶属函数中心
    end
end
e=ones(1,nu);eee=10;          %定义初始误差
while (eee>=0.5)
    eeh=0;
    for s=1:nu            %nu个输入模式对依次输入
      x11=x1(s,:);x22=x2(s,:);yy=y(s,:);
      s1=0;s2=0;
      for i=1:rule
            uA1(i,:)=exp(-((x11-a1(i,:))/c1(i,:))^2);%计算输入隶属函数
            uA2(i,:)=exp(-((x22-a2(i,:))/c2(i,:))^2);%计算输入隶属函数
            z(i,:)=uA1(i,:)*uA2(i,:);
            s1=s1+b(i,:)*z(i,:);
            s2=s2+z(i,:);
      end
      f(s,:)=s1/s2;
      e(1,s)=((f(s,:)-yy)^2)/2;         %计算目标函数
      eeh=eeh+e(1,s);                   %计算全局误差
      for j=1:rule
            %计算输出隶属函数的中心
            dyb(j,:)=-((f(s,:)-yy)*z(j,:))/s2;
            %计算输入隶属函数的中心
            dya1(j,:)=-(2*(f(s,:)-yy)*(b(j,:)-f(s,:))*(x11-a1(j,:))*z(j,:))/((c1(j,:)^2)*s2);
            dya2(j,:)=-(2*(f(s,:)-yy)*(b(j,:)-f(s,:))*(x22-a2(j,:))*z(j,:))/((c2(j,:)^2)*s2);
            %计算输入隶属函数的宽度
            dyc1(j,:)=-(2*(f(s,:)-yy)*(b(j,:)-f(s,:))*((x11-a1(j,:))^2)*z(j,:))/((c1(j,:)^3)*s2);
            dyc2(j,:)=-(2*(f(s,:)-yy)*(b(j,:)-f(s,:))*((x22-a2(j,:))^2)*z(j,:))/((c2(j,:)^3)*s2);
            %调整输入、输出隶属度函数的中心和宽度
            b(j,:)=b(j,:)+n*dyb(j,:);
            a1(j,:)=a1(j,:)+n*dya1(j,:);
            a2(j,:)=a2(j,:)+n*dya2(j,:);
            c1(j,:)=c1(j,:)+n*dyc1(j,:);
            c2(j,:)=c2(j,:)+n*dyc2(j,:);
      end
    end
    eee=eeh
    number=number+1
    num(number,:)=number;
    eeee(number,:)=eee;
end
t=1:1:52;
figure(1)
plot(t,y,'r',t,f,'b')      %绘制跟踪曲线
figure(2)
plot(num,eeee)               %绘制训练步数-误差曲线

[ 本帖最后由 eight 于 2007-5-5 18:41 编辑 ]

eight 发表于 2007-5-5 18:42

原帖由 andrew 于 2007-5-5 15:11 发表 http://forum.vibunion.com/forum/images/common/back.gif
梯度下降法数据预测matlab程序

这是我编的的matlab梯度下降法程序,根据王立新写的《模糊系统与模糊控制教程》中的梯度下降法的实现算法编的,用于作数据预测,
应该说用该方法作数据预测精度会很高的,可是 ...


梯度下降法的程序依稀记得本版有,请搜索一下

lxq 发表于 2007-5-5 18:58

程序里很多循环语句 速度肯定慢啊

如果只是做数据预测可以用相应的神经网络

BP网络就可利用梯度下降法来训练网络的

andrew 发表于 2007-5-6 20:28

回复 #3 lxq 的帖子

谢谢你的建议,不过对BP一点都不了解啊,请问达人有没有BP的程序传一个啊
tju2002@126.com
页: [1]
查看完整版本: [求助]matlab梯度下降法编程