MATLAB實例:BP神經網絡用於迴歸任務

MATLAB實例:BP神經網絡用於迴歸(非線性擬合)任務

做者:凱魯嘎吉 - 博客園 http://www.cnblogs.com/kailugaji/數據庫

問題描述

    給定多元(多維)數據X,有真實結果Y,對這些數據進行擬合(迴歸),獲得擬合函數的參數,進而獲得擬合函數,如今進來一些新樣本,對這些新樣本進行預測出相應地Y值。一般的最小二乘法進行線性擬合併不適用於全部數據,對於大多數數據而言,他們的擬合函數是非線性的,人爲構造擬合函數至關困難,沒有必定的經驗積累很難完美的構造出符合條件的擬合函數。所以神經網絡在這裏被應用來作迴歸(擬合)任務,進一步用來預測。神經網絡是很強大的擬合工具,雖然數學可解釋性差,但擬合效果好,於是獲得普遍應用。BP神經網絡是最基礎的網絡結構,輸入層,隱層,輸出層,三層結構。以下圖所示。網絡

總體的目標函數就是均方偏差app

$L=||f(X)-Y||_{2}^{2}$ide

其中(激活函數能夠自行設定)函數

$f(X)=purelin\left( {{W}_{2}}\cdot \tan sig({{W}_{1}}\cdot X+{{b}_{1}})+{{b}_{2}} \right)$工具

$N$: 輸入數據的個數測試

$D$: 輸入數據的維度spa

${{D}_{1}}$: 隱層節點的個數blog

$X$: 輸入數據($D$*$N$)ci

$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=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

注意:隱層節點個數,激活函數,迭代終止條件等等參數須要根據具體數據進行調整。

相關文章
相關標籤/搜索