MATLAB机器学习系列-3:BP神经网络算例实现
BP神經網絡
BP神經網絡是前連接神經網絡中的一種,BP指的是訓練方法是誤差反向傳播Backpropagation,要求激活函數是可導的。
數據歸一化
-
什么是歸一化?
將數據映射到[0, 1]或[-1, 1]區間或其他的區間
-
為什么要歸一化?
輸入數據的單位不一樣,有些數據的范圍可能特別大,導致的結果是神經網絡收斂慢、訓練時間長。數據范圍大的輸入在模式分類中的作用可能會偏大,而數據范圍小的輸入作用就可能會偏小。
由于神經網絡輸出層的激活函數的值域是有限制的,因此需要將網絡訓練的目標數據映射到激活函數的值域。例如神經網絡的輸出層若采用S形激活 函數,由于S形函數的值域限制在(0,1),也就是說神經網絡的輸出只能限制在(0,1),所以訓練數據的輸出就要歸一化到[0,1]區間。
S形激活函數在(0,1)區間以外區域很平緩,區分度太小。例如S形函數f(X)在參數a=1時,f(100)與f(5)只相差0.0067。
-
歸一化算法
重點函數介紹
歸一化函數(mapminmax)
功能:將矩陣的每一行處理成[-1,1]區間。處理需要歸一化的m*n矩陣X,歸一化后的矩陣記為Y。
主要有5種調用形式
- 1.[Y,PS] = mapminmax(X,YMIN,YMAX)
其中,YMIN是我們期望歸一化后矩陣Y每行的最小值,YMAX是我們期望歸一化后矩陣Y每行的最大值。
例1:待處理矩陣X=[4 5 6;7 8 9]我們期望歸一化后每行的最小值為0,最大值為1.程序如下
運行結果
- 2.[Y,PS] = mapminmax(X,FP)
FP是一個結構體成員,主要是FP.ymin(相當于YMIN), FP.ymax(相當于YMAX)。1和2處理效果一樣,只不過參數的帶入形式不同。
- Y = mapminmax(‘apply’,X,PS)
PS是訓練樣本的映射,測試樣本的預處理方式應與訓練樣本相同。只需將映射PS apply到測試樣本。
例3.訓練樣本是X,測試樣本是M,歸一化后的訓練樣本是Y
X=[4 5 6;7 8 9];M = [2 3;4 5];[Y,PS] = mapminmax(X,0,1);mapminmax('apply',M,PS)- X = mapminmax(‘reverse’,Y,PS)
將歸一化后的Y反轉為歸一化之前
例4.將n(M的歸一化)反轉為M
X=[4 5 6;7 8 9]; M = [2 3;4 5]; [Y,PS] = mapminmax(X,0,1); n = mapminmax('apply',M,PS); mapminmax('reverse',n,PS)newff (前饋反向傳播網絡)
newff函數參數說明
P:輸入參數矩陣。(RxQ1),其中Q1代表R元的輸入向量。其數據意義是矩陣P有Q1列,每一列都是一個樣本,而每個樣本有R個屬性(特征)。一般矩陣P需要歸一化,即P的每一行都歸一化到[0 1]或者[-1 1]。
T:目標參數矩陣。(SNxQ2),Q2代表SN元的目標向量。
S:N-1個隱含層的數目(S(i)到S(N-1)),默認為空矩陣[]。輸出層的單元數目SN取決于T。返回N層的前饋BP神經網絡
TF:相關層的傳遞函數,默認隱含層為tansig函數,輸出層為purelin函數。
BTF:BP神經網絡學習訓練函數,默認值為trainlm函數。
BLF:權重學習函數,默認值為learngdm。
PF:性能函數,默認值為mse,可選擇的還有sse,sae,mae,crossentropy。
IPF,OPF,DDF均為默認值即可。
2,傳遞函數TF
purelin: 線性傳遞函數。
tansig :正切S型傳遞函數。
logsig :對數S型傳遞函數?!?br /> 隱含層和輸出層函數的選擇對BP神經網絡預測精度有較大影響,一般隱含層節點轉移函數選用 tansig函數或logsig函數,輸出層節點轉移函數選用tansig函數或purelin函數。
3,學習訓練函數BTF
traingd:最速下降BP算法。
traingdm:動量BP算法。
trainda:學習率可變的最速下降BP算法。
traindx:學習率可變的動量BP算法。
trainrp:彈性算法。
變梯度算法:
traincgf(Fletcher-Reeves修正算法)
traincgp(Polak_Ribiere修正算法)
traincgb(Powell-Beale復位算法)
trainbfg(BFGS 擬牛頓算法)
trainoss(OSS算法)
4,參數說明
通過net.trainParam可以查看參數
Show Training Window Feedback showWindow: true
Show Command Line Feedback showCommandLine: false
Command Line Frequency show: 兩次顯示之間的訓練次數
Maximum Epochs epochs: 訓練次數
Maximum Training Time time: 最長訓練時間(秒)
Performance Goal goal: 網絡性能目標
Minimum Gradient min_grad: 性能函數最小梯度
Maximum Validation Checks max_fail: 最大驗證失敗次數
Learning Rate lr: 學習速率
Learning Rate Increase lr_inc: 學習速率增長值
Learning Rate lr_dec: 學習速率下降值
Maximum Performance Increase max_perf_inc:
Momentum Constant mc: 動量因子
算例實現
案例背景
第一步:清空環境變量
%% I. 清空環境變量 clear all clc第二步:讀取數據
%% II. 訓練集/測試集產生 %% % 1. 導入數據 load spectra_data.mat查看數據
輸入
輸入數據有60個樣本,每個樣本401維
輸出
輸出數據60個樣本,每個樣本1維
第三步:訓練集測試集劃分
%% % 2. 隨機產生訓練集和測試集 temp = randperm(size(NIR,1));%size(NIR,1)樣本個數 表示將樣本順序打亂 % 訓練集——50個樣本 P_train = NIR(temp(1:50),:)';%前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);%N=10解釋
randperm(5)這個例子將1~5順序隨機打亂。
temp = randperm(size(NIR,1)); 表示將樣本順序打亂,產生1-60的隨機序列
P_train = NIR(temp(1:50)😅 取出前50個,P代表輸入,有轉置符號,matlab里面輸入和輸出必須保證列相同。python里面必須保證行相同。
第四步:歸一化
%% III. 數據歸一化 [p_train, ps_input] = mapminmax(P_train,0,1); p_test = mapminmax('apply',P_test,ps_input); %訓練集輸出歸一化 [t_train, ps_output] = mapminmax(T_train,0,1);打印下
plot(p_train(1,:))
輸入50列
輸出50列
第五步:模型搭建
%% IV. BP神經網絡創建、訓練及仿真測試 %% % 1. 創建網絡 net = newff(p_train,t_train,9);%% % 2. 設置訓練參數 net.trainParam.epochs = 1000;%迭代次數 net.trainParam.goal = 1e-3;%訓練目標mse小于目標才會結束 net.trainParam.lr = 0.01;%學習率%% % 3. 訓練網絡 net = train(net,p_train,t_train);newff 前饋神經網絡
newff(p_train,t_train,9); 參數:輸入,輸出,隱含神經元個數
輸入net可查看模型
train神經網絡訓練函數
訓練運行界面
訓練運行界面點擊performance
訓練運行界面點擊Training state
訓練運行界面點擊 Regression 回歸結果
第六步:仿真測試
sim:神經網絡仿真函數
第七步:結果反歸一化
%% % 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)全文代碼
main.m
代碼和數據百度云
鏈接:https://pan.baidu.com/s/1zf1o-B1FQsV7cXKbz4y4VA 提取碼:srx8 復制這段內容后打開百度網盤手機App,操作更方便哦MATLAB我還是嫌棄的不行。不喜歡matlab語法,再者尼瑪,提示符都沒有
matlab BP更多用法
下面命令將創建一個二層網絡。它的輸入是兩個元素的向量,第一層有三個神經元(3),第二層有一個神經元(1)。第一層的傳遞函數是tan-sigmoid,輸出層的傳遞函數是linear。輸入向量的第一個元素的范圍是-1到2[-1 2],輸入向量的第二個元素的范圍是0到5[0 5],訓練函數是traingd。
net=newff([-1 2; 0 5],[3,1],{'tansig','purelin'},'traingd');參數學習
net = newff(minmax§,[隱層的神經元的個數,輸出層的神經元的個數],{隱層神經元的傳輸函數,輸出層的傳輸函數},‘反向傳播的訓練函數’),其中p為輸入數據,t為輸出數據
1、tf為神經網絡的傳輸函數,默認為’tansig’函數為隱層的傳輸函數,
2、purelin函數為輸出層的傳輸函數
%TF1 = ‘tansig’;TF2 = ‘logsig’;
%TF1 = ‘logsig’;TF2 = ‘purelin’;
%TF1 = ‘logsig’;TF2 = ‘logsig’;
%TF1 = ‘purelin’;TF2 = ‘purelin’;
TF1=‘tansig’;TF2=‘purelin’;
net=newff(minmax(p),[10,1],{TF1 TF2},'traingdm');%網絡創建網絡參數的設置
net.trainParam.epochs=10000;%訓練次數設置net.trainParam.goal=1e-7;%訓練目標設置net.trainParam.lr=0.01;%學習率設置,應設置為較少值,太大雖然會在開始加快收斂速度,但臨近最佳點時,會產生動蕩,而致使無法收斂net.trainParam.mc=0.9;%動量因子的設置,默認為0.9net.trainParam.show=25;%顯示的間隔次數指定訓練參數
net.trainFcn = 'traingd'; % 梯度下降算法net.trainFcn = 'traingdm'; % 動量梯度下降算法net.trainFcn = 'traingda'; % 變學習率梯度下降算法net.trainFcn = 'traingdx'; % 變學習率動量梯度下降算法% (大型網絡的首選算法)net.trainFcn = 'trainrp'; % RPROP(彈性BP)算法,內存需求最小% 共軛梯度算法net.trainFcn = 'traincgf'; %Fletcher-Reeves修正算法net.trainFcn = 'traincgp'; %Polak-Ribiere修正算法,內存需求比Fletcher-Reeves修正算法略大net.trainFcn = 'traincgb'; % Powell-Beal復位算法,內存需求比Polak-Ribiere修正算法略大% (大型網絡的首選算法)net.trainFcn = 'trainscg'; % ScaledConjugate Gradient算法,內存需求與Fletcher-Reeves修正算法相同,計算量比上面三種算法都小很多net.trainFcn = 'trainbfg'; %Quasi-Newton Algorithms - BFGS Algorithm,計算量和內存需求均比共軛梯度算法大,但收斂比較快net.trainFcn = 'trainoss'; % OneStep Secant Algorithm,計算量和內存需求均比BFGS算法小,比共軛梯度算法略大% (中型網絡的首選算法)net.trainFcn = 'trainlm'; %Levenberg-Marquardt算法,內存需求最大,收斂速度最快net.trainFcn = 'trainbr'; % 貝葉斯正則化算法有代表性的五種算法為:'traingdx','trainrp','trainscg','trainoss', 'trainlm'%在這里一般是選取'trainlm'函數來訓練,其算對對應的是Levenberg-Marquardt算法訓練
net=train(net,pt,t)作者:電氣工程的計算機萌新-余登武
總結
以上是生活随笔為你收集整理的MATLAB机器学习系列-3:BP神经网络算例实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 卫生间淋浴区防水高度(卫生间防水高度)
- 下一篇: 胃出血的主要原因(胃出血的病因 胃出血是