?? bp.m
字號(hào):
InDim=2;%樣本輸入維數(shù)
OutDim=3;% 樣本輸出維數(shù)
figure
colordef(gcf,'white')
echo off
clc
axis([-2,2,-2,2])
axis on
grid
xlabel('Input x');
ylabel('Output y');
line([-1 1],[1 1])
line([1 -1],[1 0])
line([-1 -1],[0 1])
line([-1 1],[-0.5 -0.5])
line([-1 1],[-1.5 -1.5])
line([1 1],[-0.5 -1.5])
line([-1 -1],[-0.5 -1.5])
hold on
SamNum=200;%訓(xùn)練樣本數(shù)
rand('state',sum(100*clock))
SamIn=(rand(2,SamNum)-0.5)*4;% 隨機(jī)產(chǎn)生樣本輸入
%根據(jù)目標(biāo)函數(shù)獲得訓(xùn)練樣本輸入輸出,并繪制樣本
SamOut=[];
for i=1:SamNum
Sam=SamIn(:,i);
x=Sam(1,1);
y=Sam(2,1);
if((x>-1)&(x<1))==1
if ((y>x/2+1/2)&(y<1))==1
plot(x,y,'r+')
class=[0 1 0]';
elseif((y<-0.5)&(y>-1.5))==1
plot(x,y,'rs')
class=[0 0 1]';
else
plot(x,y,'ro')
class=[1 0 0]';
end
else
plot(x,y,'ro')
class=[1 0 0]';
end
SamOut=[SamOut class];
end
HiddenUnitNum=10;%隱節(jié)點(diǎn)數(shù)
MaxEpochs=10000;%最大訓(xùn)練次數(shù)
lr=0.1;%學(xué)習(xí)率
E0=0.01;%目標(biāo)誤差
W1=0.2*rand(HiddenUnitNum,InDim)-0.1;%輸入到隱層的初始權(quán)值
B1=0.2*rand(HiddenUnitNum,1)-0.1;%隱節(jié)點(diǎn)初始偏移
W2=0.2*rand(OutDim,HiddenUnitNum)-0.1;%隱層到輸出層的的初始權(quán)值
B2=0.2*rand(OutDim,1)-0.1;%輸出層的初始偏移
W1Ex=[W1 B1];%輸入層到隱層的初始權(quán)值擴(kuò)展
W2Ex=[W2 B2];%隱層到輸出層的初始權(quán)值
SamInEx=[SamIn' ones(SamNum,1)]';%樣本輸入擴(kuò)展
ErrHistory=[];%用于記錄每次權(quán)值條整后的訓(xùn)練誤差
for i=1:MaxEpochs %正向傳播計(jì)算網(wǎng)絡(luò)輸出
HiddenOut=logsig(W1Ex*SamInEx);
HiddenOutEx=[HiddenOut' ones(SamNum,1)]';
NetworkOut=logsig(W2Ex*HiddenOutEx);
% 停止學(xué)習(xí)判斷
Error=SamOut-NetworkOut;
SSE=sumsqr(Error)
%記錄每次權(quán)值調(diào)整后的訓(xùn)練誤差
ErrHistory=[ErrHistory,SSE];
if SSE<E0,break,end
%計(jì)算反向傳播誤差
Delta2=Error.*NetworkOut.*(1-NetworkOut);
Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut);
%計(jì)算權(quán)值調(diào)節(jié)量
dW2Ex=Delta2*HiddenOutEx';
dW1Ex=Delta1*SamInEx';
%權(quán)值調(diào)節(jié)
W1Ex=W1Ex+lr*dW1Ex;
W2Ex=W2Ex+lr*dW2Ex;
W2=W2Ex(:,1:HiddenUnitNum);
end
W1=W1Ex(:,1:InDim);
B1=W1Ex(:,InDim+1);
W2=W2Ex(:,1:HiddenUnitNum);
B2=W2Ex(:,HiddenUnitNum+1);
%繪制誤差曲線
figure
hold on
grid
[xx,Num]=size(ErrHistory);
plot(1:Num,ErrHistory,'r-');
TestSamNum=5000;% 測試樣本數(shù)
TestSamIn=(rand(2,TestSamNum)-0.5)*4;
TestHiddenOut=logsig(W1*TestSamIn+repmat(B1,1,TestSamNum));
TestNetworkOut=logsig(W2*TestHiddenOut+repmat(B2,1,TestSamNum));
[Val NNClass]=max(TestNetworkOut);
TestTargetOut=[];
for i=1:TestSamNum
Sam=TestSamIn(:,i);
x=Sam(1,1);
y=Sam(2,1);
if((x>-1)&(x<1))==1
if((y>x/2+1/2)&(y<1))==1
TestTargetOut=[TestTargetOut,2];
elseif((y<-0.5)&(y>-1.5))==1
TestTargetOut=[TestTargetOut 3];
else
TestTargetOut=[TestTargetOut 1];
end
else
TestTargetOut=[TestTargetOut 1];
end
end
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -