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,:);