?? rbf.m
字號(hào):
clear all
clc
inputNums=3; %輸入層節(jié)點(diǎn)
outputNums=3; %輸出層節(jié)點(diǎn)
hideNums=10; %隱層節(jié)點(diǎn)數(shù)
maxcount=20000; %最大迭代次數(shù)
samplenum=3; %一個(gè)計(jì)數(shù)器,無(wú)意義
precision=0.001; %預(yù)設(shè)精度
yyy=1.3; %yyy是幫助網(wǎng)絡(luò)加速走出平坦區(qū)
alpha=0.01; %學(xué)習(xí)率設(shè)定值
a=0.5; %BP優(yōu)化算法的一個(gè)設(shè)定值,對(duì)上組訓(xùn)練的調(diào)整值按比例修改
error=zeros(1,maxcount+1); %error數(shù)組初始化;目的是預(yù)分配內(nèi)存空間
errorp=zeros(1,samplenum); %同上
v=rand(inputNums,hideNums); %3*10;v初始化為一個(gè)3*10的隨機(jī)歸一矩陣; v表輸入層到隱層的權(quán)值
deltv=zeros(inputNums,hideNums); %3*10;內(nèi)存空間預(yù)分配
dv=zeros(inputNums,hideNums); %3*10;
w=rand(hideNums,outputNums); %10*3;同V
deltw=zeros(hideNums,outputNums);%10*3
dw=zeros(hideNums,outputNums); %10*3
samplelist=[0.1323,0.323,-0.132;0.321,0.2434,0.456;-0.6546,-0.3242,0.3255]; %3*3;指定輸入值3*3(實(shí)為3個(gè)向量)
expectlist=[0.5435,0.422,-0.642;0.1,0.562,0.5675;-0.6464,-0.756,0.11]; %3*3;期望輸出值3*3(實(shí)為3個(gè)向量),有導(dǎo)師的監(jiān)督學(xué)習(xí)
count=1;
while (count<=maxcount) %結(jié)束條件1迭代20000次
c=1;
while (c<=samplenum)
for k=1:outputNums
d(k)=expectlist(c,k); %獲得期望輸出的向量,d(1:3)表示一個(gè)期望向量?jī)?nèi) 的值
end
for i=1:inputNums
x(i)=samplelist(c,i); %獲得輸入的向量(數(shù)據(jù)),x(1:3)表一個(gè)訓(xùn)練向量
end
%Forward();
for j=1:hideNums
net=0.0;
for i=1:inputNums
net=net+x(i)*v(i,j);%輸入層到隱層的加權(quán)和∑X(i)V(i)
end
y(j)=1/(1+exp(-net)); %輸出層處理f(x)=1/(1+exp(-x))單極性sigmiod函數(shù)
end
for k=1:outputNums
net=0.0;
for j=1:hideNums
net=net+y(j)*w(j,k);
end
if count>=2&&error(count)-error(count+1)<=0.0001
o(k)=1/(1+exp(-net)/yyy); %平坦區(qū)加大學(xué)習(xí)率
else o(k)=1/(1+exp(-net)); %同上
end
end
%BpError(c)反饋/修改;
errortmp=0.0;
for k=1:outputNums
errortmp=errortmp+(d(k)-o(k))^2; %第一組訓(xùn)練后的誤差計(jì)算
end
errorp(c)=0.5*errortmp; %誤差E=∑(d(k)-o(k))^2 * 1/2
%end
%Backward();
for k=1:outputNums
yitao(k)=(d(k)-o(k))*o(k)*(1-o(k)); %輸入層誤差偏導(dǎo)
end
for j=1:hideNums
tem=0.0;
for k=1:outputNums
tem=tem+yitao(k)*w(j,k); %為了求隱層偏導(dǎo),而計(jì)算的∑
end
yitay(j)=tem*y(j)*(1-y(j)); %隱層偏導(dǎo)
end
%調(diào)整各層權(quán)值
for j=1:hideNums
for k=1:outputNums
deltw(j,k)=alpha*yitao(k)*y(j); %權(quán)值w的調(diào)整量deltw(已乘學(xué)習(xí)率)
w(j,k)=w(j,k)+deltw(j,k)+a*dw(j,k);%權(quán)值調(diào)整,這里的dw=dletw(t-1),實(shí)際是對(duì)BP算法的一個(gè)
dw(j,k)=deltw(j,k); %改進(jìn)措施--增加動(dòng)量項(xiàng)目的是提高訓(xùn)練速度
end
end
for i=1:inputNums
for j=1:hideNums
deltv(i,j)=alpha*yitay(j)*x(i); %同上deltw
v(i,j)=v(i,j)+deltv(i,j)+a*dv(i,j);
dv(i,j)=deltv(i,j);
end
end
c=c+1;
end%第二個(gè)while結(jié)束;表示一次BP訓(xùn)練結(jié)束
double tmp;
tmp=0.0;
for i=1:samplenum
tmp=tmp+errorp(i)*errorp(i);%誤差求和
end
tmp=tmp/c;
error(count)=sqrt(tmp);%誤差求均方根,即精度
if (error(count)<precision)%另一個(gè)結(jié)束條件
break;
end
count=count+1;%訓(xùn)練次數(shù)加1
end%第一個(gè)while結(jié)束
error(maxcount+1)=error(maxcount);
p=1:count;
pp=p/50;
plot(pp,error(p),'-'); %顯示誤差
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -