MATLAB實體:BP神經網路用于回歸(非線性擬合)任務
作者:凱魯嘎吉 - 博客園 http://www.cnblogs.com/kailugaji/
問題描述
給定多元(多維)資料X,有真實結果Y,對這些資料進行擬合(回歸),得到擬合函式的引數,進而得到擬合函式,現在進來一些新樣本,對這些新樣本進行預測出相應地Y值,通常的最小二乘法進行線性擬合并不適用于所有資料,對于大多數資料而言,他們的擬合函式是非線性的,人為構造擬合函式相當困難,沒有一定的經驗積累很難完美的構造出符合條件的擬合函式,因此神經網路在這里被應用來做回歸(擬合)任務,進一步用來預測,神經網路是很強大的擬合工具,雖然數學可解釋性差,但擬合效果好,因而得到廣泛應用,BP神經網路是最基礎的網路結構,輸入層,隱層,輸出層,三層結構,如下圖所示,

整體的目標函式就是均方誤差
$L=||f(X)-Y||_{2}^{2}$
其中(激活函式可以自行設定)
$f(X)=purelin\left( {{W}_{2}}\cdot \tan sig({{W}_{1}}\cdot X+{{b}_{1}})+{{b}_{2}} \right)$
$N$: 輸入資料的個數
$D$: 輸入資料的維度
${{D}_{1}}$: 隱層節點的個數
$X$: 輸入資料($D$*$N$)
$Y$: 真實輸出(1*$N$)
${{W}_{1}}$: 輸入層到隱層的權值(${{D}_{1}}$*$D$)
${{b}_{1}}$: 隱層的偏置(${{D}_{1}}$*1)
${{W}_{2}}$: 輸入層到隱層的權值(1*${{D}_{1}}$)
${{b}_{2}}$: 隱層的偏置(1*1)
通過給定訓練資料與訓練標簽來訓練網路的權值與偏置,進一步得到擬合函式$f(X)$,這樣,來了新資料后,直接將新資料X代入函式$f(X)$,即可得到預測的結果,
MATLAB程式
用到的資料為UCI資料庫的housing資料:https://archive.ics.uci.edu/ml/machine-learning-databases/housing/
輸入資料,最后一列是真實的輸出結果,將資料打亂順序,95%的作為訓練集,剩下的作為測驗集,這里隱層節點數為20,
BP_kailugaji.m
function errorsum=BP_kailugaji(data_load, NodeNum, ratio)
% Author:凱魯嘎吉 https://www.cnblogs.com/kailugaji/
% Input:
% data_load: 最后一列真實輸出結果
% NodeNum: 隱層節點個數
% ratio: 訓練集占總體樣本的比率
[Num, ~]=size(data_load);
data=https://www.cnblogs.com/kailugaji/archive/2020/10/18/data_load(:, 1:end-1);
real_label=data_load(:, end);
k=rand(1,Num);
[~,n]=sort(k);
kk=floor(Num*ratio);
%找出訓練資料和預測資料
input_train=data(n(1:kk),:)';
output_train=real_label(n(1:kk))';
input_test=data(n(kk+1:Num),:)';
output_test=real_label(n(kk+1:Num))';
%選連樣本輸入輸出資料歸一化
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);
%% BP網路訓練
% %初始化網路結構
net=newff(inputn, outputn, NodeNum);
net.trainParam.epochs=100; % 最大迭代次數
net.trainParam.lr=0.01; % 步長
net.trainParam.goal=1e-5; % 迭代終止條件
% net.divideFcn = '';
%網路訓練
net=train(net,inputn,outputn);
W1=net.iw{1, 1};
b1=net.b{1};
W2=net.lw{2, 1};
b2=net.b{2};
fun1=net.layers{1}.transferFcn;
fun2=net.layers{2}.transferFcn;
%% BP網路預測
%預測資料歸一化
inputn_test=mapminmax('apply',input_test,inputps);
%網路預測輸出
an=sim(net,inputn_test);
%網路輸出反歸一化
BPoutput=mapminmax('reverse',an,outputps);
%% 結果分析
figure(1)
plot(BPoutput,'-.or')
hold on
plot(output_test,'-*b');
legend('預測輸出','期望輸出')
xlim([1 (Num-kk)]);
title('BP網路預測輸出','fontsize',12)
ylabel('函式輸出','fontsize',12)
xlabel('樣本','fontsize',12)
saveas(gcf,sprintf('BP網路預測輸出.jpg'),'bmp');
%預測誤差
error=BPoutput-output_test;
errorsum=sum(mse(error));
% 保留引數
save BP_parameter W1 b1 W2 b2 fun1 fun2 net
demo.m
clear;clc;close all
data_load=dlmread('housing.data');
NodeNum=20;
ratio=0.95;
errorsum=BP_kailugaji(data_load, NodeNum, ratio);
fprintf('均方誤差為:%f\n', errorsum);
結果
均方誤差為:3.507019

注意:隱層節點個數,激活函式,迭代終止條件等等引數需要根據具體資料進行調整,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/178580.html
標籤:其他
上一篇:19。洗掉鏈表倒數第N個節點
