日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MATLAB机器学习系列-3:BP神经网络算例实现

發布時間:2024/9/30 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.程序如下
X=[4 5 6;7 8 9];mapminmax(X,0,1)

運行結果

  • 2.[Y,PS] = mapminmax(X,FP)
    FP是一個結構體成員,主要是FP.ymin(相當于YMIN), FP.ymax(相當于YMAX)。1和2處理效果一樣,只不過參數的帶入形式不同。
X=[4 5 6;7 8 9];FP.ymin = 0;FP.ymax = 1;mapminmax(X,FP)
  • 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函數參數說明

net = newff(P,T,S) % 這兩種定義都可以 net = newff(P,T,S,TF,BTF,BLF,PF,IPF,OPF,DDF)

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型傳遞函數。 
  隱含層和輸出層函數的選擇對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維

plot(NIR')

輸出
輸出數據60個樣本,每個樣本1維

plot(octane')

第三步:訓練集測試集劃分

%% % 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:神經網絡仿真函數

%% % 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)

全文代碼
main.m

%% I. 清空環境變量 clear all clc%% II. 訓練集/測試集產生 %% % 1. 導入數據 load spectra_data.mat%% % 2. 隨機產生訓練集和測試集 temp = randperm(size(NIR,1)); % 訓練集——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);[t_train, ps_output] = mapminmax(T_train,0,1);%% IV. BP神經網絡創建、訓練及仿真測試 %% % 1. 創建網絡 net = newff(p_train,t_train,9);%% % 2. 設置訓練參數 net.trainParam.epochs = 1000; net.trainParam.goal = 1e-3; 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)

代碼和數據百度云

鏈接: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神经网络算例实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。