马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
梯度下降法数据预测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 385 414 448 495 517 569 603 962 604 611 609 890 796 694 596 481 411 392 335 317 303 279 301 309 653 363 368 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 318 659 330 408 424 470 514 513 560 582 633 646 633 618 616 575 553 467 456 418 374 326 340 633 275 290 295 307 346 386 412 429 505 538 569 603 929 619 610 607 872 770 671 600 454 438 378 325 339 293 316 296 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=[0,160,320,480,640,800,960,1120,1280,1440,1600]; %定义输入空间模糊分割
xspan2=[0,160,320,480,640,800,960,1120,1280,1440,1600]; %定义输入空间模糊分割
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 编辑 ] |