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