1、知識點:
A、BP神經網絡:信號是前向傳播,誤差是反向傳播,BP是算法,它不代表神經網絡的結構;
B、BP神經網絡是有導師學習的神經網絡,在訓練的時候,需要指定輸入和輸出,讓它知道這個輸入對應這個輸出,讓它清楚每次訓練的過程,然后他的神經元的輸出和理想值目標有多大的誤差,這樣才會有誤差反向傳播這個過程;
C、MATLAB里怎么創建神經網絡包括設置他的參數:包括訓練,包括仿真預測,這個過程需要了解;
D、在訓練之前有必要對數據進行歸一化處理,為什么要歸一化,歸一化的方法有哪些,需要掌握的知識點。
神經網絡的學習規划又稱為神經網絡的訓練算法,用來計算更新神經網絡的權值和閾值。學習規則有兩大類別:有導師學習和無導師學習。在有導師學習中,需要為學習規則提供一系列正確的網絡輸入/輸出對(即訓練樣本),當網絡輸入時,將網絡輸出與對應的期望值進行比較,然后應用學習規則調整權值和閾值,使網絡的輸出接近於期望值。而無導師學習中,權值和閾值調整只與網絡輸入有關系,沒有期望值,這類算法大多用聚類算法,將輸入模式歸類於有限的類別。(有導師學習神經網絡:BP神經網絡和RBF神經網絡)
2、BP神經網絡的結構是一種典型的多層前向型神經網絡,具有一個輸入層,數個隱含層(可以是一層,也可以是多層)和一個輸出層。層與層之間采用全連接的方式,同一層的神經元之間不存在相互連接。
3、BP神經網絡的學習算法(傳播和權值更新):誤差反向傳播算法是典型的有導師指導的學習算法,其基本思想是對一定數量的樣本對(輸入和期望輸出)進行學習,即樣本特征(訓練集)的輸入送至網絡輸入層的各個神經元,經隱含層和輸出層的計算后(映射),輸出層各個神經元輸出對應的預測值;若預測值與期望輸出之間的誤差不滿足精度要求(閾值)時,就進行誤差反向傳播,即從輸出層反向傳播該誤差,利用這個誤差值來計算前一層的誤差(誤差計算進行到第二層為止),從而進行權值和閾值的調整,使得網絡的輸出和期望輸出間的誤差逐漸減小,直至滿足精度要求。其中,權值更新:運用梯度下降法,即沿着梯度下降最快的方向——負梯度方向,進行修正。
4、BP網絡的精髓:將網絡的輸出與期望輸出間的誤差歸結為權值和閾值的“過錯”,通過方向傳播把誤差“分攤”給各個神經元的權值和閾值。此處和線性擬合的誤差進行比較。
5、BP網絡學習算法的指導思想是權值和閾值的調整要沿着誤差函數下降最快的方向——負梯度方向
6、BP神經網絡的MATLAB工具箱函數
(1)歸一化函數——mapminmax
函數mapminmax用於將值歸一化到指定的范圍內,一般是[-1, 1],其調用格式為
[Y, PS] = mapminmax(X, YMIN, YMAX)
其中,Y歸一化后的輸出結果;PS是訓練樣本的數據的映射;X為要歸一化的函數(測試樣本);YMIN為歸一化后的最小值;YMAX為歸一化后的最大值。
Y = mapminmax(‘apply’, X, PS),應用PS歸一化的信息,對Test集(X)進行歸一化
反歸一化:
X = mapminmax(‘reverse’, Y, PS),是預處理之后的數據進行反轉得到原始數據
(2)BP網絡創建函數——newff(Create feed-forward backpropagation network)
函數 newff 用於創建一個BP神經網絡,其調用格式為 # feed-forward 前饋
net = newff(P, T, [S1 S2 ... S(N-1)], {TF1, TF2 ... TFN}, BTF, BLF, PF, IPF, OPF, DDF)
其中,P為輸入向量;T為輸出向量;Si為隱含層神經元數目(默認為空);TFi為傳遞函數,(默認隱含層傳遞函數為tansig(雙極S型函數),輸出層傳遞函數為purelin);BTF為網絡訓練函數(默認為trianlm);BLF為網絡權值/閾值學習函數(默認為learngdm);PF為性能函數(默認為mse(誤差平方函數));IPE為輸入處理函數(默認為{‘fixunknowns’,‘removeconstantrows’,‘mapminmax’});OPF為輸出處理函數(默認為{‘removeconstantrows’,‘mapminmax’});DDF為數據划分函數(默認為‘dividerand’)
(3)訓練函數——trian
函數 train 用於訓練已經創建好的BP神經網絡,其調用格式為
[net, tr, Y, E, Pf, Af] = train(net, P, T, Pi, Ai)
其中,net為訓練前及訓練后的網絡;P為網絡輸入向量;T為網絡目標向量(默認為0);Pi為初始的輸入層延遲條件(默認為0);Ai為初始的輸出層延遲條件(默認為0);tr為訓練記錄(包含步數及性能);Y為網絡輸出向量;E為網絡誤差向量;Pf為最終的輸入層延遲條件;Af為最終是輸出層延遲條件。
(4)預測函數——sim
函數 sim 用於利用已經訓練好的BP神經網絡進行仿真預測,其調用格式為
[Y, Pf, Af, E, perf] = sim(net, P, Pi, Ai, T)
其中,net為訓練好的網絡;P為網絡輸入向量;Pi為初始的輸入層延遲條件(默認為0);Ai為初始的隱藏層延遲條件(默認為0);T為網絡目標向量(默認為0);Y為網絡輸出向量;Pf為最終的輸入層延遲條件;Af為最終的隱含層延遲條件;E為網絡誤差向量;perf為網絡的性能
7、參數對BP神經網絡性能的影響
(1)隱藏層神經元節點個數
(2)激活函數類型的選擇
(3)學習率
(4)初始權值和閾值
(5)如何選取好的神經元個數的方法(或者換個問題能適應訓練集並不代表能夠適應一般情況,所以我們需要選擇交叉驗證集來選擇模型。)
(1)交叉驗證(cross validation)=訓練集(training set)(訓練|經驗誤差)+驗證集(validation set)+測試集(泛化誤差)(testing set)
交叉驗證先將數據集D划分為k個大小相似的互斥子集。每個子集Di都盡可能保持數據分布的一致性,即從D中通過分層采樣得到。然后,每次用k-1個子集的並集作為訓練集+,余下的那個子集作為測試集;這樣就可獲得k組訓練|測試集,從而可進行k次訓練和測試,最終返回k次測試結果的均值(k折交叉驗證)。K折交叉驗證通常要隨機使用不同的划分重復p次,最終的評估結果是這p次k折交叉驗證結果的均值。(((((隨機划分一般使用60%+20%+20%的分配方式。
- 使用訓練集訓練出10個模型
- 用10個模型分別對交叉驗證集計算得出交叉驗證誤差(代價函數的值)
- 選取代價函數數值最小的模型
- 用步驟c中選出的模型對測試集計算得出推廣誤差(代價函數的值)
lamda值較小時(對應着訓練集誤差小),是方差|過擬合問題,,反之亦然。
1、嘗試獲取更多的訓練實例——解決高方差|過擬合
2、嘗試減少特征的數量——解決高方差|過擬合
3、嘗試增加正則化程度lamda——解決高方差|過擬合
4、嘗試獲得更多的特征數量——解決高偏差|欠擬合
5、嘗試增加特征多項式的特征——解決高偏差|欠擬合
6、嘗試減小正則化程度lamda——解決高偏差|欠擬合
(2)留一法(Leave one out, LOO)(適合少量樣本)
假設數據集中包含m個樣本,若令k=m,則得到了交叉驗證法的一個特例,它不受隨機樣本划分方式的影響,因為m個樣本只有唯一的方式划分為m個子集——每個子集包含一個樣本。
執行newff函數創建網絡:
functions:
adaptFcn: 'adaptwb'
adaptParam: (none)
derivFcn: 'defaultderiv'
divideFcn: 'dividerand'
divideParam: .trainRatio, .valRatio, .testRatio
divideMode: 'sample'
initFcn: 'initlay'
performFcn: 'mse' %均方根誤差,性能參數
performParam: .regularization, .normalization
plotFcns: {'plotperform', plottrainstate,
plotregression}
plotParams: {1x3 cell array of 3 params}
trainFcn: 'trainlm'
trainParam: .showWindow, .showCommandLine, .show, .epochs,
.time, .goal, .min_grad, .max_fail, .mu, .mu_dec,
.mu_inc, .mu_max
輸入層與隱含層的連接權值
weight and bias values:
IW: {2x1 cell} containing 1 input weight matrix %輸入層與隱含層的連接權值
LW: {2x2 cell} containing 1 layer weight matrix %隱含層與輸出層的連接權值
b: {2x1 cell} containing 2 bias vectors %閾值
Doc traingdx 神經網絡的訓練方法:traingd | traingda | traingdm | trainlm:(gd)梯度下降法|(gda)帶自適應學習率的梯度下降法|(gdm)帶動量和自適應的梯度下降達|LM算法
程序代碼;
%% I. 清空環境變量
clear all
clc
%% II. 訓練集/測試集產生
%%
% 1. 導入數據
load spectra_data.mat
%%
% 2. 隨機產生訓練集和測試集
temp = randperm(size(NIR,1)); %size(NIR, 1)返回樣本數;randperm產生由1-60的隨機排列的數列
% 訓練集——50個樣本
P_train = NIR(temp(1:50),:)'; %轉置,保證列代表訓練集的樣本個數,行代表變量特征的個數
T_train = octane(temp(1:50),:)';
% 測試集——10個樣本
P_test = NIR(temp(51:end),:)';
T_test = octane(temp(51:end),:)';
N = size(P_test,2); %取出測試集樣本的個數
%% III. 數據歸一化
[p_train, ps_input] = mapminmax(P_train,0,1); % 對訓練集的輸入樣本進行歸一化
p_test = mapminmax('apply',P_test,ps_input); %應用歸一化的信息(ps_input)將測試集輸入樣本歸一化
[t_train, ps_output] = mapminmax(T_train,0,1); % 對訓練集的輸出也歸一化
%% IV. BP神經網絡創建、訓練及仿真測試
%%
% 1. 創建網絡
net = newff(p_train,t_train,9); % 隱含層神經元個數為9,這里是單隱含層
%%
% 2. 設置訓練參數
net.trainParam.epochs = 1000; % 迭代次數
net.trainParam.goal = 1e-3; % 訓練目標,均方根誤差小於0.001
net.trainParam.lr = 0.01; % 學習率
%%
% 3. 訓練網絡
net = train(net,p_train,t_train);
%%
% 4. 仿真測試
t_sim = sim(net,p_test);
%%
% 5. 數據反歸一化
T_sim = mapminmax('reverse',t_sim,ps_output);
%% V. 性能評價
%%
% 1. 相對誤差error
error = abs(T_sim - T_test)./T_test;
%%
% 2. 決定系數R^2
R2 = (N * sum(T_sim .* T_test) - sum(T_sim) * sum(T_test))^2 / ((N * sum((T_sim).^2) - (sum(T_sim))^2) * (N * sum((T_test).^2) - (sum(T_test))^2));
%%
% 3. 結果對比
result = [T_test' T_sim' error']
%% VI. 繪圖
figure
plot(1:N,T_test,'b:*',1:N,T_sim,'r-o')
legend('真實值','預測值')
xlabel('預測樣本')
ylabel('辛烷值')
string = {'測試集辛烷值含量預測結果對比';['R^2=' num2str(R2)]};
title(string)