資源簡介
多層前饋神經網絡bp(back propagation)代碼附帶數據集,matlab版本

代碼片段和文件信息
%基于梯度下降法的三層sigmoid單元的前向網絡的BP算法
%Train為輸入樣本,行表示特征,列表示樣本,Except為目標向量
%第一層有4個神經元
%隱含層層有3個神經元
%輸出層有3個神經元
clear?all;
%導入數據
data?=?load(‘iris.txt‘);
data(:5?)?=?[];%現在的鳶尾花數據集第五列不需要,所以在這里刪除它
%利用每一類的前40個數據作為訓練數據
Train?=?[data(1:40:);data(51:90:);data(101:140:)]‘;
%定義期望輸出
class1?=?repmat([0.950.050.05]401);
class2?=?repmat([0.050.950.05]401);
class3?=?repmat([0.050.050.95]401);
Expect?=?[class1;class2;class3]‘;
[it]?=?size(Train);%i表示輸入層神經元的個數
[kt]?=?size(Expect);%k表示輸出層神經元的個數
j?=?5;%表示第一層神經元的個數
b?=?5;%表示第二層神經元的個數
%開始訓練數據
alpha?=?0.05;%學習速率?
goal?=?0.02;%精度要求
err?=?1;%誤差的初始值
iter?=?0;%用來記錄迭代的次數
%初始化網絡權值
W01?=?-0.5?+?0.5?*?rand(ji+1);%輸入與第一層之間的網絡權值
W12?=?-0.5?+?0.5?*?rand(bj+1);%第一層與的二層之間的網絡權值
W23?=?-0.5?+?0.5?*?rand(kb+1);%第二層與第三層之間的網絡權值
%初始化權重變化量矩陣
dW01?=?zeros(size(W01));
dW12?=?zeros(size(W12));
dW23?=?zeros(size(W23));
%初始化誤差矩陣
ErrArray?=?[];
while?err?>?goal%檢查退出循環條件
????iter?=?iter?+?1;%迭代次數增加一
for?m?=?1:t
????Inet?=?W01?*?[Train(:m);1];%前向計算過程
????O1?=?1?./?(1?+?exp(-Inet));%獲得第一層的輸出
????Nnet?=?W12?*?[O1;1];?%獲得第二層的輸出
????O2?=?1?./?(1?+?exp(-Nnet));
????Lnet?=?W23?*?[O2;1];?%獲得輸出層輸出
????O3?=?1?./?(1+exp(-Lnet));
????E(:m)?=?Expect(:m)?-?O3;%計算誤差
???%誤差反向傳播
???deltak=O3.*(1-O3).*E(:m);%對于輸出單元
???dW23=alpha*deltak*[O2;1]‘;?%輸出層權重調整
???deltaj=O2.*(1-O2).*(W23(:1:b)‘*deltak);%對于第二層單元
???dW12=alpha*deltaj*[O1;1]‘;?%第二層權值調整
???deltai=O1.*(1-O1).*(W12(:1:j)‘*deltaj);?%對于第一層
???dW01=alpha*deltai*[Train(:m);1]‘;?%第一層的權值調整?‘
???%更新權值
???W01=W01+dW01;
???W12=W12+dW12;
???W23=W23+dW23;
end
total=0;%每一次迭代的誤差
for?i=1:t
????total=total+sum(E(:m).*E(:m));
end
err=0.5*total;
time(iter)=iter;
ErrArray=[ErrArrayerr];%記錄每次的迭代誤差
end
%顯示誤差的變化趨勢
figure;
subplot(121);
plot(timeErrArray(1:iter));
title(‘網絡誤差‘);
xlabel(‘迭代的次數‘);
ylabel(‘誤差‘);
%下面利用得到的模型對數據進行分類
Test?=?[data(41:50:);data(91:100:);data(141:150:)]‘;
%下面的三個矩陣用來記錄那些數據分到那些類里面,order123分別統計第一?第二?第三類的數據
order1=[];
order2=[];
order3=[];
count=[0?0?0];%用來統計對應類的個數
for?i=1:30%總共有30個數據,分別對每一個進行分類
I1=W01*[Test(:i);1];%得到第一層輸入
O1=1./(1+exp(-I1));%得到第一層輸出
I2=W12*[O1;1];%得到第二層的輸入
O2=1./(1+exp(-I2));%得到第二層輸出
I3=W23*[O2;1];%得到第三層的輸入
O3=1./(1+exp(-I3));%得到第三層的輸出
%[numk]=max(O3);%選取第三層的輸出的最大值,哪個分量最大就歸為哪一類
%count(k)=count(k)+1;
if?O3(1)>=0.9?&?O3(2)<=0.1?&?O3(3)<=0.1
????order1=[order1i];
????count(1)=count(1)+1;
elseif?O3(2)>=0.9?&?O3(1)<=0.1?&?O3(3)<=0.1
????????order2=[order2i];
????????count(2)=count(2)+1;
elseif?O3(3)>=0.9?&?O3(2)<=0.1?&?O3(1)<=0.1
????????order3=[order3i];
????????count(3)=count(3)+1;
????end
end
fprintf(‘分類為第一個類的個數為:%d\n‘count(1));
disp(‘序號為:‘);
disp(order1);
fprintf(‘分類為第二個類的個數為:%d\n‘count(2));
disp(‘序號為:‘);
disp(order2);
fprintf(‘分類為第三個類的個數為:%d\n‘count(3));
disp(‘序號為:‘);
disp(order3);
fprintf(‘本次總共迭代了?%d?次\n‘iter);
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????3468??2017-12-24?20:31??bp代碼\BPNet.m
?????文件????????2848??2017-12-17?19:18??bp代碼\Iris.txt
?????目錄???????????0??2018-03-07?20:47??bp代碼\
- 上一篇:基于多播的QOSmatlab程序
- 下一篇:基于matlab的模糊控制程序集
評論
共有 條評論