?? 文章首發(fā)于我的個人博客:歡迎大佬們來逛逛
BP神經(jīng)網(wǎng)絡(luò)
算法流程
設(shè) x 1 , x 2 , . . . , x i x_1,x_2,...,x_i x1?,x2?,...,xi? 為輸入變量, y y y 為輸出變量, u j u_j uj? 為隱藏層神經(jīng)元的輸出, f 為激活函數(shù)的映射關(guān)系。
設(shè) v i j v_{ij} vij? 為第 i i i 個輸入變量與第 j j j 個隱藏層神經(jīng)元的權(quán)重。
設(shè) w j w_{j} wj? 為第 j j j 個隱藏層神經(jīng)元與 最終輸出結(jié)果 y y y 的權(quán)重。
- 建立激活函數(shù):常見的有 s i g m o d sigmod sigmod 激活函數(shù),當(dāng)然還有其他的激活函數(shù),例如 t a n h tanh tanh 函數(shù) 與 R e L U ReLU ReLU 函數(shù)
s i g m o d 激活函數(shù): f ( x ) = 1 1 + e ? x sigmod激活函數(shù):f(x)=\frac1{1+e^{-x}} sigmod激活函數(shù):f(x)=1+e?x1?
R e L U 激活函數(shù): f ( x ) = { x ? i f ? x > 0 0 ? i f ? x < 0 ReLU 激活函數(shù): \begin{aligned}f(x)=&\begin{cases}\mathrm{x}&\mathrm{~if~}x>0\\0&\mathrm{~if~}x<0&\end{cases}{}&\end{aligned} ReLU激活函數(shù):f(x)=?{x0??if?x>0?if?x<0????
- 進(jìn)行正向傳播,正向傳播的公式如下
u j = f ( ∑ i = 1 n ν i j x i + θ j u ) j = 1 , 2 , … , m y = f ( ∑ j = 1 m w j u j + θ y ) \begin{aligned}u_j&=f\big(\sum_{i=1}^n\nu_{ij}x_i+\theta_j^u\big)j=1,2,\ldots,m\\y&=f(\sum_{j=1}^mw_ju_j+\theta^y)\end{aligned} uj?y?=f(i=1∑n?νij?xi?+θju?)j=1,2,…,m=f(j=1∑m?wj?uj?+θy)?
- 我們最終想要得到的目標(biāo)為真實值與通過網(wǎng)絡(luò)預(yù)測值之間誤差盡可能小,目標(biāo)函數(shù)設(shè)定為:
- 其中真實輸出值是 y ^ \hat y y^? ,預(yù)測輸出值是: y y y,我們希望他們的差值平方求和盡可能小。
J = ∑ k ( y ( k ) ? y ^ ( k ) ) 2 J=\sum_k{(y^{(k)}-\hat y^{(k)})^2} J=k∑?(y(k)?y^?(k))2
b. 改變一下形式,拿出第 k k k 個對象做目標(biāo),再把所有對象總和作為最終目標(biāo), x i k x_i^{k} xik? 代表第i個特征的輸入:
J ( k ) = ( y ( k ) ? y ^ ( k ) ) 2 J^{(k)}=(y^{(k)}-\hat y^{(k)})^2 J(k)=(y(k)?y^?(k))2
- 進(jìn)行梯度下降法的反向傳播,運用鏈?zhǔn)角髮?dǎo)法則。
- 參數(shù)的優(yōu)化:
v i j ′ = v i j ? μ ? J ? v i j w j ′ = w j ? μ ? J ? w j \begin{aligned}v_{ij}^{\prime}&=v_{ij}-\mu\frac{\partial J}{\partial v_{ij}}\\\\w_j^{\prime}&=w_j-\mu\frac{\partial J}{\partial w_j}\end{aligned} vij′?wj′??=vij??μ?vij??J?=wj??μ?wj??J??
- 得到最優(yōu)參數(shù) v v v 和 w w w 以后,就可以獲取模型,然后預(yù)測輸出。
代碼實現(xiàn)
function [ret_y_test_data,ret_BP_predict_data] = mfunc_BPnetwork(data,hiddenLayers,gradientDescentMethods)
% BP神經(jīng)網(wǎng)絡(luò)算法
% params:
% data:原始數(shù)據(jù),Shape:(m,n) 需要從m行中抽取一部分作為test,剩下的作為train。第n列為預(yù)測結(jié)果
% hiddenLayers: newff函數(shù)所需要做的神經(jīng)網(wǎng)絡(luò)模型的隱藏層個數(shù)及每層數(shù)量,例如:[6,6,6] 三個隱藏層,每層6個數(shù)據(jù)
% gradientDescentMethods:每個隱藏層所需要的梯度下降算法,需要與hiddenLayers的數(shù)量一致,例如:{'logsig','tansig','logsig'};必須使用花括號
% returns:
% ret_y_test_data:實際測試數(shù)據(jù)
% ret_BP_predict_data:預(yù)測數(shù)據(jù)
[m,n]=size(data);
% 劃分訓(xùn)練集與測試集
train_num=round(0.8*m); % 劃分?jǐn)?shù)量
x_train_data=data(1:train_num,1:n-1);
y_train_data=data(1:train_num,n); % 第n列表表示預(yù)測結(jié)果
x_test_data=data(train_num+1:end,1:n-1);
y_test_data=data(train_num+1:end,n);
% 標(biāo)準(zhǔn)化 mapminmax對行操作,需要轉(zhuǎn)置
x_train_data=x_train_data';
y_train_data=y_train_data';
x_test_data=x_test_data';
% x_train_maxmin與y_train_maxmin用于以后復(fù)原
[x_train_regular,x_train_maxmin] = mapminmax(x_train_data,0,1);
[y_train_regular,y_train_maxmin] = mapminmax(y_train_data,0,1);
% 創(chuàng)建網(wǎng)絡(luò)
t1=clock;
net=newff(x_train_regular,y_train_regular,hiddenLayers,gradientDescentMethods);
% net=newff(x_train_regular,y_train_regular,[6,3,3],{'logsig','tansig','logsig','purelin'});
% net=newff(x_train_regular,y_train_regular,6,{'logsig','logsig'});
% net=newff(x_train_regular,y_train_regular,6,{'logsig','purelin'});
% net=newff(x_train_regular,y_train_regular,6,{'logsig','tansig'});
% %設(shè)置訓(xùn)練次數(shù)
% net.trainParam.epochs = 50000;
% %設(shè)置收斂誤差
% net.trainParam.goal=0.000001;
% newff(P,T,S,TF,BTF,BLF,PF,IPF,OPF,DDF) takes optional inputs,
% TF- Transfer function of ith layer. Default is 'tansig' for
% hidden layers, and 'purelin' for output layer.
%%激活函數(shù)的設(shè)置
% compet - Competitive transfer function.
% elliotsig - Elliot sigmoid transfer function.
% hardlim - Positive hard limit transfer function.
% hardlims - Symmetric hard limit transfer function.
% logsig - Logarithmic sigmoid transfer function.
% netinv - Inverse transfer function.
% poslin - Positive linear transfer function.
% purelin - Linear transfer function.
% radbas - Radial basis transfer function.
% radbasn - Radial basis normalized transfer function.
% satlin - Positive saturating linear transfer function.
% satlins - Symmetric saturating linear transfer function.
% softmax - Soft max transfer function.
% tansig - Symmetric sigmoid transfer function.
% tribas - Triangular basis transfer function.
%訓(xùn)練網(wǎng)絡(luò)
[net,~]=train(net,x_train_regular,y_train_regular);
%%
%將輸入數(shù)據(jù)歸一化
% 利用x_train_maxmin來對x_test_data進(jìn)行標(biāo)準(zhǔn)化
x_test_regular = mapminmax('apply',x_test_data,x_train_maxmin);
%放入到網(wǎng)絡(luò)輸出數(shù)據(jù)
y_test_regular=sim(net,x_test_regular);
%將得到的數(shù)據(jù)反歸一化得到預(yù)測數(shù)據(jù)
BP_predict=mapminmax('reverse',y_test_regular,y_train_maxmin);
%%
BP_predict=BP_predict';
errors_nn=sum(abs(BP_predict-y_test_data)./(y_test_data))/length(y_test_data);
t2=clock;
Time_all=etime(t2,t1);
disp(['運行時間:',num2str(Time_all)])
figure;
color=[111,168,86;128,199,252;112,138,248;184,84,246]/255;
plot(y_test_data,'Color',color(2,:),'LineWidth',1)
ret_y_test_data = y_test_data;
hold on
plot(BP_predict,'*','Color',color(1,:))
ret_BP_predict_data = BP_predict;
hold on
titlestr=['MATLAB自帶newff神經(jīng)網(wǎng)絡(luò)',' 誤差為:',num2str(errors_nn)];
title(titlestr)
disp(titlestr)
end
神經(jīng)網(wǎng)絡(luò)的超參數(shù)優(yōu)化
使用 fitrnet
可以進(jìn)行神經(jīng)網(wǎng)絡(luò)的超參數(shù)優(yōu)化。
具體步驟如下:使用貝葉斯方法進(jìn)行超參數(shù)優(yōu)化
- OptimizeHyperparameters:auto
- HyperparameterOptimizationOptions:struct(“AcquisitionFunctionName”,“expected-improvement-plus”,‘MaxObjectiveEvaluations’,optimize_num)
- optimize_num:設(shè)置一個優(yōu)化次數(shù)
Mdl = fitrnet(x_train_regular,y_train_regular,"OptimizeHyperparameters","auto", ...
"HyperparameterOptimizationOptions",struct("AcquisitionFunctionName","expected-improvement-plus",'MaxObjectiveEvaluations',optimize_num))
其他與上面完全一樣
代碼實現(xiàn)
function mfunc_BP_OptimizedNetwork(data,optimize_num)
% 神經(jīng)網(wǎng)絡(luò)的超參數(shù)優(yōu)化
%
[m,n]=size(data);
train_num=round(0.8*m);
% 獲取訓(xùn)練集與測試集
x_train_data=data(1:train_num,1:n-1);
y_train_data=data(1:train_num,n);
x_test_data=data(train_num+1:end,1:n-1);
y_test_data=data(train_num+1:end,n);
% 需要一次轉(zhuǎn)置,mapminmax對行操作,并且返回的是轉(zhuǎn)置后的
[x_train_regular,x_train_maxmin] = mapminmax(x_train_data');
[y_train_regular,y_train_maxmin] = mapminmax(y_train_data');
% 將標(biāo)準(zhǔn)化后的訓(xùn)練集轉(zhuǎn)置回來
x_train_regular=x_train_regular';
y_train_regular=y_train_regular';
% 自定義優(yōu)化次數(shù)
% optimize_num = 5;
% fitrnet 使用貝葉斯方法進(jìn)行優(yōu)化
Mdl = fitrnet(x_train_regular,y_train_regular,"OptimizeHyperparameters","auto", ...
"HyperparameterOptimizationOptions",struct("AcquisitionFunctionName","expected-improvement-plus",'MaxObjectiveEvaluations',optimize_num));
% 導(dǎo)入測試集,進(jìn)行測試集的標(biāo)準(zhǔn)化,同樣x_test_data需要轉(zhuǎn)置,并且我們指定它進(jìn)行與訓(xùn)練集x執(zhí)行相同的標(biāo)準(zhǔn)化
x_test_regular = mapminmax('apply',x_test_data',x_train_maxmin);
x_test_regular=x_test_regular';
% 數(shù)據(jù)預(yù)測predict:放入到網(wǎng)絡(luò)輸出數(shù)據(jù),得到 經(jīng)過標(biāo)準(zhǔn)化后的預(yù)測結(jié)果
y_test_regular=predict(Mdl,x_test_regular);
% 將得到的數(shù)據(jù)反標(biāo)準(zhǔn)化得到真正的預(yù)測數(shù)據(jù)
BP_predict=mapminmax('reverse',y_test_regular,y_train_maxmin);
% 可視化與輸出
errors_nn=sum(abs(BP_predict-y_test_data)./(y_test_data))/length(y_test_data);
figure;
color=[111,168,86;128,199,252;112,138,248;184,84,246]/255;
plot(y_test_data,'Color',color(2,:),'LineWidth',1)
hold on
plot(BP_predict,'*','Color',color(1,:))
hold on
titlestr=['MATLAB自帶優(yōu)化神經(jīng)網(wǎng)絡(luò)',' 誤差為:',num2str(errors_nn)];
title(titlestr)
disp(titlestr)
end
神經(jīng)網(wǎng)絡(luò)的分類
分類問題:輸出結(jié)果固定為 1,2,3等某一類。文章來源:http://www.zghlxwxcb.cn/news/detail-680377.html
最后可以得到準(zhǔn)確率文章來源地址http://www.zghlxwxcb.cn/news/detail-680377.html
clc;clear;close all;
load('iri_data.mat')
data=(iri_data);
%% 看數(shù)據(jù)分布
train_num=round(0.8*size(data,1));%取整個數(shù)據(jù)0.8的比例訓(xùn)練,其余作為測試數(shù)據(jù)
choose=randperm(size(data,1));
train_data=data(choose(1:train_num),:);
test_data=data(choose(train_num+1:end),:);
n=size(data,2);
y=train_data(:,n);
x=train_data(:,1:n-1);
optimize_num=5;
% 使用貝葉斯網(wǎng)絡(luò)進(jìn)行優(yōu)化
Mdl = fitcnet(x,y,"OptimizeHyperparameters","auto", ...
"HyperparameterOptimizationOptions",struct("AcquisitionFunctionName","expected-improvement-plus",'MaxObjectiveEvaluations',optimize_num));
%% 測試一下效果
% x_test_regular = mapminmax('apply',x_test_data,x_train_maxmin);
% x_test_regular=x_test_regular';
%放入到網(wǎng)絡(luò)輸出數(shù)據(jù)
y_test_regular=predict(Mdl,test_data(:,1:end-1));
y_test_ture=test_data(:,end);
%%
accuracy=length(find(y_test_regular==y_test_ture))/length(y_test_ture);
disp('準(zhǔn)確率為:')
disp(accuracy)
|============================================================================================================================================|
| Iter | Eval | Objective | Objective | BestSoFar | BestSoFar | Activations | Standardize | Lambda | LayerSizes |
| | result | | runtime | (observed) | (estim.) | | | | |
|============================================================================================================================================|
| 1 | Best | 0.17241 | 1.5495 | 0.17241 | 0.17241 | relu | false | 1.1049e-05 | 1 |
| 2 | Best | 0.068966 | 8.2032 | 0.068966 | 0.073079 | sigmoid | true | 1.7483e-06 | [236 45 2] |
| 3 | Accept | 0.63793 | 0.18258 | 0.068966 | 0.08784 | relu | true | 82.744 | [295 41] |
| 4 | Accept | 0.63793 | 0.097396 | 0.068966 | 0.092718 | none | true | 193.49 | 11 |
| 5 | Best | 0.060345 | 6.157 | 0.060345 | 0.062326 | sigmoid | true | 3.6739e-06 | [211 51 5] |
__________________________________________________________
優(yōu)化完成。
達(dá)到 MaxObjectiveEvaluations 5。
函數(shù)計算總次數(shù): 5
總歷時: 19.1325 秒
總目標(biāo)函數(shù)計算時間: 16.1897
觀測到的最佳可行點:
Activations Standardize Lambda LayerSizes
___________ ___________ __________ _________________
sigmoid true 3.6739e-06 211 51 5
觀測到的目標(biāo)函數(shù)值 = 0.060345
估計的目標(biāo)函數(shù)值 = 0.062326
函數(shù)計算時間 = 6.157
估計的最佳可行點(根據(jù)模型):
Activations Standardize Lambda LayerSizes
___________ ___________ __________ _________________
sigmoid true 3.6739e-06 211 51 5
估計的目標(biāo)函數(shù)值 = 0.062326
估計的函數(shù)計算時間 = 6.2702
準(zhǔn)確率為:
0.8966
到了這里,關(guān)于數(shù)學(xué)建模:BP神經(jīng)網(wǎng)絡(luò)模型及其優(yōu)化的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!