matlab BP網絡工具箱分類與回歸


一、分類:

1、參考:http://www.cnblogs.com/heaad/archive/2011/03/07/1976443.html

例子:

%讀取訓練數據
[f1,f2,f3,f4,class] = textread('trainData.txt' , '%f%f%f%f%f',150);

%特征值歸一化
[input,minI,maxI] = premnmx( [f1 , f2 , f3 , f4 ]')  ;

%構造輸出矩陣
s = length( class) ;
output = zeros( s , 3  ) ;
for i = 1 : s 
   output( i , class( i )  ) = 1 ;
end

%創建神經網絡
net = newff( minmax(input) , [10 3] , { 'logsig' 'purelin' } , 'traingdx' ) ; 

%設置訓練參數
net.trainparam.show = 50 ;
net.trainparam.epochs = 500 ;
net.trainparam.goal = 0.01 ;
net.trainParam.lr = 0.01 ;

%開始訓練
net = train( net, input , output' ) ; %這里的input矩陣的行表示特征的維度,列代表一個樣本;output'每一列表示一個樣本的標簽。

%讀取測試數據
[t1 t2 t3 t4 c] = textread('testData.txt' , '%f%f%f%f%f',150);

%測試數據歸一化
testInput = tramnmx ( [t1,t2,t3,t4]' , minI, maxI ) ;

%仿真
Y = sim( net , testInput ) 

%統計識別正確率
[s1 , s2] = size( Y ) ;
hitNum = 0 ;
for i = 1 : s2
    [m , Index] = max( Y( : ,  i ) ) ;
    if( Index  == c(i)   ) 
        hitNum = hitNum + 1 ; 
    end
end
sprintf('識別率是 %3.3f%%',100 * hitNum / s2 )

步驟:

1、數據預處理——歸一化 

       在訓練神經網絡前一般需要對數據進行預處理,一種重要的預處理手段是歸一化處理。下面簡要介紹歸一化處理的原理與方法。

(1) 什么是歸一化? 

數據歸一化,就是將數據映射到[0,1]或[-1,1]區間或更小的區間,比如(0.1,0.9) 。

(2) 為什么要歸一化處理? 

<1>輸入數據的單位不一樣,有些數據的范圍可能特別大,導致的結果是神經網絡收斂慢、訓練時間長。

<2>數據范圍大的輸入在模式分類中的作用可能會偏大,而數據范圍小的輸入作用就可能會偏小。

<3>由於神經網絡輸出層的激活函數的值域是有限制的,因此需要將網絡訓練的目標數據映射到激活函數的值域。例如神經網絡的輸出層若采用S形激活函數,由於S形函數的值域限制在(0,1),也就是說神經網絡的輸出只能限制在(0,1),所以訓練數據的輸出就要歸一化到[0,1]區間。

<4>S形激活函數在(0,1)區間以外區域很平緩,區分度太小。例如S形函數f(X)在參數a=1時,f(100)與f(5)只相差0.0067。

(3) 歸一化算法 

  一種簡單而快速的歸一化算法是線性轉換算法。線性轉換算法常見有兩種形式:

       <1>

y = ( x - min )/( max - min )

  其中min為x的最小值,max為x的最大值,輸入向量為x,歸一化后的輸出向量為y 。上式將數據歸一化到 [ 0 , 1 ]區間,當激活函數采用S形函數時(值域為(0,1))時這條式子適用。

       <2>

y = 2 * ( x - min ) / ( max - min ) - 1

       這條公式將數據歸一化到 [ -1 , 1 ] 區間。當激活函數采用雙極S形函數(值域為(-1,1))時這條式子適用。

(4) Matlab數據歸一化處理函數 

  Matlab中歸一化處理數據可以采用premnmx , postmnmx , tramnmx 這3個函數。

<1> premnmx

語法:[pn,minp,maxp,tn,mint,maxt] = premnmx(p,t)

參數:

pn: p矩陣按行歸一化后的矩陣

minp,maxp:p矩陣每一行的最小值,最大值

tn:t矩陣按行歸一化后的矩陣

mint,maxt:t矩陣每一行的最小值,最大值

作用:將矩陣p,t歸一化到[-1,1] ,主要用於歸一化處理訓練數據集。

<2> tramnmx

語法:[pn] = tramnmx(p,minp,maxp)

參數:

minp,maxp:premnmx函數計算的矩陣的最小,最大值

pn:歸一化后的矩陣

作用:主要用於歸一化處理待分類的輸入數據。

<3> postmnmx

語法: [p,t] = postmnmx(pn,minp,maxp,tn,mint,maxt)

參數:

minp,maxp:premnmx函數計算的p矩陣每行的最小值,最大值

mint,maxt:premnmx函數計算的t矩陣每行的最小值,最大值

作用:將矩陣pn,tn映射回歸一化處理前的范圍。postmnmx函數主要用於將神經網絡的輸出結果映射回歸一化前的數據范圍。

2、 

2. 使用Matlab實現神經網絡 

使用Matlab建立前饋神經網絡主要會使用到下面3個函數:

newff :前饋網絡創建函數

train:訓練一個神經網絡

sim :使用網絡進行仿真

 下面簡要介紹這3個函數的用法。

(1) newff函數

<1>newff函數語法 

       newff函數參數列表有很多的可選參數,具體可以參考Matlab的幫助文檔,這里介紹newff函數的一種簡單的形式。

語法:net = newff ( A, B, {C} ,‘trainFun’)

參數:

A:一個n×2的矩陣,第i行元素為輸入信號xi的最小值和最大值;

B:一個k維行向量,其元素為網絡中各層節點數;

C:一個k維字符串行向量,每一分量為對應層神經元的激活函數

trainFun :為學習規則采用的訓練算法

<2>常用的激活函數

a) 線性函數 (Linear transfer function)

                                                                 

  該函數的字符串為’purelin’。

 b) 對數S形轉移函數( Logarithmic sigmoid transfer function )

                                              

    該函數的字符串為’logsig’。

c) 雙曲正切S形函數 (Hyperbolic tangent sigmoid transfer function )

                                                

  也就是上面所提到的雙極S形函數。 

  該函數的字符串為’ tansig’。

  Matlab的安裝目錄下的toolbox\nnet\nnet\nntransfer子目錄中有所有激活函數的定義說明。

<3>常見的訓練函數

    常見的訓練函數有:

traingd :梯度下降BP訓練函數(Gradient descent backpropagation)

traingdx :梯度下降自適應學習率訓練函數

<4>網絡配置參數

一些重要的網絡配置參數如下:

net.trainparam.goal  :神經網絡訓練的目標誤差

net.trainparam.show   : 顯示中間結果的周期

net.trainparam.epochs  :最大迭代次數

net.trainParam.lr    : 學習率

(2) train函數

    網絡訓練學習函數。

語法:[ net, tr, Y1, E ]  = train( net, X, Y )

參數:

X:網絡實際輸入

Y:網絡應有輸出

tr:訓練跟蹤信息

Y1:網絡實際輸出

E:誤差矩陣

(3) sim函數

語法:Y=sim(net,X)

參數:

net:網絡

X:輸入給網絡的K×N矩陣,其中K為網絡輸入個數,N為數據樣本數

Y:輸出矩陣Q×N,其中Q為網絡輸出個數

 

二、擬合

例子:擬合曲線  

程序:

function BPalg()
clear;
%X=-4*pi:0.05:4*pi;
X=1:100;
Y=[];
Y_test=[];
P=length(X);
for i=1:P
    Y(i)=1/X(i)^0.5
    %Y(i)=(sin(X(i))/X(i))^2;
    %Y(i)=exp(-X(i)^2)*sin(X(i)^2);
end
scatter(X,Y,10,'b');
grid on;
hold on;
net=newff(minmax(X),[14,1],{'logsig'  'purelin'},'traingdx'); %一個隱藏層,含有神經元14個
net.trainparam.epochs = 1000;
net.trainparam.goal = 0.0001 ;
net.trainParam.lr = 0.001 ;
net = train(net,X,Y);
for i=1:P
    Y_test(i) = sim(net,X(i));
end
plot(X,Y_test,'r'); 
hold off;

 

這里不需對數據歸一化;

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM