BP神經網絡及matlab實現


1、BP神經網絡簡介:其可以稱為“萬能的模型+誤差修正函數”,每次根據訓練得到的結果和預想結果進行誤差分析,進而修改權值和閾值,一步一步得到能輸出和預想結果一致的模型。

其是由輸入層、隱藏層和輸出層組成,對給懂的訓練集進行訓練,從而能夠依據現有變量對需要的值進行預測。

具體過程可以見博客:https://blog.csdn.net/fanxin_i/article/details/80212906

 

 

 

Matlab實現的代碼:

  1 data=[6114    6425    6525    5732    6215    6645    
  2 138.69322    142.142486    134.925831    134.490744    126.613224    120.087785    
  3 83.540532    76.595546    72.291648    80.135362    79.936302    74.774776    
  4 0.924604    0.853992    0.814085    0.904912    0.901754    0.83836    
  5 ];
  6 inputdata=data(2:4,:);
  7 outputdata=data(1,:);
  8 [rows,cols]=size(inputdata);
  9 % 取測試樣本數量等於輸入(訓練集)樣本數量,因為輸入樣本(訓練集)容量較少
 10 % 否則一般必須用新鮮數據進行測試
 11 numberOfSample = cols; %輸入樣本數量
 12 numberOfTestSample = cols; 
 13 numberOfForcastSample = 3; %預測步數
 14 numberOfHiddenNeure = 10; %網絡層數
 15 inputDimension = rows; %輸入變量數
 16 outputDimension = 1;%輸出變量數
 17 %准備好訓練集
 18 output1=outputdata;
 19 
 20 %由系統時鍾種子產生隨機數
 21 rand('state', sum(100*clock));
 22  
 23 %輸入數據矩陣
 24 input = inputdata;
 25 %目標(輸出)數據矩陣
 26 output = output1;
 27  
 28 %對訓練集中的輸入數據矩陣和目標數據矩陣進行歸一化處理
 29 [sampleInput, minp, maxp, tmp, mint, maxt] = premnmx(input, output);
 30  
 31 %噪聲強度
 32 noiseIntensity = 0.01;
 33 %利用正態分布產生噪聲
 34 noise = noiseIntensity * randn(outputDimension, numberOfSample);
 35 %給樣本輸出矩陣tmp添加噪聲,防止網絡過度擬合
 36 sampleOutput = tmp + noise;
 37  
 38 % 取測試樣本輸入(輸出)與輸入樣本相同,因為輸入樣本(訓練集)容量較少,
 39 % 否則一般必須用新鮮數據進行測試
 40 testSampleInput = sampleInput;
 41 testSampleOutput = sampleOutput;
 42  
 43 %最大訓練次數
 44 maxEpochs = 50000;
 45  
 46 %網絡的學習速率
 47 learningRate = 0.035;
 48  
 49 %訓練網絡所要達到的目標誤差
 50 error0 = 0.65*10^(-3);
 51  
 52 %初始化輸入層與隱含層之間的權值
 53 W1 = 0.5 * rand(numberOfHiddenNeure, inputDimension) - 0.1;
 54 %初始化輸入層與隱含層之間的閾值
 55 B1 = 0.5 * rand(numberOfHiddenNeure, 1) - 0.1;
 56 %初始化輸出層與隱含層之間的權值
 57 W2 = 0.5 * rand(outputDimension, numberOfHiddenNeure) - 0.1;
 58 %初始化輸出層與隱含層之間的閾值
 59 B2 = 0.5 * rand(outputDimension, 1) - 0.1;
 60  
 61 %保存能量函數(誤差平方和)的歷史記錄
 62 errorHistory = [];
 63  
 64 for i = 1:maxEpochs
 65     %隱含層輸出
 66     hiddenOutput = logsig(W1 * sampleInput + repmat(B1, 1, numberOfSample));
 67     %輸出層輸出
 68     networkOutput = W2 * hiddenOutput + repmat(B2, 1, numberOfSample);
 69     %實際輸出與網絡輸出之差
 70     error = sampleOutput - networkOutput;
 71     %計算能量函數(誤差平方和)
 72     E = sumsqr(error);
 73     errorHistory = [errorHistory E];
 74 
 75     if E < error0
 76         break;
 77     end
 78  
 79     %以下依據能量函數的負梯度下降原理對權值和閾值進行調整
 80     delta2 = error;
 81     delta1 = W2' * delta2.*hiddenOutput.*(1 - hiddenOutput);
 82     dW2 = delta2 * hiddenOutput';
 83     dB2 = delta2 * ones(numberOfSample, 1);
 84  
 85     dW1 = delta1 * sampleInput';
 86     dB1 = delta1 * ones(numberOfSample, 1);
 87     W2 = W2 + learningRate * dW2;
 88     B2 = B2 + learningRate * dB2;
 89     W1 = W1 + learningRate * dW1;
 90     B1 = B1 + learningRate * dB1;
 91 end
 92 %下面對已經訓練好的網絡進行(仿真)測試
 93 %對測試樣本進行處理
 94 testHiddenOutput = logsig(W1 * testSampleInput + repmat(B1, 1, numberOfTestSample));
 95 testNetworkOutput =  W2 * testHiddenOutput + repmat(B2, 1, numberOfTestSample);
 96 %還原網絡輸出層的結果(反歸一化)
 97 a = postmnmx(testNetworkOutput, mint, maxt);
 98 
 99 %繪制測試樣本神經網絡輸出和實際樣本輸出的對比圖(figure(bp1))
100 t = 1:cols; %預測的圖
101 %測試樣本網絡輸出客運量
102 a1 = a(1,:); 
103 %測試樣本網絡輸出貨運量
104 % a2 = a(2,:);
105 figure(1);
106 plot(t, a1, 'ro', t, output, 'b+');
107 legend('網絡銷售量', '實際銷售量');
108 xlabel(''); ylabel('銷售量/件');
109 title('神經網絡銷售量學習與測試對比圖');
110 grid on;
111 
112 % 新的數據輸入
113 newInput = [93.987    111.684    143.331; 62.846    71.317    77.109;0.705    0.792    0.839]; 
114 %利用原始輸入數據(訓練集的輸入數據)的歸一化參數對新輸入數據進行歸一化
115 newInput = tramnmx(newInput, minp, maxp);
116 newHiddenOutput = logsig(W1 * newInput + repmat(B1, 1, numberOfForcastSample));
117 newOutput = W2 * newHiddenOutput + repmat(B2, 1, numberOfForcastSample);
118 newOutput = postmnmx(newOutput, mint, maxt);
119 disp('預測10月份之后12周的銷售量分別為(單位:件):');
120 newOutput(1,:);%輸出 or 不輸出
121 
122 [m,n]=size(newInput);
123 % 在figure(bp1)的基礎上繪制預測情況bp2
124 figure(2);
125 t1 = 1:cols+n;%輸入周橫坐標
126 y=[7154,5756,7110];
127 facoutputss=[a1,newOutput(1,:)];
128 orioutput=[outputdata,y];
129 plot(t1, facoutputss, 'ro', t1,orioutput, 'b+');
130 % legend('網絡輸出銷售量', '銷售量');
131 % xlabel(''); ylabel('銷售量/件');
132 % title('神經網絡銷售量學習與測試對比圖(添加了預測數據)');
133 grid on;
134 
135 % 繪制能量函數值的變化情況bp3
136 figure(3);
137 [m,n]= size(errorHistory);
138 t3 = 1:n;
139 plot(t3, errorHistory, 'r-');
140 %為了更加清楚地觀察出能量函數值的變化情況,這里我只繪制前100次的訓練情況
141 xlim([1 100]);
142 xlabel('訓練過程');
143 ylabel('能量函數值');
144 title('能量函數(誤差平方和)在訓練神經網絡過程中的變化圖');
145 grid on;
146 
147 result=newOutput(1,:);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM